スパイダーミドルウェア

スパイダーミドルウェアは, Scrapyのスパイダー処理機構へのフックのフレームワークで, スパイダーに送信された応答を処理し, スパイダー から生成されたリクエストとアイテムを処理するカスタム機能をプラグインできます.

スパイダーミドルウェアの有効化

スパイダーミドルウェアコンポーネントをアクティブにするには, SPIDER_MIDDLEWARES 設定に追加します. これは, キーがミドルウェアクラスのパスであり, その値がミドルウェアオーダーです.

例:

SPIDER_MIDDLEWARES = {
    'myproject.middlewares.CustomSpiderMiddleware': 543,
}

SPIDER_MIDDLEWARES 設定は, Scrapyで定義された SPIDER_MIDDLEWARES_BASE 設定にマージされます(上書きされるという意味ではありません). 次に, 使用可能なミドルウェアの最終的なリストを取得するために, 並べ替えられます. 値の小さいミドルウェアはエンジンに近いもので,  大きいものはスパイダーに近いです. 言い換えれば, process_spider_input() メソッドは, ミドルウェアの順番が増加する (100, 200, 300, ...), ように呼び出され, 各ミドルウェアの process_spider_output() メソッドが降順で呼び出されます.

ミドルウェアに割り当てる順序を決定するには, SPIDER_MIDDLEWARES_BASE 設定を参照し, ミドルウェアを挿入する場所に応じて値を選択します. 各ミドルウェアが異なるアクションを実行し, ミドルウェアが適用されている以前の (または後続の)ミドルウェアに依存する可能性があるため, 順序は重要です.

組み込みミドルウェア ( SPIDER_MIDDLEWARES_BASE で定義され, デフォルトで有効になっているもの) を無効にするには, プロジェクトの SPIDER_MIDDLEWARES 設定で定義し, その値にNoneを割り当てる必要があります. たとえば, off-site ミドルウェアを無効にする場合は:

SPIDER_MIDDLEWARES = {
    'myproject.middlewares.CustomSpiderMiddleware': 543,
    'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': None,
}

最後に, 特定の設定によっていくつかのミドルウェアを有効にする必要があるかもしれないことに留意してください. 詳細は各ミドルウェアのドキュメントを参照してください.

独自のスパイダーミドルウェアの作成

各ミドルウェアコンポーネントは, 以下のメソッドの1つ以上を定義する Python クラスです:

class scrapy.spidermiddlewares.SpiderMiddleware
process_spider_input(response, spider)

このメソッドは, 処理のためにスパイダーミドルウェアを経由してスパイダーに入る各レスポンスに対して呼び出されます.

process_spider_input() は必ず None を返すか, または例外を発生させなければいけません.

None を返すと, Scrapy はこのレスポンスの処理を続行し, 最終的にレスポンスが処理のためにスパイダーに渡されるまで他のすべてのミドルウェアを実行します.

例外が発生した場合, Scrapy は他のミドルウェアの process_spider_input() メソッド呼び出しを無視して errback リクエストを呼び出します. errback の出力は, process_spider_output() で処理されるか, エラーが発生した場合は process_spider_exception() メソッドにチェーンされて戻ります.

パラメータ:
  • response (Response オブジェクト) – 処理されているレスポンス
  • spider (Spider オブジェクト) – このレスポンスを処理しているスパイダー
process_spider_output(response, result, spider)

このメソッドは, レスポンスを処理した後にスパイダーから返された結果にたいして呼び出されます.

process_spider_output() は必ずイテラブルな Request, dict または Item オブジェクトのいずれかを返す必要があります.

パラメータ:
  • response (Response オブジェクト) – スパイダーによって出力されたレスポンス
  • result (イテラブルな Request, dict または Item オブジェクト) – スパイダーによって返された結果
  • spider (Spider オブジェクト) – 結果が処理されているスパイダー
process_spider_exception(response, exception, spider)

このメソッドは, スパイダーまたは process_spider_input() メソッド (他のスパイダーミドルウェアのもの) が例外を発生させたときに呼び出されます.

process_spider_exception()None , イテラブルな Response, dict または Item オブジェクトを返さなければいけません.

None を返すと, Scrapy は, ミドルウェアコンポーネントが残っていない, かつ例外がエンジンに到達するまで, この例外の処理を続け, 次のミドルウェアコンポーネントで process_spider_exception() を実行します.

イテラブルを返すと process_spider_output() パイプラインが起動し, ほかの process_spider_exception() は呼び出されません.

パラメータ:
  • response (Response オブジェクト) – 例外が発生したときに処理されるレスポンス
  • exception (Exception オブジェクト) – 発生した例外
  • spider (Spider オブジェクト) – 例外が発生したスパイダー
process_start_requests(start_requests, spider)

バージョン 0.15 で追加.

このメソッドはスパイダーの開始要求とともに呼び出され, process_spider_output() メソッドと同様に動作します. ただし, レスポンスが関連付けられておらず, リクエスト(項目ではない)のみを返さなければなりません.

イテラブル ( start_requests パラメーター無い) を受取り, イテラブルな Request オブジェを返さなければいけません.

注釈

