先给结论:限流发生时,最该保护的不是“把没跑完的任务补完”,而是已经落盘、可复用的那部分结果。如果脚本把结果只留在内存里、或每轮都整体覆盖同一份文件,限流一出现就可能连旧数据一起丢掉。正确顺序是:先冻结已有结果,再决定是降速续跑、分批补跑,还是改用其他入口。前提是你能区分“请求被拒”和“结果无效”,否则容易把限流误判成数据不可用。
很多脚本在限流后会出现一个反常现象:日志里的成功请求数明显下降,但最终产出的排名文件反而更“完整”,甚至覆盖了之前已经核对过的版本。原因通常不是工具突然变好,而是脚本在重试逻辑里做了错误的合并——把失败返回的空值、占位值一起写进了结果集。
这时有两个成立的解释:解释一是限流触发了重试,重试返回的是降级数据,脚本没做校验就入库;解释二是限流只影响了新查询,旧结果本来还在,但脚本的写入方式把旧结果冲掉了。两者都会让“已有结果”受损,但修复方向完全不同。
能区分它们的证据不在请求量,而在两个地方:写入模式和失败返回的字段结构。
一个可操作的验证动作:把当前结果文件复制一份,改名为带时间戳的备份,再让脚本对同一个关键词跑一次。如果新结果与备份不一致,且新结果里出现空值或异常值,就能确认是重试合并逻辑的问题,而不是工具本身不可用。这个动作的结果会直接影响下一步——如果确认是合并逻辑问题,应该先修脚本的写入过滤,而不是急着换工具。
在限流还没出现时,脚本层面能做三件事来保护结果,且都不依赖具体工具的功能:
这三件事的共同点是:它们让“已有结果”和“未完成请求”分离。分离之后,限流只影响未完成部分,不会波及已经落盘的数据。
限流发生后,有两个选择成立的条件不同,不能混用。
降速续跑适合:失败集中在少数关键词、失败返回是明确的限流错误码、且已有结果覆盖了大部分目标。此时把请求间隔拉长、减少并发,继续处理剩余部分,成本最低。动作是调整脚本的等待时间和并发数,观察下一批请求是否恢复成功。如果恢复,说明限流是临时性的。
分批补跑适合:失败范围大、失败返回里混有无效数据、或已有结果本身需要重新核对。此时继续在原脚本上重试只会重复污染。动作是先停掉自动写入,把已有结果导出为只读快照,再按新的批次计划重新请求。如果补跑后结果与快照在重叠部分一致,说明快照可信;如果不一致,需要先查清差异来源再决定用哪份。
假设一个场景:脚本管理 500 个关键词,限流后 80 个返回失败,但结果文件里这 80 个位置被写入了空值。此时正确动作不是重跑全部 500 个,而是从备份中恢复这 80 个的旧值,再只对这 80 个降速补跑。补跑结果与旧值对比,一致则合并,不一致则标记待人工确认。这个假设说明的是比较方法,不是某个工具的实际表现。
限流后请求量下降甚至归零,可能是限流生效,也可能是脚本提前退出、网络中断、或状态记录把已成功的任务误标为失败。这些解释都成立,不能单凭请求量判断结果是否安全。
更可靠的判断依据是:已有结果文件是否可读、字段是否完整、时间戳是否连续。如果这三项都正常,即使请求量暂时归零,已有结果也是安全的。如果其中任何一项异常,即使请求量看起来正常,也应该先冻结写入再排查。具体工具的错误码含义、重试策略和配额规则需要以该工具的当前文档为准,不同工具之间不可直接套用。