先保住已经拿到的数据,再决定是否重试:把每次脚本返回的结果立即落盘并记录游标,限流发生时只补缺口,不重跑全量。判断依据是接口返回的状态码与响应头,而不是任务是否“看起来跑完”。
假设你用一款网络营销工具做关键词或落地页数据的批量拉取,脚本按分页循环调用接口,跑到第 40 页时开始返回 429 或等价的限流提示。此时前 39 页的数据仍在内存里,如果脚本直接退出或抛异常,这些结果会随进程一起消失,下一次只能从第 1 页重来,而重来又会更快撞上限流。这个情境的关键不是“限流怎么绕过”,而是“已有结果能不能先固定下来”。
不要等整批任务结束才写文件。每成功拿到一页,就同时写入两样东西:
这样做的直接结果是:限流中断后,你能从游标处继续,而不是从零开始。判断下一步该“续跑”还是“重跑”的条件也很清楚——如果结果文件完整、游标可解析,就续跑;如果写入过程中断导致文件截断,先校验行数或记录数,再决定是否丢弃最后一片重拉。
同样是“请求失败”,背后的原因不同,动作也不同。可以按下面这组可区分的证据来判断:
把这三类混在一起统一“重试”,最常见的后果是:真正被限流时反复冲击,反而延长了恢复时间;而权限问题被当成限流等待,白等一轮。
重试本身不是问题,无界重试才是。建议对单页设置固定次数的重试,每次之间按递增间隔等待;超过次数后,把该页记入“待补清单”而不是让整个任务失败。待补清单的作用是:等限流窗口过去后,只针对缺口发起请求,已有结果不受影响。判断是否值得继续补的条件是缺口规模——如果缺口只占总量很小一部分,补拉成本低;如果大量页都失败,说明当前调用方式与该接口的承受能力不匹配,应先调整节奏或分批,而不是硬补。
续跑不是唯一正确选择。出现以下情况时,继续在旧任务上补缺口反而更差:
这时更稳妥的做法是把已有结果标记为“部分完成”,单独保留,然后按更小的批次重新组织拉取。已落盘的部分仍然可用,只是需要在使用时说明它覆盖的范围。
发生限流后,按这个顺序处理:先确认结果文件与游标是否完整;再判断失败类型是限流、权限还是网络;然后决定续跑、等待还是重排任务;最后把本次的中断点、等待时长和补拉结果记录下来,供下次调整并发与分批大小。这个顺序的价值在于,它让“保护已有结果”先于“恢复调用”,避免为了跑完而丢掉已经付出的那部分数据。具体工具的重置规则和额度信息,需要以你实际使用的接口文档为准。