限流发生时,最危险的动作不是等待,而是立刻重试并覆盖上次输出。要保护已有结果,先把“已拿到的数据”和“本次待补的数据”分开存放:让脚本只追加到新文件或新分区,旧结果保持只读。这样即使后续调用全部失败,你仍有一份可交付、可核对、可继续补跑的中间结果。
很多站长会遇到一种反常情况:脚本跑完提示大量请求被拒,但最终文件比上一次还小。常见解释有两种。
第一种是覆盖写。脚本每次启动都用同一个输出路径,以写模式打开,限流导致本次只写入少量记录,却把上一次的完整结果冲掉了。第二种是并发写冲突。多个任务或定时实例同时写同一文件,后启动的进程截断了先启动进程尚未落盘的内容。
这两种解释指向不同的补救方向:前者要改输出策略,后者要改调度与锁。先分清是哪一种,再决定下一步动作。
可以查三类痕迹。
需要提醒的是,请求量骤降或某次抓取归零,并不能单独证明限流就是唯一原因。网络中断、目标站点临时不可用、脚本自身异常退出,都会产生类似现象。因此证据要交叉看,不要只凭一条报错下结论。
无论属于哪种原因,都可以先做一件低成本的事:把输出改成“按批次追加、按批次封存”。
result-20250101-01.jsonl,而不是复用固定文件名。这个动作的结果是:限流只会让当前批次变短,不会破坏历史批次。下一步补跑时,只需读取状态文件,从未完成的位置继续,而不用重新全量拉取。
假设某站长用脚本分批调用一个查询工具,每批 100 条。第一次运行成功 80 条后开始大量报错,输出文件被写成了 80 条。第二次运行前,他没有改脚本,直接重跑,结果输出文件只剩 12 条。
如果按上面的方法改成批次文件,第一次会留下一个 80 条的完整批次,第二次即使只成功 12 条,也会生成一个新批次,两者并存。此时他可以根据状态文件判断:是等待一段时间后继续补第 81 到 100 条,还是先排查并发冲突。等待与改脚本这两个选择都成立,区别在于证据指向限流还是指向写入方式。
保护已有结果之后,还要决定补跑策略。若限流是短时的,按原批次继续追加即可;若限流持续,应缩小单批条数、拉长间隔,并把每次成功范围记录清楚。不要为了追求一次跑完而反复重试同一段,这既可能加重限流,也会让状态文件难以判断真实进度。
另外,涉及具体品牌工具的调用方式、额度、入口和当前功能时,应以该工具官方说明为准,不同工具的限制条件并不相同。本文给出的只是通用保护思路,不能替代对具体工具现行规则的核对。
最终要守住一条底线:任何一次调用失败,都不能让已经拿到的结果消失。把输出拆成不可变批次、把进度写进状态文件、把补跑限定在未完成区间,这三步做完,限流就只影响速度,不再影响你手里已有的成果。