web-dev-qa-db-ja.com

スクレイピースパイダーにクロールを停止させる

特定のif条件が真の場合(scrap_item_id == predefine_valueなど)、クロールを停止する機会はありますか?私の問題は Scrapy-既に削られたURLを特定する方法 に似ていますが、最後の削られたアイテムを見つけた後、スクレイピースパイダーにクロールを強制的に停止させたいです。

32
no1

GitHubで入手できる最新バージョンのScrapyでは、CloseSpider例外を発生させて手動でスパイダーを閉じることができます。

.14リリースノートのドキュメント に記載されています:「スパイダーを手動で閉じるためのCloseSpider例外を追加しました(r2691)」

ドキュメントごとの例:

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

33
Sjaak Trekhaak

この質問は8か月前に尋ねられましたが、私は同じことを考えていて、別の(素晴らしいとは言えない)解決策を見つけました。うまくいけば、これは将来の読者を助けることができます。

Pipelineファイルでデータベースに接続していますが、データベース接続に失敗した場合は、Spiderのクロールを停止する必要がありました(送信先がない場合、データを収集しても意味がありません)。私がやったことは次のものを使っていた:

from scrapy.project import crawler
crawler._signal_shutdown(9,0) #Run this if the cnxn fails.

これにより、スパイダーは次のことを行います。

[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!")
8
alukach

パイプラインから、私は次の解決策を好みます。

class MongoDBPipeline(object):

def process_item(self, item, spider):
    spider.crawler.engine.close_spider(self, reason='duplicate')

ソース: スパイダーをスクレイピーで強制停止

0
Macbric