先给结论:限流出现后不要立刻重跑全量脚本,也不要直接清空任务表。更稳妥的顺序是保留已有结果并标记完整度,再把剩余请求改写为低频、可续跑的分片,只有在限流持续且续跑成本高于重新规划时才退出。下面按“保留—改写—退出”三种取舍展开,说明各自适用条件和可核对的动作依据。
限流通常不是单一原因。常见信号包括返回状态码变化、响应体出现速率提示、请求延迟突然拉长、部分分页缺失、同一参数重复请求结果不一致。它们指向的解释不同:可能是单位时间请求过多,也可能是并发连接数过高、单次返回条数过大、鉴权凭证失效,甚至只是上游数据源临时波动。把“请求失败”直接等同于“工具不行”,容易做出错误取舍。
可核对的区分方法是做小规模对照:固定关键词样本,分别降低并发、缩小单次返回量、拉长间隔,观察失败是否随某一项变化而减少。如果降低并发后成功率回升,限流更可能来自连接层;如果缩小返回量才改善,问题更可能在单次负载。这个对照不需要完整重跑,只用几十条请求即可判断方向。
保留的适用前提:已有结果能按关键词、分页、时间戳对应回原始请求,且缺失部分可以明确标记。此时应先把结果落盘为带状态字段的文件,例如status=ok、status=rate_limited、status=missing,而不是只保留成功行。这样后续续跑时才能只补缺失部分,避免重复消耗配额。
改写不是简单加个sleep。有效改写通常包含三类调整:降低并发数、把大批量拆成小批次、为每个批次记录断点。假设一个任务原本一次请求 500 条、并发 10 路,限流后改为每次 50 条、并发 2 路、批次间等待,那么总请求数会增加,但单次触发限流的概率下降。这里的关键不是“慢就是好”,而是让失败范围可控:一批失败只影响一小段,不会让整轮结果作废。
改写前要确认工具或接口是否支持断点续跑、分页游标或时间窗口过滤。如果这些能力未知,具体功能需要以实际文档或测试为准,不能假定存在。没有断点能力时,改写只能减少失败概率,不能保证补齐结果,此时应评估缺失数据是否影响后续分析。
改写的适用前提:限流是间歇性的,且降低频率后能观察到成功率回升。如果降低到很低频率仍然持续失败,说明瓶颈可能不在请求频率,继续改写只是拖延。
退出不等于放弃数据,而是停止当前调用策略。适合退出的情形包括:多次降频后失败率没有改善;失败集中在鉴权或权限层;补齐缺失所需时间已超过重新设计任务的时间;或已有结果已足够回答当前问题,继续调用边际价值很低。
退出时至少做两件事:一是冻结当前结果并写明覆盖范围,例如覆盖了哪些关键词、哪些分页缺失;二是记录触发退出的证据,例如连续若干批次的失败状态。这样即使换用其他方式,也能知道哪些结论仍可用、哪些需要重做。请求量归零或抓取量下降本身不能证明处理正确,它们也可能来自任务已跑完、过滤条件变化或上游无新数据,必须结合状态记录判断。
回到最初的问题:遇到限流时,保护已有结果优先于追求请求数量。保留是为了不丢证据,改写是为了用可控成本补齐,退出是为了不在无效路径上继续消耗。三者不是按顺序全做一遍,而是根据限流信号和续跑成本选择其中一条。把状态和覆盖范围写清楚,后续无论续跑还是换方法,判断都有依据。