Scrapy プロキシミドルウェア:Request と None の戻り値
Scrapy のプロキシを割り当てた後に制御を戻してください。ダウンロード前に同じリクエストを意図せず再スケジュールしてはいけません。
ログではプロキシアドレスが変わっています。宛先はプロキシのアクセスログに決して現れません。ミドルウェアがリクエストをダウンローダーまで通しているかどうかを確認してください。
Scrapy のダウンローダーミドルウェアでは、Request を返すことはそのリクエストを再スケジュールすることを意味します。「たった今変更したメタデータでこのオブジェクトを送り続ける」という意味ではありません。
経路を選ぶだけのセレクターでは、重要な形は次のとおりです。
def process_request(self, request):
request.meta['proxy'] = self.choose_proxy()
return None
この断片は現在のフック形式を示しています。インストールされている Scrapy のリリースがサポートするミドルウェアインターフェースを使用してください。セレクターは有効なエンドポイントを返し、利用できないプールを明示的に扱う必要があります。公開された仲介者を許可する公開クロールは、その戻り値のために HTTP プロキシ一覧から HTTP 候補を取得できます。
None を返すと、残りのリクエストミドルウェアとダウンローダーが続行できます。別の Request を返すことは、作業を意図的に置き換えたり再試行したりするときに役立ちますが、理由と終了条件が必要です。
毎回同じリクエストを返すローテーターは、宛先への接続を一度も行わずに自身の選択コードを繰り返し実行し続けることがあります。タイムアウトを上げたりプロキシポートを増やしたりしても、その制御フローのループは直りません。
ミドルウェアへの入り口、戻り時の挙動、最初の実際のネットワーク試行を別々のイベントとして調べます。「プロキシを選択」と書かれたログ行は、セレクターが動いたことだけを示します。選択したエンドポイントを使ったリクエストが送信されたことは示しません。