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でスパイダーを使用できるようにするには、どうすればいいですか?
コマンドラインオプションについて本当にわかりません。しかし、あなたはこのようにあなたのクモを書くことができました。
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"
Peterの提案よりも複数のURL引数を許可するさらに簡単な方法は、次のように、URLをコンマで区切った文字列として指定することです。
-a start_urls="http://example1.com,http://example2.com"
スパイダーでは、文字列を「、」で分割し、URLの配列を取得します。
self.start_urls = kwargs.get('start_urls').split(',')
Scrapy parseコマンドを使用します。クモでURLを解析できます。 URLはコマンドから渡されます。
$ scrapy parse http://www.example.com/ --spider=spider-name
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)
これは、このスレッドの 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 でラップし、ループまたは何かでコマンドライン引数を生成することは理にかなっています。
それが役に立てば幸い。 :)
これを試すこともできます:
>>> scrapy view http://www.sitename.com
リクエストされたURLのブラウザでウィンドウを開きます。