このメソッドをスパイダー・ミドルウェアに実装する場合は, 常にiterableを返し, start_requests をすべて消費しないようにする必要があります. 非常に大きい(または制限なし)ことがあり, メモリーがオーバーフローする可能性があるからです. Scrapy エンジンは, 開始要求を処理する能力を持っている間に開始要求を引き出すように設計されているため, 開始要求イテレータは, スパイダーを停止するためのその他の条件(時間制限や項目/ページ数など)がある場合には効果的に無限になります.

パラメータ:
  • start_requests (イテラブルな Request) – スタートリクエスト
  • spider (Spider オブジェクト) – スタートリクエストが属するスパイダー

ビルトインスパイダーミドルウェアリファレンス

このページでは, Scrapyに付属するすべてのスパイダーミドルウェアコンポーネントについて説明します. それらの使用方法と独自のスパイダーミドルウェアの作成方法については, スパイダーミドルウェア使用方法ガイド を参照してください.

デフォルトで有効になっているコンポーネントの一覧(およびそのオーダー)については, SPIDER_MIDDLEWARES_BASE 設定を参照してください.

DepthMiddleware

class scrapy.spidermiddlewares.depth.DepthMiddleware

DepthMiddleware は, スクレイプされているサイト内の各リクエストの深さを追跡するために使用されるスクレイプミドルウェアです. これは, スクレイピングなのどの最大深さを制限するために使用することができます.

DepthMiddleware は以下の設定で設定することができます(詳細については各設定を参照してください):

  • DEPTH_LIMIT - クロールできる最大の深さ. ゼロの場合, 制限は課されません.
  • DEPTH_STATS - 深度統計を収集するかどうか.
  • DEPTH_PRIORITY - リクエストを深さに基づいて優先順位付けするかどうか.

HttpErrorMiddleware

class scrapy.spidermiddlewares.httperror.HttpErrorMiddleware

スパイダーが対処する必要がないように, 失敗した(誤った)HTTP レスポンスを除外します. ほとんどの場合, オーバーヘッドがかかり, より多くのリソースを消費し, スパイダーロジックがより複雑になります.

HTTP standard によれば, 成功したレスポンスは, ステータスコードが200〜300の範囲にあるものです.

その範囲外のレスポンスコードを処理したい場合は, handle_httpstatus_list 属性または HTTPERROR_ALLOWED_CODES 設定を使用して, スパイダーが処理できるレスポンスコードを指定できます.

たとえば, スパイダーが 404 レスポンスを処理するようにするには, 以下のようにします:

class MySpider(CrawlSpider):
    handle_httpstatus_list = [404]

Request.metahandle_httpstatus_list キーを使用して, リクエストごとに許可するレスポンスコードを指定することもできます. リクエストにすべてのレスポンスコードを許可させる場合は, meta キー handle_httpstatus_allTrue に設定することもできます.

しかし, あなた自身が何を行いたいかを本当に理解していない限り, 200以外の回答をむやみに処理することは, 通常は悪い考えです.

詳細については, HTTP Status Code Definitions を参照してください.

HttpErrorMiddleware 設定

HTTPERROR_ALLOWED_CODES

Default: []

このリストに含まれる200以外のステータスコードを含むすべての応答を渡します.

HTTPERROR_ALLOW_ALL

Default: False

ステータスコードに関係なくすべての応答を渡します.

OffsiteMiddleware

class scrapy.spidermiddlewares.offsite.OffsiteMiddleware

スパイダーがカバーするドメイン外のURLに対するリクエストをフィルタリングします.

このミドルウェアは, スパイダーの allowed_domains 属性にないホスト名を持つすべてのリクエストをフィルタリングします. リスト内の任意のドメインのすべてのサブドメインも許可されます. 例えば, ルールに www.example.org が指定されている場合でも bob.www.example.org は許可されますが, www2.example.com や example.com は許可されません.

スパイダーが許可されていないドメインのリクエストを返すと, このミドルウェアはこのようなデバッグメッセージを記録します:

DEBUG: Filtered offsite request to 'www.othersite.com': <GET http://www.othersite.com/some/page.html>

あまりにも多くのノイズをログに書き込まないようにするため, フィルタリングされた新しいドメインごとにこれらのメッセージの1つのみを出力します. たとえば, www.othersite.com の別のリクエストがフィルタリングされた場合, ログメッセージは出力されません. しかし, someothersite.com のリクエストがフィルタリングされると, メッセージが出力されます(最初のリクエストがフィルタリングされた場合のみ).

スパイダーが allowed_domains 属性を定義していないか, 属性が空の場合, オフサイトミドルウェアはすべてのリクエストを許可します.

リクエストに dont_filter 属性が設定されている場合, オフサイトミドルウェアはドメインが許可リストになくてもリクエストを許可します.

RefererMiddleware

class scrapy.spidermiddlewares.referer.RefererMiddleware

リクエストの Referer ヘッダーに, レスポンスのURLに基づいてヘッダーを挿入します.

RefererMiddleware 設定

REFERER_ENABLED

バージョン 0.15 で追加.

デフォルト: True

リファラーミドルウェアを有効にするかどうか.

UrlLengthMiddleware

class scrapy.spidermiddlewares.urllength.UrlLengthMiddleware

URL が URLLENGTH_LIMIT より長い場合, リクエストをフィルタリングします

The UrlLengthMiddleware は, 以下の設定によって構成することができます(詳細については, 設定ドキュメントを参照してください):

  • URLLENGTH_LIMIT - クロールするURLで許可されるURLの最大長.