アーキテクチャ概観

この文書では、Scrapyのアーキテクチャとそのコンポーネントの相互作用について説明します。

概観

以下の図は、Scrapyアーキテクチャの概要とそのコンポーネント、およびシステム内で発生するデータフローの概要(赤い矢印で表示)を示しています。コンポーネントの簡単な説明と、それらの詳細情報へのリンクを以下に示します。データフローについても以下で説明します。

データ・フロー

Scrapy architecture

Scrapyのデータ・フローは実行エンジンによって制御され、次のようになります:

  1. Scrapyエンジン は、 スパイダー からクロールする最初のリクエストを取得します。

  2. Scrapyエンジン は、 スケジューラ でリクエストをスケジュールし、クロールする次のリクエストを求めます。

  3. スケジューラ は、次のリクエストを Scrapyエンジン に返します。

  4. Scrapyエンジン は、 ダウンローダー にリクエストを送信し、 ダウンローダー・ミドルウェア を通過します( process_request() 参照)。

  5. ページのダウンロードが完了すると、 ダウンローダー は(そのページの)レスポンスを生成し、Scrapyエンジンに送信し、 ダウンローダー・ミドルウェア を通過します( process_response() 参照)。

  6. Scrapyエンジンダウンローダー からResponseを受け取り、それを スパイダー に送信して処理し、 スパイダー・ミドルウェア を通過します( see process_spider_input() )。

  7. スパイダー はレスポンスを処理し、スクレイピングされたアイテムと(後に続く)新しいリクエストを Scrapyエンジン に返し、 スパイダー・ミドルウェア を通過します( process_spider_output() 参照 )。

  8. Scrapyエンジン は処理済みのアイテムを アイテム・パイプライン に送信し、処理済みのリクエストを スケジューラ に送信し、可能なら次のクロール要求を求めます。

  9. スケジューラ からの要求がなくなるまで、プロセスは(ステップ1から)繰り返されます。

コンポーネント

Scrapyエンジン

エンジンは、システムのすべてのコンポーネント間のデータ・フローを制御し、特定のアクションが発生したときにイベントをトリガーします。詳細については、上記の データ・フロー 節を参照してください。

スケジューラ

スケジューラはScrapyエンジンからリクエストを受信し、後でScrapyエンジンが求めたときにリクエストをキューに入れて(Scrapyエンジンにも)送信します。

ダウンローダー

ダウンローダーはWebページを取得し、それらをScrapyエンジンに送り、Scrapyエンジンがそれらをスパイダーに送ります。

スパイダー

スパイダーは、Scrapyユーザーによって作成されたカスタムクラスであり、レスポンスをパースして、レスポンスまたは追跡する追加のレスポンスから アイテム を抽出します。詳細については スパイダー を参照してください。

アイテム・パイプライン

アイテム・パイプラインは、スパイダーによってアイテムが抽出(またはスクレイピング)された後にアイテムを処理する役割を果たします。典型的なタスクには、クレンジング、検証、永続化(データベースへのアイテムの保存など)が含まれます。詳細については、 アイテム・パイプライン を参照してください。

ダウンローダー・ミドルウェア

ダウンローダー・ミドルウェアは、エンジンとダウンローダーの間にある特定のフックであり、エンジンからダウンローダーに渡されるときにリクエストを処理し、ダウンローダーからエンジンに渡されるリクエストを処理します。

あなたが以下のいずれかを行う必要がある場合は、ダウンローダー・ミドルウェアを使用します:

  • ダウンローダーに送信される直前にリクエストを処理します(Scrapyがウェブサイトにリクエストを送信する直前);

  • スパイダーに渡す前に受信したリクエストを変更する;

  • 受信したレスポンスをスパイダーに渡すのではなく、新しいリクエストを送信します;

  • Webページを取得せずにスパイダーにレスポンスを渡す;

  • いくつかのリクエストを黙って廃棄する。

詳細は ダウンローダー・ミドルウェア 参照。

スパイダー・ミドルウェア

スパイダー・ミドルウェアは、エンジンとスパイダーの間にある特定のフックであり、スパイダーの入力(レスポンス)と出力(アイテムとリクエスト)を処理できます。

あなたが必要な場合はスパイダー・ミドルウェアを使用します

  • スパイダー・コールバックのポスト・プロセス出力 - リクエストまたはアイテムの変更/追加/削除;

  • start_requests の後処理;

  • スパイダー例外を処理します;

  • レスポンス内容に基づいて、一部のリクエストに対してコールバックの代わりに偉ー・バック(errback)を呼び出します。

詳細については スパイダー・ミドルウェア 参照。

イベント駆動型ネットワーキング

Scrapyは、Python用の人気のあるイベント駆動型ネットワーク・フレームワークである Twisted を使って記述されています。したがって、並行性のために非ブロッキング(別名「非同期」)コードを使用して実装されています。

非同期プログラミングとTwistedの詳細については、これらのリンクを参照してください: