限流发生时,最该保护的往往不是“还能不能继续拉数据”,而是已经拉回来的结果能否被完整识别、续跑和复核。做法是先把已有结果落成带任务标识的本地快照,再让后续脚本只补缺口,不覆盖旧数据;这样即使接口暂时拒绝请求,你手里的结果仍然可用,下一步也能明确该等多久、该换哪条路径。
同一条脚本链路里,限流可能发生在不同位置,保护动作也不同。用一份你手头的导出文件或结果页做检查,重点看三件事:请求失败时返回的是空结果、错误码,还是被截断的部分数据;同一任务标识下的记录是否连续;时间戳是否集中在某个区间。若空结果和正常结果混在一起,后续统计会把“没取到”误当成“没有”,这是最需要先隔离的情况。
如果失败返回的是明确错误码,已有结果通常还完整,只需暂停写入并记录断点。如果返回的是空数组或默认值,就要把该批次标记为“待复核”,不能直接并入主表。如果只是部分字段缺失,则保留整条记录,把缺失字段单独列出,避免整行被丢弃后无法追溯。
可续跑的关键是让每条结果都能回答“它属于哪个任务、哪个时间片、哪个参数组合”。建议在导出时增加三个字段:任务标识、请求参数摘要、抓取时间。任务标识用于区分不同批次,参数摘要用于判断两次结果是否可比,抓取时间用于决定是否需要重取。
具体动作可以这样落地:先把当前结果原样复制一份到只读目录,命名为带日期的快照;再在可写目录里建立一张待办表,只记录失败或缺失的键值,不记录已经成功的记录。这样脚本续跑时只读取待办表,成功写入后从待办表移除。结果是:即使接口再次限流,你也知道缺的是哪几条,而不是面对一份真假混杂的完整表。
假设你手上有 1000 条结果,其中 200 条返回为空。方案 A 是等限流解除后整批重跑,方案 B 是只重跑这 200 条。若这 200 条恰好集中在同一参数区间,方案 B 更快,也能保留其余 800 条的原始时间戳;若空结果分散且无法判断原因,方案 A 反而更稳妥,因为整批重跑能保证口径一致。选择依据不是“哪种省请求”,而是“已有结果能否与补跑结果直接合并”。
这里的数字只用于说明比较方法,不代表任何工具的实际限额。真正要确认的是:你的结果表里有没有一列能唯一标识每条记录,以及这列在重跑后是否保持不变。若会变化,就先统一标识规则再续跑。
多个角色对“限流是否已经影响结果”常有不同理解:写脚本的人看错误日志,做分析的人看汇总数字,负责交付的人看页面是否还能打开。把分歧转成项目,可以约定一张核对表,至少包含:失败请求数、空结果数、重复记录数、时间戳断档区间。每个角色只对自己能验证的列负责,最后用同一份快照对齐。
核对时不要用“请求量归零”或“抓取量下降”单独证明处理正确,因为这些现象也可能来自任务已跑完、参数被改小或上游本身没有新数据。要结合待办表是否清空、快照时间是否连续来判断。只有这两项同时成立,才能说已有结果被保护住了。
补跑顺序建议按“影响合并”的程度排,而不是按失败时间排。优先补那些会改变汇总口径的记录,例如同一任务里缺失的关键分组;其次补时间上最近的断点,避免新旧结果混用;最后补孤立失败项。每次补跑前先复制一份当前快照,补跑后对比新旧快照的记录数和标识集合,确认没有静默覆盖。
如果工具本身提供重试或队列机制,具体行为需要以你所用版本的说明为准,未知品牌的功能不要凭印象推断。可以确定的是:只要快照和待办表分离,限流就只是延迟,不会让已有结果失效。下一步动作是先检查你手头那份结果有没有唯一标识;如果没有,先补标识再谈续跑,否则任何补跑都可能把旧结果冲掉。