限流发生时,先别急着重试或换脚本,而是把手上已有的返回结果落盘、标记来源与时间,再判断哪些字段可以继续使用、哪些必须等待补齐。保护已有结果的核心动作是:把“已成功返回的数据”和“本次调用状态”分开保存,让后续处理不依赖脚本能否立刻恢复。
脚本被限流,通常表现为请求返回错误码、响应变慢或直接中断。此时最危险的做法是让脚本自动重试并覆盖原文件,因为半截结果和新结果混在一起后,你很难判断哪条数据来自哪次调用。
假设你有一个页面清单文件 pages.csv,脚本会逐条请求并写回状态列。限流后应立刻做三件事:
pages_20240601_1030.csv。ok、rate_limited、timeout,不要只留空。这个动作的结果是:你得到一份可追溯的快照。下一步无论选择等待、分批重跑还是人工补录,都有明确起点,不会因为一次限流丢掉之前已经拿到的有效部分。
不是所有已返回的数据都值得保留。可以按字段来源分三类处理:
一个可操作的判断方法是:对每条记录问“如果明天重新调用,这个值会不会变”。会变的字段,只有带时间戳才可用;不会变的字段,可以优先保留,减少重跑量。这样做的结果是重跑范围缩小,限流恢复后不必从头再来。
限流往往意味着单位时间内的请求额度有限。与其一次性重跑全部条目,不如按状态列筛选出需要补的条目,分成小批处理。
假设快照中有 500 条记录,其中 320 条状态为 ok,180 条为 rate_limited。你可以只对这 180 条建立新任务文件,并在脚本中设置每批处理数量、批次间隔和失败后暂停条件。具体数值需要根据你所使用接口的实际限制核对,不要照搬他人配置。
这里的关键取舍是:优先补齐影响下一步决策的字段,而不是追求全部条目完整。如果下一步只是筛选出仍然有效的旧页面,那么标题和链接齐全就够了;如果下一步要比较效果变化,则时效字段必须重新采集。明确下一步用途,才能决定哪些条目值得优先重跑。
很多脚本默认逻辑是失败就重试,直到成功或达到次数上限。限流场景下,这种逻辑容易把额度耗尽,也让结果状态变得模糊。
更稳妥的做法是引入一个独立的状态文件,例如 status.json,记录每个条目的最后调用时间、返回状态和重试次数。脚本每次运行前先读状态文件,只处理未完成或标记为可重试的条目。这样即使中途再次被限流,下次运行也能从断点继续。
这个动作的结果是:脚本是否成功不再取决于单次运行,而取决于状态文件是否被正确更新。你需要检查的是状态文件与结果文件是否一致,而不是盯着脚本有没有跑完。
请求量恢复、错误码消失,只能说明当前调用不再被拦截,不能单独证明你的数据处理方式没问题。还有几种合理解释:限流窗口刚好过去、你减少了请求量、或者接口侧策略发生了变化。
因此,恢复后应先做小范围验证:挑几条之前状态为 rate_limited 的记录重新调用,对比新结果与快照中的稳定字段是否一致。如果一致,再扩大重跑范围;如果不一致,说明目标页面或数据本身已变化,需要重新评估保留策略。
对于旧内容、旧系统或旧合作关系退出场景,保留仍然有价值的部分往往比全部重来更实际。先冻结快照,再按字段可用性筛选,最后用小批重跑补齐关键缺口,这条路径能让你在限流期间不丢已有结果,也不把时间花在低价值条目上。具体接口的限额、重试规则和字段含义,仍需以你所使用工具的当前说明为准。