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 応答や通常の宛先エラーは、常に不正なプロキシの証拠ではありません。ミドルウェアは有効なままにして、失敗の原因となった分類を変更し、バイナリのダウンロードに対して禁止検出をすべて無効にしないでください。

関連記事