读取 Scrapy 的代理端点与连接 IP
用请求元数据确认所选代理,把 response.ip_address 视为下载处理器提供的对端信息,并在目标端核验出口 IP。
检查所选路由时,请使用与已完成响应绑定的 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 路由的证据。