先给结论:在关键词搜索量查询的脚本里,限流不是“失败”,而是一种需要被当作正常返回处理的状态。保护已有结果的关键动作是把每次请求的原始响应与解析结果分离落盘,并在限流信号出现时立即停止推进、只做收尾写入。这样即使本轮任务中断,已完成的部分仍是可核对、可续跑的数据,而不是留在内存里随进程一起消失。
限流在不同工具上的外观并不一致,但大体可以归成两类,处理方式相反。
429,或响应体中带有表示配额耗尽的错误对象。这类信号可信度高,应视为“本轮到此为止”。选择依据很简单:能拿到明确限流信号时,不要重试,直接收尾;只能观察到结果异常时,先做一次小规模复测再判断。把隐性异常直接当成限流,可能把真实的数据缺失误判成配额问题,导致后续补跑范围算错。
保护已有结果的前提是结果已经被写下来。对关键词搜索量查询这类逐词请求的任务,落盘粒度决定了中断时能保住多少。
推荐的最小结构是每条记录包含三部分:查询词、本次请求的原始响应、以及从响应中解析出的数值字段。原始响应单独保留,是因为解析逻辑可能在后续调整,而原始响应一旦丢失就无法重建。
写入方式上,追加写优于整体覆盖写。每完成一条就追加一行或一条记录,进程被中断时文件里至少保留到最后一次成功写入。如果采用“全部跑完再统一写文件”,限流发生时内存中的全部结果都会丢失。
一个假设的例子:某脚本计划查询 500 个词,查询到第 180 个时收到限流信号。若采用逐条追加,第 1 至 179 条已落盘,续跑时从第 180 条开始即可;若采用末尾统一写入,则这 179 条也需要重新消耗配额。这里的关键差异不是脚本性能,而是写入时机。
检测到限流后,正确的动作顺序是:停止发起新请求、把当前已解析但未写入的结果补写落盘、记录中断位置、然后退出。不要在这时循环重试,因为重试会继续消耗配额,也可能让中断位置变得难以确定。
记录中断位置时,除了词序号,还应记录本轮已成功返回的词集合。原因是限流并不保证按顺序生效,某些词的请求可能已经发出但未收到响应,续跑时如果只按序号跳过,可能漏掉这些词。
这个动作直接决定下一步:如果中断位置和已成功集合都记录清楚,续跑就是一次干净的差集查询;如果只记录了一个数字,续跑时就需要额外核对哪些词真的拿到了结果,核对成本可能高于重新查询。
重试成立的条件是限流被判定为短时、可恢复,并且任务对时效的要求高于对配额消耗的敏感度。此时可以用退避方式重试,即每次失败后拉长等待间隔再试,且设置一个明确的重试上限,避免无限等待。
应当换策略的条件则相反:限流反复出现、重试后仍无改善,说明当前请求节奏超出了工具允许的范围。可选的调整包括降低并发数、拉长请求间隔、或把一次大批量查询拆成多次小批量任务分别执行。
需要说明的是,请求量或成功量归零并不能单独证明限流处理正确。连续空结果也可能来自查询词本身过于生僻、工具对某些词不返回数据、或解析逻辑与响应结构不匹配。把这类现象一律归因于限流,会掩盖真正的问题。区分方法是:换一个已知有数据的词做一次单独请求,如果它也返回空,问题很可能不在限流。
当运营、数据和技术对“到底查了多少、哪些没查到”有不同理解时,争论通常源于各自看到的是不同阶段的结果。把分歧转成可核对的项目,比反复解释更有效。
这样做的结果是,任何一方都可以基于同一份文件核对进度,而不是依赖某一方对“跑完了没有”的口头描述。至于具体工具的限流阈值、配额规则和响应字段含义,不同工具差异较大,需要以该工具当前的官方说明为准,不能套用其他工具的经验。