代理池里 200 个地址,随机取用时 118 个在 5 秒内抛 ProxyError,重试三次仍失败,任务整体耗时从 20 分钟涨到 2 小时。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
proxies = {'http': 'http://127.0.0.1:7890'}
try:
requests.get('https://httpbin.org/ip', proxies=proxies, timeout=(3, 5))
except requests.exceptions.ProxyError as e:
print('dead', e)
池子按购买量填进去,没有做实时可用性检测,很多地址早就下线。requests 的 timeout 覆盖不到代理握手阶段,卡住时会一直等到默认超时。这一点先确认清楚,后面就不用反复试。
「代理池可用率」这类改动最怕改一半,回滚脚本先准备好,再动生产。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
具体做法是,单独跑一轮探活记录成功率;按成功率给每个代理打分;低于 20% 的直接移出池子;取用时按分数加权而不是随机。
改完照着核一遍,探活后池子剩 71 个可用地址,任务成功率从 41% 升到 97%,单轮耗时回到 25 分钟。
