特定の場合に条件が真の場合にクロールを停止する可能性はありますか (scrap_item_id == predefine_value など)。私の問題はScrapyに似ています-すでにスクレイピングされたURLを特定する方法ですが、最後にスクレイピングされたアイテムを発見した後、スクレイピースパイダーにクロールを停止させたい.
4 に答える
GitHub で入手可能な最新バージョンの Scrapy では、CloseSpider 例外を発生させてスパイダーを手動で閉じることができます。
0.14のリリース ノート ドキュメントには次のように記載されています。
ドキュメントによる例:
def parse_page(self, response):
if 'Bandwidth exceeded' in response.body:
raise CloseSpider('bandwidth_exceeded')
参照: http://readthedocs.org/docs/scrapy/en/latest/topics/exceptions.html?highlight=closeSpider
この質問は 8 か月前に尋ねられましたが、同じことを考えていて、別の (あまり良くない) 解決策を見つけました。うまくいけば、これは将来の読者に役立つでしょう。
Pipeline ファイルでデータベースに接続しています。データベース接続が失敗した場合、Spider がクロールを停止するようにしました (データを送信する場所がない場合、データを収集しても意味がありません)。私がやったのは、次のものを使用することでした:
from scrapy.project import crawler
crawler._signal_shutdown(9,0) #Run this if the cnxn fails.
これにより、Spider は次のことを行います。
[scrapy] INFO: Received SIGKILL, shutting down gracefully. Send again to force unclean shutdown.
あなたのコメントを読み、「/usr/local/lib/python2.7/dist-packages/Scrapy-0.12.0.2543-py2.7.egg/scrapy/crawler.py」ファイルを調べた後、これをつなぎ合わせました. 関数に渡される最初の数字はシグネームです (たとえば、9,0 の代わりに 3,0 を使用するとエラーが返されます)。[scrapy] INFO: Received SIGKILL...
しかし、十分に機能しているようです。ハッピースクレイピング。
編集:また、次のような方法でプログラムを強制的にシャットダウンすることもできると思います:
import sys
sys.exit("SHUT DOWN EVERYTHING!")
パイプラインから、次のソリューションを好みます。
class MongoDBPipeline(object):
def process_item(self, item, spider):
spider.crawler.engine.close_spider(self, reason='duplicate')
多くのオプションを試しましたが、何も機能しません。この汚いハックは、Linux のトリックを行います。
os.kill(os.getpid(), signal.SIGINT)
os.kill(os.getpid(), signal.SIGINT)
これにより、SIGINT シグナルが 2 回、scrapy に送信されます。2 番目のシグナルで強制シャットダウン