Un PDF ou une image peut arriver correctement via un proxy puis échouer dans la détection de bannissement. La Response de base de Scrapy expose les octets du corps, mais sa propriété text lève l'erreur « Response content isn't text. »

Si la politique installée de scrapy-proxy-pool parcourt response.text sans condition, remplacez cette politique par une version qui tient compte du type :

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

Sélectionnez-la via le réglage d'extension du paquet :

PROXY_POOL_BAN_POLICY = "myproject.policy.BinaryAwarePolicy"

Cela conserve les règles de statut et de corps vide de la politique tout en limitant la recherche textuelle aux réponses qui la prennent en charge. La politique d'exception héritée reste disponible.

Examinez aussi ces règles restantes pour l'application : une réponse 200 volontairement vide ou une erreur de destination ordinaire ne prouve pas toujours un mauvais proxy. Gardez le middleware actif et modifiez la classification à l'origine de l'échec, plutôt que de désactiver toute la détection de bannissement pour les téléchargements binaires.

Articles similaires