保护已有结果的关键不是“重试到成功”,而是把每次调用变成可落盘、可续跑、可对账的批次:先冻结已经拿到的原始响应,再按限流信号缩小并发和批量,最后用断点清单决定哪些条目补跑、哪些条目必须放弃或改走人工。下面以你手里的一份待处理清单为例,说明怎么落地。
限流发生时,最危险的动作是继续覆盖同一个结果文件。脚本一旦把空响应、错误页或截断内容写进正式结果,后续很难区分“本来没有数据”和“这次被限流了”。
可执行的处理顺序是:
做完这一步,你的下一步才有依据:如果原始响应完整,就可以离线重新解析,不必再次请求;如果原始响应本身是限流页,就必须重新排队。这个区分决定了后面是“省调用”还是“补调用”。
不同工具给出的限流信号不一样,常见的有明确的状态码、响应头里的剩余额度提示、返回体中的错误说明,或者干脆表现为连接被拒、响应变慢。先确认你面对的是哪一种,再选择降速策略。
这里要避免一个常见误判:某次重试成功了,不代表限流已经解除,可能只是恰好落在额度恢复的瞬间。判断是否恢复,要看连续多个请求的稳定表现,而不是单次结果。
规模化之后出现例外,通常是因为清单里混着不同性质的条目。建议在任务开始前就给每条记录一个状态字段,至少分成三类:
假设你的清单有 500 条,前 80 条正常完成,第 81 条开始连续返回限流错误。此时正确动作是停止新增请求,把 81 到 500 标记为“未处理”,检查第 81 条是否属于特殊类型。如果它只是普通条目,说明是整体额度问题;如果它带有特殊参数,说明是条目级限制,那就应该把它单独隔离,继续处理后面的普通条目,而不是整批停摆。这个判断直接影响你是“等额度”还是“改清单”。
限流期间拿到的结果,质量往往不均匀。恢复调用前,从已完成部分抽一小批做对账:用同一参数再请求一次,比较两次的字段是否一致。如果一致,说明之前的原始响应可信,可以继续按原方案推进;如果出现字段缺失或结构变化,说明限流期间可能返回了降级内容,需要重新评估已完成部分的可用范围。
抽样规模不需要大,但要覆盖不同类型的条目,尤其是参数最复杂的那几条。对账结果决定三件事:已完成部分是否直接采用、可重试部分是否要调整参数、以及是否需要为高风险条目单独设置更慢的调用节奏。
真正能保护已有结果的,是脚本在异常退出时留下的现场,而不是事后回忆。至少要让脚本做到:
这样下次启动时,你只需要读取状态文件,从断点继续,而不是从头再跑一遍。对已有结果的保护,本质上就是把“这次跑到哪、哪些能用、哪些不能碰”变成文件里的确定信息。做到这一点,限流只会拖慢进度,不会毁掉已经拿到的数据。