在代理接入和自动化任务中,失败重试经常被简单处理成:
请求失败 -> 换一个 IP -> 再请求一次这个逻辑在连通性测试里可能够用,但放到真实业务任务中就不够严谨。
因为很多任务关心的不是“下一次请求是否成功”,而是“下一次成功是否仍然符合原来的业务条件”。
如果重试过程中地区变了、会话断了、出口身份变了,最后即使拿到了页面,也未必是有效结果。
例如:
本地 SEO 检查从 A 城市失败后重试到 B 城市 广告验证中途换出口,导致展示、点击、落地页不再属于同一链路 账号环境复核过程中频繁轮换,导致访问身份不连续 公开采集中用另一个市场的结果补原市场失败数据这些情况从程序角度看可能是“重试成功”,但从业务角度看并不一定有效。
所以,住宅代理重试策略真正要解决的问题,不是如何让请求尽快成功,而是如何判断失败后应该保持、轮换、等待、停止,还是标记为无效。
1. 先区分失败类型
不是所有失败都应该用同一种处理方式。
常见失败类型可以拆成下面几类:
timeout: 超时 forbidden: 403 或拒绝访问 captcha: 验证码 geo_drift: 地区漂移 session_broken: 会话断裂 content_mismatch: 内容不一致不同失败类型对应的处理方式不同。
超时
超时可能来自目标站响应慢、网络波动、临时线路延迟或客户端等待时间设置过短。
这类问题可以先做同条件重试。
保持地区 保持会话 保持端口和协议 保持目标页面 重试 1 次如果同条件重试成功,结果通常仍然可用。
如果同条件连续失败,再考虑等待或有限轮换。
403 或拒绝访问
403 不一定说明代理不可用,可能是访问频率、请求行为、目标站策略、出口信誉或请求头问题。
这时如果继续高频请求,可能只会扩大限制。
更合理的方式是:
降低频率 检查请求头和浏览器环境 检查访问路径是否异常 必要时轮换动态住宅地址 记录失败标签验证码
验证码通常说明访问行为已经被更强识别。
这种情况不建议无限换 IP。应该先暂停任务,检查自动化动作、请求频率、Cookie、浏览器指纹、会话连续性等因素。
如果只靠不断换出口继续请求,最终可能会让任务质量更差。
地区漂移
地区漂移是指重试后出口地区发生变化。
对于本地 SEO、广告验证、电商价格检查和本地化页面复核来说,地区是结果成立的前提。
如果原任务要求某个城市,重试后变成另一个城市,即使页面成功返回,也不能直接覆盖原任务结果。
会话断裂
会话断裂常见于多步骤流程,例如:
打开页面 登录或保持 Cookie 跳转 加载资源 提交表单 截图取证如果中途换出口,Cookie、登录态或访问身份可能不连续。
这类任务通常应该保持出口,必要时使用静态住宅 IP 或粘性会话,而不是高频动态轮换。
内容不一致
内容不一致包括语言不同、价格不同、页面版本不同、缓存不同、最终 URL 不同等。
这类问题不应该直接算成功,而应该保留对比证据,并在日志中标记条件变化。
2. 重试前先确认业务条件
代理重试前,应该先明确任务条件。
至少要回答几个问题:
目标 URL 是什么? 最终 URL 是否必须一致? 目标市场或城市是什么? 是否要求同一会话? 是否需要截图证据? 是否允许换出口? 是否允许换地区? 失败后最多重试几次?如果这些条件没有定义清楚,重试策略就会变成“只要能返回页面就算成功”。
这会带来一个问题:请求成功率看起来提升了,但有效结果率可能下降。
例如,本地 SEO 任务如果在失败后切换地区,技术上成功了,但这个结果不能代表原地区。
广告验证任务如果在跳转中途换出口,截图成功了,但证据链已经断了。
所以,重试策略要围绕业务条件设计,而不是只围绕 HTTP 状态码设计。
3. 保持、轮换、等待、停止怎么判断
可以把重试动作分成四类:
keep: 保持同一条件重试 rotate: 轮换住宅地址 wait: 等待后重试 stop: 停止并标记无效什么时候保持
当任务更重视连续性时,优先保持同一条件。
适合场景:
账号环境复核 广告链路验证 后台页面检查 人工取证截图 短流程多步骤任务这类任务中,频繁换 IP 可能会破坏连续性。
什么时候轮换
当任务更重视覆盖范围,并且失败明显集中在某个出口时,可以轮换。
适合场景:
公开页面采集 大批量关键词监控 多地区广告可见性检查 电商页面巡检 品牌页面复核但轮换要有边界:
保持地区 保留任务标签 限制重试次数 记录轮换原因什么时候等待
如果是临时错误、目标站响应慢、短时间限流,可以等待后重试。
等待时间可以设置为几秒到几十秒之间的随机区间,避免固定节奏。
什么时候停止
遇到下面情况时,应该停止或标记无效,而不是无限重试:
持续 403 验证码 地区漂移 内容明显不一致 会话已经断裂 重试次数达到上限停止不是失败,而是避免把无效结果写进报告。
4. 有效结果率比请求成功率更重要
代理任务里,很多人关注请求成功率。
但真正更重要的是有效结果率。
请求成功率只说明请求是否返回。
有效结果率说明返回结果是否仍然符合任务条件。
一个结果是否有效,至少要看:
地区是否一致 会话是否连续 目标页面是否正确 最终 URL 是否符合预期 内容版本是否一致 截图证据是否完整 失败和重试过程是否可解释如果这些条件不满足,即使状态码是 200,也不应该直接算作有效成功。
5. 日志字段设计
可复盘的重试策略必须依赖日志。
建议至少记录这些字段:
request_time task_id target_url final_url status_code proxy_mode country city session_id retry_count failure_type action_taken rotated condition_changed screenshot_path response_summary final_decision其中几个字段很关键。
failure_type用来区分失败类型,例如 timeout、forbidden、captcha、geo_drift。
action_taken记录本次采取了什么动作,例如 keep、rotate、wait、stop。
condition_changed标记业务条件是否变化。如果地区、会话、目标页面、访问链路发生变化,就应该设为 true。
final_decision记录最终判断,例如 valid、invalid、needs_review。
这样后续复盘时,不会只看到“成功”或“失败”,而是能知道这次结果为什么可信,或者为什么不能用。
6. 示例:一个简单的重试配置
下面是一个示例配置,用来表达设计思路:
{ "task": "local_serp_check", "proxy_mode": "dynamic_residential", "region": { "country": "US", "city": "Los Angeles" }, "session": { "sticky": true, "duration_minutes": 5 }, "retry": { "max_attempts": 2, "keep_region": true, "keep_session_intent": true, "allow_rotation": true, "mark_condition_changed": true }, "logging": { "record_final_url": true, "record_status_code": true, "record_region_result": true, "record_failover_reason": true, "record_screenshot": true } }重点不是字段名,而是把任务、地区、会话、重试和日志放在同一个框架里管理。
7. 不同场景的建议
SEO 排名监控
SEO 排名监控要保持关键词、地区、语言和设备条件一致。
超时可以同条件重试一次。如果重试导致城市、语言或页面版本变化,结果应该丢弃或单独标记。
广告验证
广告验证看的是完整链路,包括展示、点击、跳转、落地页和截图。
轮换应该发生在一条证据链完成之后,而不是流程中间。
公开数据采集
公开数据采集通常更适合动态住宅地址,但仍然要控制重试次数,并记录地区、页面版本和失败原因。
不要用另一个地区的备用结果填补原地区失败数据。
账号环境复核
账号环境复核更重视稳定性。
这类任务不适合高频轮换,更适合保持出口或使用稳定会话。
8. 上线前检查清单
上线前可以按下面清单检查:
是否定义了有效结果? 是否区分失败类型? 是否限制重试次数? 是否定义保持、轮换、等待和停止规则? 地区变化是否会被标记? 会话断裂是否会被识别? 日志是否能解释最终结果? 是否避免把无效结果写进报告?总结
住宅代理重试策略不能只围绕“请求是否成功”设计。
更合理的方式是先识别失败类型,再判断业务条件能不能保持。
能保持,就做有限的同条件重试。
不能保持,就不要把后续成功直接当成原任务成功。
需要连续身份的任务,优先保持出口。
需要公开覆盖的任务,可以轮换动态住宅地址,但要限制次数并记录条件变化。
最终目标不是提高表面成功率,而是提高有效结果率。
也就是说,重试后的结果不仅要返回页面,还要能解释为什么它仍然可信。
参考整理:
住宅代理重试策略:失败后如何判断