结论先给:如果脚本已经拿到一部分可用结果,遇到限流后最该做的不是继续重试,而是先冻结已有结果、记录断点,再判断限流是暂时性的还是配额规则发生了变化。只有确认限流属于短时波动,且未完成部分可以低成本补齐时,继续自动重试才成立;否则应转为人工或分批补采,避免把已到手的数据一起拖坏。
限流本身只影响后续请求,不会直接改写已经落盘的数据。真正会污染结果的是三种处理方式:一是把限流返回的空值或错误页当成正常结果写入;二是用不完整的批次覆盖上一批完整数据;三是在重试时改变请求参数,导致新旧数据口径不一致。
因此第一步是隔离写入。让脚本在限流状态下只追加到临时文件或临时表,不触碰主结果集。这样即使后续补采失败,已有结果仍然可用。这一步的实际动作是加一个状态标记,把“成功返回”“限流拦截”“其他错误”分开记录;结果如何影响下一步,取决于限流拦截的占比:占比低,可以定点补;占比高,说明当前调用方式已经不适合继续跑。
两种情况的处理方向完全不同。暂时限流通常表现为短时间集中出现、间隔后恢复、错误信息一致;配额规则变化则表现为原本能跑完的任务持续在中途断掉,或同一时间段内可调用次数明显下降。
这里有一个容易误判的地方:请求量归零或抓取量骤降,不能单独证明是限流造成的。它也可能是目标页面结构变化、网络出口异常、账号权限到期或本地任务调度失败。要证明是限流,至少需要同时看到错误类型集中、恢复时间有规律、换用低并发后能部分通过这几类证据。
假设某脚本需要查询两百个词,跑到第八十个时开始被限流。此时正确做法不是从第一个词重跑,而是把已成功的前七十九个结果标记为完成,第八十个标记为待补,剩余一百二十个保持未开始。然后只对“待补”和“未开始”两部分做低并发补采。
这个例子的关键不是数字,而是比较方法:用“已完成数量”和“待补数量”判断补采成本,而不是用总任务量判断。如果待补数量很小,补采是合理的;如果待补数量接近总量,说明限流已经让这次任务失去效率,应改为更粗粒度的查询或人工核对。这里的数字只是说明假设的比较方法,不代表任何工具的实际配额。
反例很明确:当限流伴随账号风险提示、验证码或权限异常时,继续自动重试可能让后续请求全部失败,甚至影响账号正常使用。此时“保护已有结果”优先于“把任务跑完”。
另一个反例是数据时效性很强。如果已有结果已经过期,冻结它只是保留了一份不能用于决策的旧数据。这种情况下应先确认结果的时间范围,再决定是保留旧结果作为对照,还是直接放弃并重新安排采集。
遇到限流后,建议按这个顺序处理:先停止写入主结果集,再导出已完成部分和断点清单,然后核对限流类型,最后只补必要部分。这样做的结果是,下一次运行可以从断点继续,而不是从头再来。
如果核对后发现限流来自调用方式本身,就应调整任务拆分方式,例如降低单次请求量、拉长间隔、改为按优先级分批。具体工具的错误码、配额说明和恢复策略需要以该工具当前文档或后台提示为准,不同工具并不一致。只要已有结果被独立保存,并且断点清晰,限流就只是一次可恢复的中断,而不是一次数据损失。