结论先行:如果被限流的是查询接口,而你的脚本已经把原始响应逐条落盘,那么限流只影响“还能拉多少新数据”,不影响已经拿到的结果,此时应停止重试、转去校验和消费已有数据;如果脚本是边拉边算、结果只存在内存里,限流中断就可能让整批结果一起丢失,这时保护已有结果的优先级高于继续取数。判断自己属于哪种情况,看一个证据就够了:中断后磁盘上是否还存在可独立解析的原始记录。
脚本调用搜索引擎优化工具,通常经过三层:请求发起、接口返回、本地处理。限流一般发生在第一层或第二层,但损失发生在第三层。
可区分的证据是:打开输出文件,看最后一条记录能否被解析器单独读出来。能,说明落盘粒度足够细;不能,说明写入是整批覆盖式的,限流一次就可能赔掉整批。
限流发生后,很多脚本的第一反应是加长间隔、换出口、继续重试。这个动作在有存量结果时是危险的,因为重试逻辑往往和写入逻辑耦合:新一轮请求可能以“最新状态”覆盖上一轮已经确认的数据。
更稳的动作顺序是:
这个动作的结果会直接改变下一步:如果快照能被完整解析,你就有资格谈“补拉”;如果快照本身残缺,下一步应是修写入方式,而不是修请求频率。
已有结果能独立支撑决策,需要同时满足两个条件:
假设一个场景:某站点有 500 个待观察页面,脚本按分页拉取,限流发生在第 380 条。如果这 380 条里已包含全部高优先级页面,那么可以先基于这部分做分诊,把剩余 120 条标记为待补,而不是让整批任务停摆。这里 500 和 380 只是说明比较方法的假设数字,不代表任何工具的实际容量。
反过来,如果缺失的恰好是你最关心的那批对象,已有结果的覆盖度就不成立,此时继续消费存量只会得出偏斜的判断。
如果限流并非来自接口频率,而是来自账号权限变更、配额耗尽或调用凭证失效,那么“等一等再拉”这个前提就不成立。此时表现为:请求持续被拒,且间隔加长后仍无改善。
区分方法不是看请求量是否归零,而是看错误类型是否随等待时间变化。频率限流通常会在等待后恢复;权限或配额问题不会因为等待而恢复。请求量归零也可能只是脚本提前退出了,不能单独作为判断依据。
遇到这种情况,保护已有结果的动作不变,但下一步要换成核对调用凭证与配额状态,而不是继续调重试参数。具体工具的错误码含义和配额规则需要以该工具当前文档为准,不同工具并不一致。
与其在限流发生后临时抢救,不如让脚本本身就具备抗中断能力:逐条或逐页追加写入、每条记录带唯一标识、写入完成后才更新断点、原始响应与解析结果分开存放。这样任何一次中断,损失上限都只是当前这一条。
做完这一步,再回头看限流本身:它从一个“数据可能全丢”的危机,降级为“进度暂时变慢”的调度问题。后续无论选择补拉、换时段,还是先出阶段性结论,你手里始终有一份可复核的存量结果。