结论先说:如果限流发生在脚本已经拿到一部分结果之后,正确动作是先把已取回的数据落盘并标记为“不完整快照”,再决定是否重试;如果限流发生在任务开始阶段、还没有产生任何可用结果,则不必抢救,直接改为分批调度更划算。这个判断的关键不是限流本身,而是“已有结果是否具备独立使用价值”。
限流保护的第一步不是换IP,也不是调低并发,而是确认手里这批数据处于什么状态。常见有三种:
只有第一种值得优先保护。对第二种,应该把不完整字段显式标记为空,而不是用默认值填充,否则后续汇总会把缺失当成零,得出错误结论。第三种则直接丢弃,保留游标位置即可。
实际操作上,可以让脚本每完成一批就追加写入一个带时间戳的文件,并在文件头记录该批的请求参数和完成状态。这样即使进程被限流中断,下一个进程也能从最后一个完整批次继续,而不是从头重跑。
很多人遇到限流的第一反应是加延时后原样重试,但这一步是否成立,取决于已有结果会不会被覆盖。
如果脚本是覆盖写入,重试会冲掉之前拿到的数据,此时应先关闭覆盖,改为追加或写入新文件。如果脚本是追加写入,重试相对安全,但仍要防止同一批数据被重复写入两次。可以在每条记录里保留一个批次标识,重试前先检查该批次是否已经落盘。
另一个分岔点是限流信号的类型。如果返回信息明确表示“请求过于频繁”,通常说明短时间窗口内调用次数超限,降低频率后继续是合理的。如果返回信息表示“配额已用尽”,则当天继续重试大概率无效,应该把剩余任务排到下一个可用周期,而不是持续空转。
这里有一个反例需要记住:如果已有结果本身就是过期数据,保护它反而有害。 比如抓取的是价格、库存、排名这类时效性强的字段,隔了几个小时再续跑,新旧数据混在同一份结果里,会让后续判断失去基准。这种情况下,正确做法是放弃旧结果,重新开始一轮完整采集,而不是抢救半份快照。
可以按下面的顺序处理一次限流中断:
其中第2步和第6步是影响下一步的关键。完成落盘后,后续动作从“重新采集”变成“补采缺口”;没有落盘,后续只能从头再来。补采缺口时,请求参数必须和上一轮保持一致,否则新旧结果无法合并比较。
假设某次脚本任务计划取回1000条记录,限流时已成功写入420条,其中400条字段完整、20条缺一个字段。此时有两种选择:
两种选择都成立,区别在于数据是否允许跨时间拼接。判断依据可以简单化为:如果这份结果晚几个小时再用,结论会不会变?会变,就选第二种;不会变,就选第一种。
需要说明的是,具体工具在限流提示方式、配额周期和重试建议上并不统一,上述判断是通用原则,实际阈值和返回含义需要以所用工具的当前说明为准。
先检查现有脚本的写入方式:是覆盖还是追加,是否记录批次标识。如果这两点都不满足,优先改造写入逻辑,再谈重试和调度。改造完成后,用一次小规模任务验证中断后能否从断点继续,确认无误后再放回正式任务。这一步做完,限流带来的损失才从“整批重来”缩小到“只补缺口”。