scrapy-proxy-pool: 禁止検出でバイナリ応答を扱う
scrapy-proxy-pool のテキストパターン検査を TextResponse に限定し、ステータスと空ボディの判定は維持します。
PDF や画像がプロキシ経由で正常に届いても、禁止検出の中で失敗することがあります。Scrapy の基底 Response は body のバイト列を公開しますが、その text プロパティは「Response content isn't text.」というエラーを発生させます。
インストール済みの scrapy-proxy-pool ポリシーが無条件に response.text を検索している場合は、そのポリシーを型を考慮した版に置き換えてください。
from scrapy.http import TextResponse
from scrapy_proxy_pool.policy import BanDetectionPolicy
class BinaryAwarePolicy(BanDetectionPolicy):
def response_is_ban(self, request, response):
if isinstance(response, TextResponse):
if self.BANNED_PATTERN.search(response.text):
return True
if response.status not in self.NOT_BAN_STATUSES:
return True
return response.status == 200 and not response.body
パッケージの拡張設定でそれを選択します。
PROXY_POOL_BAN_POLICY = "myproject.policy.BinaryAwarePolicy"
これにより、ポリシーのステータスと空ボディの規則を保ちつつ、テキスト検索を対応している応答だけに限定できます。継承された例外ポリシーも引き続き利用できます。
残りの規則もアプリケーションに合わせて見直してください。意図的に空の 200 応答や通常の宛先エラーは、常に不正なプロキシの証拠ではありません。ミドルウェアは有効なままにして、失敗の原因となった分類を変更し、バイナリのダウンロードに対して禁止検出をすべて無効にしないでください。