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 响应或普通的目的地错误并不总是坏代理的证据。让中间件保持启用,改为修改导致失败的那条分类,而不是为二进制下载关闭全部封禁检测。

相关文章