2016-05-03 15 views
0

私は渡されたウェブサイトのリンクをクロールするスパイダーを持っています。別のデータセットでその実行が終了したら、同じスパイダーを再開したい。もう一度同じクローラを再起動するには?ウェブサイトはデータベースを通過します。すべてのWebサイトがクロールされるまで無制限のループでクローラを実行したい。現在、私は常にクローラscrapy crawl firstを起動する必要があります。クローラを一度起動する方法はありますか?すべてのWebサイトがクロールされると停止しますか?同じスパイダーをプログラムで呼び出す

私は同じことを検索し、クローズ/完了したクローラを処理するソリューションを見つけました。しかし、スパイダーをプログラムでclosed_handlerメソッドと呼ぶ方法はわかりません。

次は私のコードです:

class MySpider(CrawlSpider): 
     def __init__(self, *args, **kwargs): 
      super(MySpider, self).__init__(*args, **kwargs) 
      SignalManager(dispatcher.Any).connect(
       self.closed_handler, signal=signals.spider_closed) 

     def closed_handler(self, spider): 
      reactor.stop() 
      settings = Settings() 
      crawler = Crawler(settings) 
      crawler.signals.connect(spider.spider_closing, signal=signals.spider_closed) 
      crawler.configure() 
      crawler.crawl(MySpider()) 
      crawler.start() 
      reactor.run() 

     # code for getting the websites from the database 
     name = "first" 
     def parse_url(self, response): 
      ... 

私はエラーを取得しています:

Error caught on signal handler: <bound method ?.closed_handler of <MySpider 'first' at 0x40f8c70>> 

Traceback (most recent call last): 
    File "c:\python27\lib\site-packages\twisted\internet\defer.py", line 150, in maybeDeferred 
    result = f(*args, **kw) 
    File "c:\python27\lib\site-packages\scrapy\xlib\pydispatch\robustapply.py", line 57, in robustApply 
    return receiver(*arguments, **named) 
    File "G:\Scrapy\web_link_crawler\web_link_crawler\spiders\first.py", line 72, in closed_handler 
    crawler = Crawler(settings) 
    File "c:\python27\lib\site-packages\scrapy\crawler.py", line 32, in __init__ 
    self.spidercls.update_settings(self.settings) 
AttributeError: 'Settings' object has no attribute 'update_settings' 

が、これはこれを成し遂げるための正しい方法ですか?それとも他の方法がありますか?助けてください!

+1

[Scrapyドキュメントには複数のスパイダーをスクリプトで実行するセクションがあります](http://doc.scrapy.org/en/latest/topics/practices.html#running-multiple-spiders-in-the-same-プロセス)、そして最後に、スパイダーを連続的に走らせる方法の例があります_ _ "遅れを連鎖させてスパイダーを連続的に走らせる" _ –

答えて

1

それはあなたがデータベースからリンクを選択し、新しいスクリプトを作成し、ファイルに保存されます行い、その後、このよう

os.system("scrapy crawl first") 

scrapyスクリプトを呼び出すための別の方法をありがとうございましたファイルからあなたのクモにリンクをロードし、そこから作業してください。

新しいリンクについてデータベースを絶えずチェックしたい場合は、最初のスクリプトで無限ループでデータベースを呼び出すだけで、新しいリンクがあるたびにscrapyコールを作成してください!

+0

ありがとうラファエル・アルメイダ.. :) これは実際に私の仕事でした。 新しいpythonファイルを作成し、次のコードを入力してください: import os 真: os.system( "scrapy crawl first") –

関連する問題