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