限流发生后,先别急着换 IP 或加并发。更稳的做法是:立刻停止新请求,把已经拿到的响应按“可复现”标准落盘,再用一组小规模探测判断限流是配额耗尽还是行为触发。如果响应仍带完整字段,已有结果通常能继续用于分析;如果返回的是空壳或错误页,继续跑只会污染数据集。
脚本被限流时,常见的矛盾是:日志里大量报错,但本地文件里已经积累了一批看起来正常的记录。这时有两种解释。
第一种是配额型限流:单位时间内的调用次数达到上限,超出部分被拒绝,但此前返回的数据本身完整、字段齐全,只是覆盖范围不完整。第二种是行为型限流:请求频率、并发、请求头或访问路径被判定为异常,后续响应可能被替换成验证页、空结果或降级数据。两者的关键区别不在报错数量,而在已落盘记录的字段完整度和可复现性。
能区分这两种解释的证据有三类:
限流当下最重要的动作不是恢复请求,而是把内存中的结果原子化写入磁盘。具体做法是:暂停调度器,等待正在执行的请求返回或超时,然后把结果写入带时间戳的临时文件,确认写入成功后再合并到主数据集。这个动作的结果直接影响下一步——如果落盘成功且字段完整,你可以只补缺失区间;如果落盘失败或字段残缺,就必须整段重跑,而不能在旧数据上追加。
落盘时要保留三类信息:原始响应、请求参数、抓取时间。缺少请求参数,后续无法判断某条记录对应哪个查询条件;缺少抓取时间,无法判断数据是否落在可接受的时间窗口内。
在恢复脚本之前,用单线程、低频率重放少量已成功的查询,而不是直接从未完成的位置继续。探测的目的不是拿新数据,而是确认当前返回是否仍与历史结果同构。
假设你原本每分钟发 60 次请求,限流后改为每 10 秒 1 次,连续探测 5 次。如果 5 次返回的字段结构和值与历史一致,说明接口行为没有根本变化,可以从断点续跑,并把并发降到探测时的水平。如果出现字段缺失、结果为空或返回内容与查询无关,说明当前环境已经不可信,此时续跑只会把污染数据混入已有结果,应该先修复请求特征,再考虑重跑缺失区间。
这里的数字只是说明比较方法,不是建议配置。实际阈值需要根据你自己的历史成功响应来定。
以下条件同时出现时,已有结果不适合继续用于决策:
反过来,如果字段结构一致、重放可复现、错误记录能被参数过滤掉,那么已有结果可以作为部分覆盖使用,但要在分析时明确标注缺失区间,不能把部分数据当成全量结论。
限流不是一次性故障,而是脚本长期运行要面对的条件。下一次运行前,至少要让脚本具备两个能力:一是遇到连续拒绝时自动暂停并落盘,而不是继续重试;二是记录每次运行的请求参数和响应摘要,以便事后判断某批数据是否可用。具体工具是否提供断点续传、配额查询或请求日志,需要按你实际使用的工具核对,不同工具的接口和限制并不通用。
最终判断标准可以归结为一句话:已有结果能否复现,比它有多少条更重要。能复现的部分可以保留并标注覆盖范围,不能复现的部分应当隔离,而不是混入主数据集继续使用。