结论有条件:如果限流发生在单次请求层面,而你已经把每次返回先落到本地再汇总,那么已有结果通常可以保住;但如果脚本把整批数据攒在内存里、最后一次写入,限流中断就可能让这一批全部作废。真正决定成败的不是限流本身,而是结果落盘和断点记录的时机。
限流可能来自接口调用频率、账号并发数、单次返回条数上限,也可能来自网络层重试风暴。不同层的表现相似,都是请求失败或返回空,但处理方式不同。可以用一组可区分证据来判断:
判断清楚之前,不要盲目加大重试次数。重试风暴会把局部限流放大成整段不可用,反而增加结果丢失风险。
最有效的动作不是优化重试,而是改变写入时机。把脚本从“全部取完再写”改成“每取得一条或一小批就追加写入”,并同时记录已完成的位置。假设一次任务要取 500 条,脚本在第 180 条遇到限流:
这个动作的结果直接影响下一步:有断点就能续跑,没有断点就只能整批重来,而整批重来很可能再次触发限流,形成循环。
用追加模式写入,并给每批数据带一个批次标识。如果脚本用覆盖模式,第二次运行会把第一次的结果冲掉,限流保护就失去意义。断点文件和结果文件要分开保存,避免结果写入失败时把断点也一起破坏。
已有结果保住了,不等于这批结果可以直接用于决策。限流期间可能只取到了部分关键词、部分时间段或部分设备条件,缺失的部分不会在文件里自动标注。常见误判是把“已取到的 180 条”当成全量样本,进而得出关于整体表现的结论。
可以做的核对是:把断点位置、计划总量、实际写入量三者对照。如果实际写入量明显小于计划量,任何基于这批数据的比例或趋势都只能当作局部观察,不能外推。请求量归零或返回变空,也可能只是查询条件写错、权限不足或接口临时调整,不能单独作为“数据已取完”的证据。
如果限流来自账号级封禁,而不是请求频率,那么边取边存只能保住封禁前的结果,续跑会持续失败。此时继续重试没有意义,需要先确认账号状态或更换调用身份。另一种失效情形是结果本身依赖一次完整快照:例如需要同一时间点的全量对比,分批取回的数据时间戳不一致,拼起来会产生偏差。遇到这两种情况,保护已有结果的做法仍然成立,但“续跑即可完成”的假设不成立。
限流发生后,第一步是把当前结果和断点固化下来,不要立刻重启脚本。第二步核对失败类型:是频率、并发、权限还是账号状态。第三步再决定续跑、降速重跑还是放弃这批数据。如果选择续跑,先降低并发和请求频率,观察前若干条是否稳定写入,再逐步放开。这样即使再次限流,损失也只限于新增部分,而不是全部结果。