1.スパイダーミドルウェア
スパイダーミドルウェアはScrapyのフックフレームスパイダーマン処理メカニズムに関与しています。
Downloaderの応答を生成した後、応答がスパイダーに送られ、スパイダーに送られる前に、応答処理は、第1項及びスパイダー要求を生成する処理、アイテムの要求はミドルウェアスパイダーによって処理されるとき、ミドルウェアスパイダーを通過します。
スパイダーミドルウェアは、3つの機能があります。
- 私たちは、クモの前に処理されるレスポンスに応答して送信されたスパイダー、それを送信する前にDownloaderのレスポンスで生成することができます。
- 私たちは、スケジューラ前に処理するための要求のための要求で送信されるスケジューラ、に送信する前に、スパイダーRequestに生成することができます。
- 以前、我々はアイテムのアイテム・パイプラインに送られるアイテムのパイプラインに送られ、スパイダー項目に生成することができます前に、処理項目。
1.1説明書
Scrapyが既にSPIDER_MIDDLEWARES_BASEにこの変化ディスクを定義している多くのスパイダーミドルウェアを、提供され、注目されるべきです。
次のようにSPIDER_MIDDLEWARES_BASE変数の内容は以下のとおりです。
{ ' scrapy.spidermiddlewares.httperror.HttpErrorMiddleware ':50 、 ' scrapy spidermiddlewaresオフサイトサイトiddlewareの' 500 、 ' scrapy.spidermiddlewares.referer.RefererMiddleware ' 700 、 ' scrapy.spidermiddlewares.urllength.UrllengthMiddleware ' 800 、 ' scrapy .spidermiddlewares.depth.DepthMiddleware ":900 、 }
そしてダウンローダミドルウェアスパイダーミドルウェアSPIDER_MIDDLEWARESとしては、第一の配置、スパイダーミドルウェアScrapyと組み合わせSPIDER_MIDDLEWARES_BASEで定義された設定に加えました。統計によると、その後、順序リストを取得するために、キーの値に優先順位を付けます。ミドルウェアは、最初のエンジンに最も近い、最後のミドルウェアは、最も近いSpideです。
1.2コアメソッド
Scrapyは内蔵のスパイダーミドルウェアScrapyのための基本的な機能を提供します。私たちはその機能を拡張したい場合は、単にいくつかのメソッドを達成するために。
クモミドルウェアは、各クラスは、この方法は、以下の4つのコアを有する、1つまたは複数のメソッドを定義します。
- process_spider_input(応答、クモ)
- process_spider_output(応答、その結果、スパイダー)
- process_spider_exception(応答、例外、クモ)
- proceのss_start_requests(start_requests、クモ)
あなただけがスパイダーミドルウェアを定義することができる方法のいずれかを実装する必要があります。
(1)process_spider_input(応答、クモ)
レスポンスが処理されるとスパイダーミドルウェアは、process_spider_input()メソッドが呼び出されます。
パラメータprocess_spider_input()メソッドは、次の2つがあります。
応答は、応答オブジェクト、応答すなわち処理。
クモ、スパイダーは、オブジェクト、すなわち、対応する応答スパイダーあります。
process_spider_input()Noneを返すか、例外をスローする必要があります。
それはNoneを返した場合Spiderが応答を処理するまで、Scrapyは、他のすべてのスパイダーミドルウェアを呼び出し、応答を処理していきます。
それが例外をスローした場合、Scrapyはリクエストのエラーバック()メソッドを呼び出して、他のスパイダーミドルウェアのprocess_spider_input()メソッドを呼び出すことはありません。エラーバック出力はプロセスに()例外がprocess_spider_exceptionをスローされ呼び出されたとき、ハンドルにprocess_spider_output()メソッドを使用してミドルウェアに再入力されます。
(2)プロセス_spider_output(応答、その結果、スパイダー)
処理はスパイダー結果を返す応答は、process_spider_output()メソッドが呼び出されます。パラメータprocess_spider_output()メソッドは、次の3つがあります。
応答、応答オブジェクトは、すなわち、出力は応答を生成しました。
結果は、要求項目オブジェクトまたはオブジェクトを含むことは、反復してもよい、すなわち、スパイダー結果が返されます。
クモは、Spiderはオブジェクトであり、結果スパイダーに対応していること。
process_spider_outputは()イテレート可能オブジェクトがリクエストまたはItemオブジェクトを含む、返す必要があります。
(3)process_spider_exception(応答、例外、クモ)
スパイダーやスパイダーミドルウェアのprocess_spider_input()メソッドが例外をスローすると、process_spider_exception()メソッドが呼び出されます。
パラメータprocess_spider_exception()メソッドは、次の3つがあります。
応答は、例外がスローされたときに処理される応答であるレスポンスオブジェクトです。
例外は、すなわち投げ、Exceptionオブジェクトです。
クモ、クモは例外クモスローされたオブジェクトです。
process_spider_exceptionは()のいずれかNoneを返し、またはイテレート可能オブジェクトは、レスポンスやアイテムのオブジェクトが含まれて返さなければなりません。
すべてのスパイダーミドルウェアが呼び出されるまで、あなたはNoneを返すためにそれを頼む場合は、Scrapyが例外を処理していきます、process_spider_exception内の他のスパイダーミドルウェア()メソッドを呼び出します。
それは反復可能を返した場合、スパイダーミドルウェアのprocess_spider_output()メソッドが呼び出され、他のprocess_spider_exception()は呼び出されません。
(4)process_start_requests(start_requests、クモ)
引数が類似しprocess_spider_output(の実行時に呼び出されるように、応答に関連付けられていないとリクエストを返さなければならないことを除いて要求スパイダーにprocess_start_requests()メソッドは、)を開始しました。
パラメータープロセスへs_start_requests()メソッドは、次の2つがあります。
リクエスト反復可能、すなわち開始要求を備えるstart_requests、。
クモは、Spiderはスパイダー開始要求が属しているオブジェクトです。
process_start_requestsは()反復可能オブジェクトRequestオブジェクトは別のものを含んで返さなければなりません。
2.アイテムのパイプライン
アイテムのパイプラインプロジェクトのパイプライン。
アイテムのパイプラインコールはスパイダー発生項目の後に発生します。スパイダーは、応答の解析が終了したら、アイテムがアイテムのパイプラインに渡され、アイテムのパイプラインを組み立て順番に定義されている、このようなデータクリーニングやストレージなどの処理の完全なシリーズを、呼び出します。
アイテムのパイプラインの4つの主要な機能があります。
クリーンアップのHTMLデータ。
検証データは、チェックフィールドをクロール、クロール。
重量チェックおよび廃棄重複。
データベースへのクロール結果を保存します。
process_item(アイテム、クモ):私たちは、アイテムのパイプラインをカスタマイズすることができ、唯一達成されなければならない方法があり、指定されたメソッドを実装する必要があります。
さらに、いくつかのより実用的なアプローチがあります。
open_spider(クモ)
close_spider(クモ)
from_crawler(CLS、クローラ)
私たちは、詳細これらのメソッドを使用することをここに。
(1)process_item(項目、クモ)
process_item()メソッドは、処理がアイテムのパイプラインデフォルトで定義されている。この方法の項目を呼び出し、達成されなければなりません。例えば、我々は、データベース操作へのデータの書き込みやデータを処理することができます。これは、タイプ項目の値を返すか、DropItem例外をスローする必要があります。
パラメータprocess_itern()2つの方法があります。
アイテムは、アイテムオブジェクト、アイテム、すなわち処理です。
スパイダー、スパイダーは、アイテムのスパイダーを生成したオブジェクトです。
process_item()メソッドは次のように要約タイプを返します。
それはアイテムオブジェクトを返す場合、このアイテムはprocess_item()メソッドの低優先度アイテムパイプライン処理され、この方法は、すべての完成まで呼ばれます。
それはDropItem例外をスローされた場合、この項目は処理されずに廃棄されます。
(2)open_spider(自己、クモ)
open_spider()メソッドは、スパイダーが自動的に呼び出されたときにオンされます。ここでは、このようなオープンなデータベース接続など、いくつかの初期化操作を行うことができます。その中でも、パラメータクモスパイダーオブジェクトが開かれます。
(3)close_spider(クモ)
呼び出されたときclose_spider()メソッドが自動的に閉じスパイダーです。ここでは、データベース接続のクローズなど、いくつかの仕上げ作業を行うことができます。前記パラメータは、スパイダーオブジェクトクモ閉じられます。
(4)from_crawler(CLS、クローラ)
from_crawler()メソッドは、@classmethodロゴ、依存性注入の方法で、クラスメソッドです。引数がオブジェクトを介してクローラ、クローラーで、我々はすべてのコアコンポーネントは、グローバルコンフィギュレーションなどの情報を取得するために、それぞれをScrapy、その後、パイプラインのインスタンスを作成することができます。CLSパラメータはクラスで、最終的にクラスのインスタンスに戻ります。