Scrapy の基礎となるアーキテクチャの調査とソース コード分析
Scrapy は、Python をベースとした効率的な Web クローラー フレームワークであり、Web ページからデータを迅速かつ簡単に抽出でき、多様なデータ ストレージとエクスポート形式をサポートしています。多くのユーザーの間で人気のある選択肢であり、クローラー愛好家や開発者に好まれるフレームワークです。 Scrapy は、基礎となる実装で非同期 I/O モデルとミドルウェア メカニズムを使用し、より効率的でスケーラブルになっています。この記事では、基盤となるアーキテクチャとソース コード分析の両方から Scrapy の実装を検討します。
1. Scrapy の基礎となるアーキテクチャ
Scrapy の基礎となるアーキテクチャは、主にエンジン、スケジューラー、ダウンローダー、スパイダー、パイプライン) とその他 5 つのモジュールに分かれています。これらは Scrapy 内でそれぞれの役割を実行し、クロール プロセス全体をスムーズかつ効率的に行うために連携します。
クローラー フレームワーク全体の中核として、Scrapy のエンジンは、さまざまなモジュール間の対話を調整し、各モジュール間のイベントやイベントを処理する責任を負います。エンジンがクローラー開始信号を受信すると、スケジューラーでクロールされる Request オブジェクトを取得し、そのオブジェクトをダウンロードのためにダウンローダーに送信します。ダウンローダーがダウンロードを完了すると、返された Response オブジェクトがエンジンに送信されます。エンジン Response オブジェクトはまず分析のために Spider に渡され、Spider から返された結果に基づいて新しい Request オブジェクトが生成され、その後新しい Request オブジェクトがスケジューラに送信されます。このプロセスは、スケジューラ キューが空になるまでループで実行され、クローラは終了しません。
2. スケジューラ (スケジューラ)
スケジューラは、クロールを待機しているすべての Request オブジェクトを保存および管理するために使用され、リクエストの順序を調整する役割を果たします。これにより、Request オブジェクトが重複排除され、優先度の低いリクエストが削除されます。エンジンは、クロールされる次の Request オブジェクトを取得する必要がある場合、スケジューラのメソッドを呼び出してそれを取得します。 Request オブジェクトがダウンロードされるたびに、ダウンローダーは返された Response オブジェクトと対応する Request オブジェクトをスケジューラに渡し、スケジューラはそれらをリクエスト キューに保存します。
3. ダウンローダー (Downloader)
ダウンローダーは主に、エンジンから渡された Request オブジェクトを Response オブジェクトに変換してエンジンに返すために使用されます。ダウンローダーは、HTTP または HTTPS リクエストを送信することにより、指定された URL アドレスから対応する Web ページのコンテンツを取得します。ダウンローダーはいくつかのダウンロード ミドルウェアも提供しており、ダウンロード プロセス中にプロキシ、UA 識別、Cookie 処理などのカスタマイズされた処理を追加できます。
4. Spider (Spider)
クローラー モジュールは実際のクローリング ロジックであり、主にダウンロードされた Web ページ コンテンツを解析し、解析結果をアイテム オブジェクトにカプセル化して返します。アイテム オブジェクトをエンジンに送信します。通常、クローラー モジュールでは、ページ解析、Item オブジェクトのカプセル化、および Request オブジェクトの生成を実行するために、カスタム クローラー クラスを作成し、いくつかのメソッドを書き直す必要があります。
5. パイプライン
パイプライン モジュールは、データ クリーニング、重複排除、データベースやファイルへの保存など、Spider によって返された項目オブジェクトに対して一連の処理を実行するために使用されます。 Scrapyでは複数のパイプラインクラスを記述し、優先順位に従ってパイプラインチェーンを形成することができ、SpiderがItemオブジェクトを返すと、これらのパイプラインが順番に処理されます。
2. Scrapy のソース コード分析
Spider クラスは Scrapy の最もコアなクラスであり、すべてカスタム クローラー クラスです。基本クラスには、クローリング プロセスの主な実装メソッドが含まれています。
まず、クローラー クラスで、name、allowed_domains、start_urls などのいくつかの属性を定義する必要があります。これらの属性は、クローラーの名前、クロールを許可するドメイン名、およびクロールを開始する URL アドレスを指定するために使用されます。
start_requests() メソッドをオーバーライドすることで、リクエストの最初のバッチを生成し、それらをクロール用のエンジンに渡すことができます。
次に、parse() メソッドを定義する必要があります。このメソッドは主に、データの抽出や新しい Request オブジェクトの生成など、ダウンロードされた Web ページのコンテンツを解析するために使用されます。 parse() メソッドがエンジンによって呼び出され、Web ページが段階的に解析され、最終的に Item オブジェクトまたは新しい Request オブジェクトが返されます。
Scrapy では、Item クラスは Web ページから抽出されたデータをカプセル化するために使用され、実際には辞書オブジェクトです。さまざまなタイプのデータ フィールドをItem オブジェクトで提供でき、データ クリーニングやデータ マッピングなどの単純なデータ処理ロジックをクローラに実装できます。 Item オブジェクトは最終的にエンジンに返され、パイプラインによって順番に処理されます。
設定モジュールは、クローラーの名前、リクエスト遅延、同時実行数、ダウンロード タイムアウトなどを含む Scrapy 構成情報を設定するために使用されます。設定モジュールのオプションを変更することで、Scrapy の実行方法を変更できます。クローラー コードでは、クローラー クラスの設定属性を介して設定モジュールにアクセスできます。設定モジュールのすべてのオプションは辞書の形式で保存され、コード内で直接設定モジュールのオプション値を変更したり、ファイルから構成情報を読み取ることができます。
Scrapy のダウンロード ミドルウェアは、ダウンローダーによって開始されたリクエストと受信した応答をインターセプトし、リクエストまたは応答を変更してプロキシを追加できます。、UA ロゴ、Cookie 、など。 Scrapy は複数のミドルウェアをサポートしており、優先順位に従って順番に実行できます。ミドルウェアは、process_request()、process_response()、または process_Exception() メソッドをオーバーライドすることによってインターセプトおよび処理します。
Spider ミドルウェアは Spider の入出力を傍受するために使用され、リクエストを傍受する Downloader Middleware と応答を傍受する Spider が含まれます。 2つの部分。ミドルウェアは、 process_spider_input() メソッドと process_spider_output() メソッドをオーバーライドすることによってインターセプトして処理します。
Scrapy フレームワークは非常に強力で、さまざまな Web サイトに適応でき、豊富な機能と拡張インターフェイスを提供し、大規模で効率的かつ安定した Web データ クローリングに非常に適しています。しかし同時に、Scrapy には、JavaScript でレンダリングされた Web サイトのクローリングのサポートが不十分であること、AJAX リアルタイム リクエストのサポートが不十分であることなど、独自の欠点もいくつかあります。これらを連携させるには、他のツールと組み合わせる必要があります。
以上が基礎となるアーキテクチャの徹底的な探索とソースコード分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。