シグナル¶
Scrapyは、特定のイベントが発生したときに通知するためにシグナルを広範囲に使用します。 Scrapyプロジェクトでこれらのシグナルの一部をキャッチして(たとえば 拡張機能 で)、追加のタスクを実行したり、Scrapyを拡張してすぐに使用できない機能を追加したりできます。
シグナルはいくつかの引数を提供しますが、それらをキャッチするハンドラーはそれらのすべてを受け入れる必要はありません。シグナル・ディスパッチ・メカニズムはハンドラーが受け取る引数のみを配信します。
あなたは シグナルAPI を介してシグナルに接続(または独自に送信)できます。
シグナルをキャッチして何らかのアクションを実行する方法を示す簡単な例を次に示します:
from scrapy import signals
from scrapy import Spider
class DmozSpider(Spider):
name = "dmoz"
allowed_domains = ["dmoz.org"]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/",
]
@classmethod
def from_crawler(cls, crawler, *args, **kwargs):
spider = super(DmozSpider, cls).from_crawler(crawler, *args, **kwargs)
crawler.signals.connect(spider.spider_closed, signal=signals.spider_closed)
return spider
def spider_closed(self, spider):
spider.logger.info('Spider closed: %s', spider.name)
def parse(self, response):
pass
シグナル・ハンドラーの遅延(deferred)¶
いくつかのシグナルは、ハンドラーから Twisted deferreds を返すことをサポートしています。それがどのシグナルか知るには、以下の 組み込みシグナル・リファレンス を参照してください。
組み込みシグナル・リファレンス¶
Scrapy組み込みシグナルとその意味のリストを以下に示します。
engine_started¶
-
scrapy.signals.
engine_started
()¶ Scrapyエンジンがクロールを開始すると送信されます。
このシグナルは、ハンドラーから遅延オブジェクト(deferred)を返すことをサポートしています。
注釈
このシグナルは、スパイダーの起動方法に応じて、 spider_opened
シグナルの 後に 起動される場合があります。 そのため、 spider_opened
の前にこのシグナルが発生することに依存しないでください。
engine_stopped¶
-
scrapy.signals.
engine_stopped
()¶ Scrapyエンジンが停止(stop)したときに送信されます(たとえば、クロール・プロセスが終了したとき)。
このシグナルは、ハンドラーから遅延オブジェクト(deferred)を返すことをサポートしています。
item_scraped¶
-
scrapy.signals.
item_scraped
(item, response, spider)¶ すべての アイテム・パイプライン ステージを(ドロップされることなく)通過した後、アイテムがスクレイプされたときに送信されます。
このシグナルは、ハンドラーから遅延オブジェクト(deferred)を返すことをサポートしています。
item_dropped¶
-
scrapy.signals.
item_dropped
(item, response, exception, spider)¶ あるステージで
DropItem
例外が発生したときに、アイテムが アイテム・パイプライン からドロップされた後に送信されます。このシグナルは、ハンドラーから遅延オブジェクト(deferred)を返すことをサポートしています。
item_error¶
-
scrapy.signals.
item_error
(item, response, spider, failure)¶ DropItem
例外を除き、 アイテム・パイプライン がエラーを生成した(つまり、例外を発生させた)ときに送信されます。このシグナルは、ハンドラーから遅延オブジェクト(deferred)を返すことをサポートしています。
spider_closed¶
-
scrapy.signals.
spider_closed
(spider, reason)¶ スパイダーが閉じられた後に送信されます。 これは、
spider_opened
で予約しているスパイダーごとのリソースを解放するために使用できます。このシグナルは、ハンドラーから遅延オブジェクト(deferred)を返すことをサポートしています。
- パラメータ
spider_opened¶
spider_idle¶
-
scrapy.signals.
spider_idle
(spider)¶ スパイダーがアイドル状態になったときに送信されます。つまり、スパイダーはそれ以降何もしない事を意味します:
リクエストがダウンロード待ち
リクエストがスケジュールされた
アイテムがアイテム・パイプラインで処理中
このシグナルのすべてのハンドラーが終了した後もアイドル状態が続く場合、エンジンはスパイダーを閉じ始めます。スパイダーのクローズが完了すると、
spider_closed
シグナルが送信されます。あなたは
DontCloseSpider
例外を発生させて、スパイダーが閉じられないようにすることができます。このシグナルは、ハンドラーから遅延オブジェクト(deferred)を返すことをサポートしていません。
- パラメータ
spider (
Spider
object) -- アイドルに移行したスパイダー
注釈
あなたの spider_idle
ハンドラーでいくつかのリクエストをスケジュールすると、スパイダーが閉じられるのを防ぐことができるという保証はありませんが、できる場合もあります。これは、スケジュールされたすべてのリクエストがスケジューラによって拒否された場合(たとえば、重複のためにフィルター処理された場合)、スパイダーがアイドル状態のままになる可能性があるためです。
spider_error¶
-
scrapy.signals.
spider_error
(failure, response, spider)¶ スパイダー・コールバックがエラーを生成する(つまり、例外を発生させる)ときに送信されます。
このシグナルは、ハンドラーから遅延オブジェクト(deferred)を返すことをサポートしていません。