代理池会把一次简单的中断变成忙碌循环:选一个地址,失败;再选一个,又失败。如果是因为你自己的网络中断导致所有端点都无法访问,那么更换地址永远解决不了根本原因。

在从代理池或免费代理列表中选取第一个代理之前,先给这次操作设定预算:有限的尝试次数、受限的连接与读取等待时间,以及整个任务的截止时间。Requests 超时控制的是其文档所述的连接或读取行为;它本身并不能限制一个不断发出新请求的循环。

判断什么情况才值得再试一次

  • 代理连接被拒绝,可以成为尝试另一个端点的理由。
  • 目标响应需要单独解读。收到 HTTP 错误说明某条请求路径已经走完。
  • 代理认证失败应当去检查端点和账号,而不是拿同一组凭据在越来越长的列表上反复尝试。

把原始异常或状态与尝试记录一起保存。最终只留下一句“所有代理都失败了”,就看不出这些失败是否同源。

在每次真实请求前对每个代理做健康检查,只会多出一次请求,仍然无法保证下一次一定成功。在适合任务的前提下复用近期的健康信息,然后让真实操作报告它自己的结果。

重试可能让工作重复执行

对于只读抓取,换一个代理通常比重放一次提交更简单。如果在发出购买请求或表单提交后连接中断,目标可能已经处理完毕。重放工作之前,请遵循服务的幂等机制和 HTTP 重试规则。

预算用尽后,返回一个有价值的失败。带着证据停下的任务,比悄悄一直轮换直到有人发现的任务更容易修复。

相关文章