检查所选路由时,请使用与已完成响应绑定的 Request。请把三种观察分开看待:

字段含义
response.request.meta.get('proxy')本次请求所选的代理 URL(存在时)
response.ip_address下载处理器提供的地址,可能为 None
可信目标端的来源报告在该目标端观察到的公网来源

在回调中,请把带凭据的 URL 部分排除在常规诊断之外:

from urllib.parse import urlsplit

proxy = response.request.meta.get('proxy')
proxy_host = urlsplit(proxy).hostname if proxy else None
self.logger.info(
    'target_host=%s proxy_host=%s peer_ip=%s',
    urlsplit(response.url).hostname, proxy_host, response.ip_address,
)

在 Scrapy 2.13.3 的 HTTP/1.1 处理器中,地址来自响应连接的对端,而不是某个出口 IP 服务。某些路径(包括长度为零的响应)可能让它保持为 None。其他处理器可能有不同的填充方式。None 本身并不能证明是直连路由。

要做出口核验,请在预期的代理策略下查询一个可信端点,并把该请求的身份与观察结果一起保存。轮换中间件可能让后续核验使用另一个端点。

重定向同样会产生另一个请求。最终元数据描述的是那个阶段;应查看重定向历史以及中间件的任何重新选择,而不是把它当作首个 URL 路由的证据。

相关文章