先给结论:限流发生时,第一优先级不是继续把请求打满,而是把已经拿到的结果落盘、标记断点,再决定是等待重试还是切换数据源。继续硬跑通常会让未保存的中间结果一起丢失,而完全停掉又可能让已经消耗的配额白费。下面用一个假设情境把取舍条件写清楚。
假设你写了一个脚本,循环调用某个SEO工具的接口,拉取一批关键词的排名或索引数据。跑到中途开始返回限流响应。这时不要立刻改代码重试,先看两类信号。
这两类的处理代价不同。配额型继续重试没有意义,只会浪费重置前的等待时间;并发型则可以靠退避和串行化救回来。分不清时,先发一个单请求测试,比盲目加sleep更省时间。
限流本身不可怕,可怕的是结果只存在内存里。脚本应该在每处理完一条或一小批结果后立即写入本地文件或数据库,而不是等全部跑完再统一保存。
可执行的动作是:把输出改成追加写入,每条记录带一个唯一键(比如关键词加日期)。这样即使进程被杀,下次启动时可以读取已有文件,跳过已完成的键。结果是重跑成本从“全部重来”降到“只补缺口”,下一步的重试决策才有意义。
如果结果需要聚合计算,也先把原始响应存下来,聚合逻辑放到最后单独跑。原始数据一旦落盘,限流只影响采集进度,不影响已有分析。
限流后有两种看似合理的做法,选择取决于你的任务对时效和完整性的要求。
判断依据不是哪个更快,而是你的下游怎么用这批数据。如果下游要做同一批关键词的纵向对比,混源会引入口径差异,此时等待更稳妥;如果只是补一批缺失记录、后续会人工复核,换源可以接受。切换前先记录数据来源和时间戳,否则后面无法解释差异。
决定等待重试后,脚本需要三个约束,否则容易变成无限循环。
这里的关键动作是保留现场:把失败时的请求参数、响应内容和时间写入日志。没有日志,你只能看到“没跑完”,无法判断是配额耗尽、参数错误还是服务端临时问题。日志会直接决定下一步是改参数、等重置还是换源。
假设你要采集500个关键词,跑到第180个时开始限流,前179条已追加写入本地文件。此时你有三个选择:立即重跑全部、等待重置后从第180条继续、或换另一个工具补齐剩余321条。
如果这500个词要放进同一张对比表,换源会让前179条和后321条口径不一致,代价大于等待;如果只是内部排查、允许标注来源,换源能更快拿到全量。无论选哪个,前179条已经保住,这就是落盘带来的实际收益。没有落盘时,三个选择都等于从零开始,讨论取舍就没有意义。
最后提醒一点:限流响应减少、请求恢复成功,不能单独证明你的处理方式正确,也可能只是重置窗口恰好到了。要结合日志里的失败时间分布来判断,再决定是否调整并发或配额分配。