结论先说:如果脚本是逐条写盘、且每条结果都带独立标识,限流通常只影响“还没拿到的部分”,已经落盘的结果可以完整保留;但如果脚本把所有结果攒在内存里、最后一次性写入,限流中断就可能让整批结果一起丢失。判断你属于哪种情况,决定了下一步是补抓剩余项还是重跑整批。
限流本身只作用于请求环节,它让工具在单位时间内能发出的查询次数变少,并不会主动删除你本地已有的数据。真正决定结果存亡的是写入策略。逐条写入、每条带查询词和查询时间的脚本,即使被限流打断,也能从最后一条成功记录之后继续。相反,先收集到列表、循环结束后统一保存的脚本,一旦中途触发限流退出,内存里的内容可能随进程结束而消失。
一个可区分的证据是:中断后检查输出文件的行数。如果文件里已有部分记录,说明写入发生在请求过程中;如果文件为空或只有表头,说明写入被推迟到了最后。这个观察不需要平台配合,只看自己的落盘行为即可。
第一个动作是给每条结果加稳定标识,通常用查询词本身或查询词加参数组合。续跑时先读取已写入的标识集合,跳过这些项,只请求缺失项。这样限流恢复后不会重复消耗请求额度,也不会覆盖已有内容。
第二个动作是把写入改为追加模式,每完成一条就落盘一次。追加写入的代价是文件可能包含重复行,但可以在续跑前用标识去重,比整批丢失更容易恢复。
第三个动作是记录失败项而不是直接丢弃。限流导致的失败和查询词本身无结果不是一回事,前者应进入待重试列表,后者才应标记为已完成。把两者混在一起,会让续跑时误以为某些词已经查过。
做完这三个动作后,下一次限流中断的影响范围会被压缩到“当前这一条”,而不是整批任务。这也是判断脚本是否可续跑的实际标准:中断后能否只补少量请求就恢复,而不是从头再来。
假设脚本确实逐条写盘,但写入的是经过合并的汇总结果,例如把多个查询词的命中合并成一个统计值,而原始明细没有单独保存。这种情况下,限流中断后虽然文件里有数据,却无法判断哪些查询词已经覆盖、哪些还没有,续跑只能整批重来。此时“逐条写盘就能保住结果”的结论不成立,因为保住的只是聚合值,不是可续跑的进度信息。
另一个反例是标识不稳定:如果标识里包含请求时间戳或随机数,同一查询词每次运行都会生成不同标识,去重和跳过逻辑就会失效。这种情况下即使数据没丢,续跑也会重复请求,等于没有真正保护已有结果。
不要一恢复就立刻跑全量。先取一小批此前未完成的查询词,确认三件事:新结果能正常追加写入、标识去重能跳过已完成项、失败项能被正确记录。验证通过后再放开剩余任务。如果验证中发现重复行增多或跳过逻辑误判,说明标识设计或写入方式还需要调整,此时继续跑全量只会放大问题。
需要核对的是你自己脚本的写入行为和标识规则,不同工具或接口对限流的判定方式可能不同,具体阈值和返回信息以实际调用时的反馈为准。