2012-03-13 4 views
21

ウェブページのクロールにscrapyを使用したいと思います。端末自体から開始URLを渡す方法はありますか?クロールのための治療にURLを指定するにはどうすればよいですか?

クモの名前またはURLのいずれかを指定することができますが、私は、URLが与えられたとき、それはエラーをスローすることをdocumentationに与えられている:私のクモの

//名前は一例ですが、私私のクモの名前の代わりにURLをつけています(クモの名前をつけるとうまくいきます)。

scrapy crawl example.com

ERROR:

File "/usr/local/lib/python2.7/dist-packages/Scrapy-0.14.1-py2.7.egg/scrapy/spidermanager.py", line 43, in create raise KeyError("Spider not found: %s" % spider_name) KeyError: 'Spider not found: example.com'

は、どのように私はscrapyは、端末に与えられたURLに私のクモを使用することができます?

+0

example.comはスパイダーのallowed_domainsに追加されていますか? –

+0

yes example.comがallowed_domainsに追加されます。私が本当に望むのは、コマンドラインからstart_urlを与えることです。どうすればいい? –

答えて

43

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

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"

+0

ありがとう、これは私が探していたものです。それは私のために正常に働いた:) –

+0

このアプローチは、ちょうど1つのURLのためにのみ動作します。複数のURLを提供したい場合は、このスレッドで[私のアプローチ](http://stackoverflow.com/a/12749782/1125413)を参照してください。 – pemistahl

+1

複数のURLの場合: 'self.start_urls = kwargs.pop( 'start_urls')。split( '、')'はsuper *の前で実行されます。 –

3

使用scrapy解析コマンド。あなたはあなたのクモとURLを解析することができます。 urlはコマンドから渡されます。

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

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

+0

残念ながら、scrapyの解析はscrapyクロールのように(様々なフォーマットで)ファイルに結果を保存するためのオプションを持っていないようです、あなたのクモがこれに失敗して、特定のURLが簡単にオプションである理由だけでデバッグするために探している場合 – dan3

+0

を行います。 – jeffjv

+0

ファイルに簡単に保存/エクスポートできません。さもなければ、これは完全だったでしょう。 'scrapyクロールMySpider -a start_urls =のhttp:私はこのようなscrapy 0.24.4を呼び出す場合 – Citricguy

3

これは、このスレッドでthe approach given by Sjaak Trekhaakに拡張したものです。これまでのアプローチは、あなたがちょうど1つのURLを提供する場合にのみ機能します。

:以下の例外を除いて終了します(私は現在の安定バージョン0.14.4を使用しています)

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

その後、Scrapy:たとえば、あなたは、例えば、次のように複数のURLを提供する場合

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にラップし、コマンドライン引数をループなどで生成することは理にかなっています。

希望します。:)

+0

//example.com/ -o - -t json' すべてがうまくいきます。 最初に私はオプションを-oと - の間に置き、あなたと同じエラーになります。 –

10

アンピーターが示唆されたものより、複数のurl-引数を許可するにも簡単な方法は、このように、カンマで区切られたURLの文字列としてそれらを与えることである:

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

クモはあなたでしょう単に「」で文字列を分割し、URLの配列を取得:

self.start_urls = kwargs.get('start_urls').split(',') 
3

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) 
0

また、これを試すことができます。

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

これは、要求されたURLのブラウザでウィンドウを開きます。

関連する問題