Scrapy の画像リクエストにプロキシを添付する
ImagesPipeline が作成する Requests を装飾し、パイプラインのリクエストロジックを作り直さずに画像ダウンロードへプロキシを渡します。
from scrapy.pipelines.images import ImagesPipeline
class ProxiedImagesPipeline(ImagesPipeline):
def get_media_requests(self, item, info):
for request in super().get_media_requests(item, info):
request.meta['proxy'] = 'http://proxy.example:8080'
yield request
Scrapy 2.13.3 では、ITEM_PIPELINES の標準 ImagesPipeline エントリをこのサブクラスのインポートパスに置き換えます。IMAGES_STORE とその他の設定は保持してください。
親を呼び出すことで、設定済みの画像 URL フィールドとコールバックが保たれます。サブクラスが追加するのはリクエスト経路だけで、これを 有効な HttpProxyMiddleware が消費します。各画像 URL はそのまま宛先です。プロキシ資格情報を持たない新しい公開画像リクエストは、その経路が許可されていれば HTTP プロキシ一覧 の項目を使えます。
ページリクエストは独自のポリシーを保ちます。グローバルなプロキシ環境では、このリリースで meta={'proxy': None} が選択したページリクエストを直接通信にします。
ダウンロードが実際に発行されたか確認してください。パイプラインのキャッシュヒットはネットワークリクエストを避けることがあります。新規転送では、完了した画像の結果エントリを要求した URL と比較します。成功した処理はそこに現れ、失敗すると元の画像 URL フィールドが埋まったままになることがあります。欠けた結果はダウンローダーのログと選択したプロキシで追跡してください。