web-dev-qa-db-ja.com

クロールのためにスクレイピーにURLを与える方法は?

Webページのクロールにスクレイピーを使用したい。端末自体から開始URLを渡す方法はありますか?

documentation で、スパイダーの名前またはURLのいずれかを指定できることが示されていますが、URLを指定するとエラーがスローされます。

//スパイダーの名前は例ですが、スパイダー名の代わりにURLを指定しています(スパイダー名を指定すると問題なく動作します)。

こわいクロールexample.com

エラー:

ファイル「/usr/local/lib/python2.7/dist-packages/Scrapy-0.14.1-py2.7.Egg/scrapy/spidermanager.py」の43行目、create raise KeyError( "Spider not found:% s "%spider_name)KeyError: 'Spider not found:example.com'

ターミナルで指定されたURLでスパイダーを使用できるようにするには、どうすればいいですか?

27
G Gill

コマンドラインオプションについて本当にわかりません。しかし、あなたはこのようにあなたのクモを書くことができました。

class MySpider(BaseSpider):

    name = 'my_spider'    

    def __init__(self, *args, **kwargs): 
      super(MySpider, self).__init__(*args, **kwargs) 

      self.start_urls = [kwargs.get('start_url')] 

次のように開始します:scrapy crawl my_spider -a start_url="http://some_url"

51
Sjaak Trekhaak

Peterの提案よりも複数のURL引数を許可するさらに簡単な方法は、次のように、URLをコンマで区切った文字列として指定することです。

-a start_urls="http://example1.com,http://example2.com"

スパイダーでは、文字列を「、」で分割し、URLの配列を取得します。

self.start_urls = kwargs.get('start_urls').split(',')
12
glindste

Scrapy parseコマンドを使用します。クモでURLを解析できます。 URLはコマンドから渡されます。

$ scrapy parse http://www.example.com/ --spider=spider-name

http://doc.scrapy.org/en/latest/topics/commands.html#parse

4
Subhash

Sjaak Trekhaakは正しい考えを持っています。ここでは、複数を許可する方法を示します。

class MySpider(scrapy.Spider):
    """
    This spider will try to crawl whatever is passed in `start_urls` which
    should be a comma-separated string of fully qualified URIs.

    Example: start_urls=http://localhost,http://example.com
    """
    def __init__(self, name=None, **kwargs):
        if 'start_urls' in kwargs:
            self.start_urls = kwargs.pop('start_urls').split(',')
        super(Spider, self).__init__(name, **kwargs)
3
Steven Almeroth

これは、このスレッドの Sjaak Trekhaakによるアプローチ の拡張機能です。これまでのアプローチは、URLを1つだけ指定した場合にのみ機能します。たとえば、次のように複数のURLを提供する場合は、たとえば次のようにします。

-a start_url=http://url1.com,http://url2.com

その後、Scrapy(現在の安定バージョン0.14.4を使用しています)は次の例外で終了します。

error: running 'scrapy crawl' with more than one spider is no longer supported

ただし、渡されたURLの数を保持する引数とともに、開始URLごとに異なる変数を選択することで、この問題を回避できます。このようなもの:

-a start_url1=http://url1.com 
-a start_url2=http://url2.com 
-a urls_num=2

その後、スパイダーで以下を実行できます。

class MySpider(BaseSpider):

    name = 'my_spider'    

    def __init__(self, *args, **kwargs): 
        super(MySpider, self).__init__(*args, **kwargs) 

        urls_num = int(kwargs.get('urls_num'))

        start_urls = []
        for i in xrange(1, urls_num):
            start_urls.append(kwargs.get('start_url{0}'.format(i)))

        self.start_urls = start_urls

これはやや醜いハックですが、動作します。もちろん、各URLのすべてのコマンドライン引数を明示的に書き留めるのは面倒です。したがって、scrapy crawlコマンドをPython subprocess でラップし、ループまたは何かでコマンドライン引数を生成することは理にかなっています。

それが役に立てば幸い。 :)

3
pemistahl

これを試すこともできます:

>>> scrapy view http://www.sitename.com

リクエストされたURLのブラウザでウィンドウを開きます。

0
Mayur Koshti