シグナル

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 (dict or Item object) -- スクレイプされたアイテム

  • spider (Spider object) -- アイテムをスクレイプしたスパイダー

  • response (Response object) -- アイテムがスクレイピングされたレスポンス

item_dropped

scrapy.signals.item_dropped(item, response, exception, spider)

あるステージで DropItem 例外が発生したときに、アイテムが アイテム・パイプライン からドロップされた後に送信されます。

このシグナルは、ハンドラーから遅延オブジェクト(deferred)を返すことをサポートしています。

パラメータ
  • item (dict or Item object) -- アイテム・パイプライン からドロップされたアイテム

  • spider (Spider object) -- アイテムをスクレイプしたスパイダー

  • response (Response object) -- アイテムがドロップされたレスポンス

  • exception (DropItem exception) -- アイテムがドロップされる原因となった例外( DropItem のサブクラスでなければなりません)

item_error

scrapy.signals.item_error(item, response, spider, failure)

DropItem 例外を除き、 アイテム・パイプライン がエラーを生成した(つまり、例外を発生させた)ときに送信されます。

このシグナルは、ハンドラーから遅延オブジェクト(deferred)を返すことをサポートしています。

パラメータ
  • item (dict or Item object) -- アイテム・パイプライン からドロップされたアイテム

  • response (Response object) -- 例外が発生したときに処理されていたレスポンス

  • spider (Spider object) -- 例外を発生させたスパイダー

  • failure (Failure object) -- Twisted Failure オブジェクトとして発生した例外

spider_closed

scrapy.signals.spider_closed(spider, reason)

スパイダーが閉じられた後に送信されます。 これは、 spider_opened で予約しているスパイダーごとのリソースを解放するために使用できます。

このシグナルは、ハンドラーから遅延オブジェクト(deferred)を返すことをサポートしています。

パラメータ
  • spider (Spider object) -- スパイダーがクローズされた

  • reason (str) -- スパイダーが閉じられた理由を説明する文字列。 スパイダーがスクレイピングを完了したために閉じられた場合、その理由は 'finished' です。そうでなければ、 close_spider エンジン・メソッドを呼び出してスパイダーを手動で閉じた場合、その理由はそのメソッドの reason 数に渡されたものが使われます(デフォルトは 'cancelled' です)。エンジンがシャットダウン(たとえば、Ctrl-Cを押してエンジンを停止)された場合、理由は 'shutdown' です。

spider_opened

scrapy.signals.spider_opened(spider)

クロールのためにスパイダーがオープンされた後に送信されます。これは通常、スパイダーごとのリソースを予約するために使用されますが、スパイダーが開かれたときに実行する必要があるタスクに使用できます。

このシグナルは、ハンドラーから遅延オブジェクト(deferred)を返すことをサポートしています。

パラメータ

spider (Spider object) -- スパイダーがオープンされた

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)を返すことをサポートしていません。

パラメータ
  • failure (Failure object) -- Twisted Failure オブジェクトとして発生した例外

  • response (Response object) -- 例外が発生したときに処理されていたレスポンス

  • spider (Spider object) -- 例外を発生させたスパイダー

request_scheduled

scrapy.signals.request_scheduled(request, spider)

エンジンが Request をスケジュールしたときに送信され、後でダウンロードされます。

シグナルは、ハンドラーから遅延オブジェクト(deferred)を返すことをサポートしていません。

パラメータ
  • request (Request object) -- リクエストはスケジューラに到達した

  • spider (Spider object) -- スパイダーはリクエストを生成(yield)した

request_dropped

scrapy.signals.request_dropped(request, spider)

後でダウンロードされるようにエンジンによってスケジュールされた Request がスケジューラーによって拒否されたときに送信されます。

シグナルは、ハンドラーから遅延オブジェクト(deferred)を返すことをサポートしていません。

パラメータ
  • request (Request object) -- リクエストはスケジューラに到達した

  • spider (Spider object) -- スパイダーはリクエストを生成(yield)した

request_reached_downloader

scrapy.signals.request_reached_downloader(request, spider)

Request がダウンローダーに到達すると送信されます。

シグナルは、ハンドラーから遅延オブジェクト(deferred)を返すことをサポートしていません。

パラメータ
  • request (Request object) -- リクエストはダウンローダーに到達した

  • spider (Spider object) -- スパイダーはリクエストを生成(yield)した

response_received

scrapy.signals.response_received(response, request, spider)

エンジンがダウンローダーから新しい Response を受信すると送信されます。

このシグナルは、ハンドラーから遅延オブジェクト(deferred)を返すことをサポートしていません。

パラメータ
  • response (Response object) -- レスポンスを受信した

  • request (Request object) -- レスポンスを生成したリクエスト

  • spider (Spider object) -- そのレスポンスを意図したスパイダー

response_downloaded

scrapy.signals.response_downloaded(response, request, spider)

HTTPResponse がダウンロードされた直後に、ダウンローダーによって送信されます。

このシグナルは、ハンドラーから遅延オブジェクト(deferred)を返すことをサポートしていません。

パラメータ
  • response (Response object) -- レスポンスがダウンロードされた

  • request (Request object) -- レスポンスを生成したリクエスト

  • spider (Spider object) -- そのレスポンスを意図したスパイダー