脚本检测到 403 后切换代理,日志里新 IP 已经生效,接下来 30 个请求仍然 403,重启进程后同一个代理立刻能用。日志里能对上时间点,这种反而好排。

Session 底层的连接池把到旧代理的 TCP 连接留了下来,换代理只改了下一跳地址,复用判断里没把它算进去。keep-alive 连接不关,请求就一直从旧出口出去。这一点先确认清楚,后面就不用反复试。

s = requests.Session()
s.proxies = {'http': 'http://10.0.0.9:8080'}
print(s.get('https://httpbin.org/ip', timeout=8).text)

围绕「代理切换失效」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

别只看报错的最后一行,往上看几行,真正的起因通常在上面。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

处理上按这个顺序:切换代理时直接丢弃整个 Session;或者关闭连接池复用一个请求一条连接;切换后先请求一次 /ip 校验出口;出口对上再把 403 计数清零。

结果对不对很好判断,切换后第一个请求返回的出口 IP 就是新地址,后续 100 个请求 403 为 0。

作者 9823189