先给结论:限流发生时,最该保护的不是“继续查完”,而是已经拿到的结果和已经确认的进度。正确动作是立即停止重试,把内存中的结果落盘,并记录本次中断的边界;否则后续重试很可能覆盖旧数据、打乱分页顺序,甚至让整批查询作废。下面从一个反直觉现象切入,说明两种解释和可核对的证据。
脚本跑 SEO排名查询时,常见一个矛盾:日志里 429 或超时明显增多,但最终结果文件的条数却比上次更多。直觉会说“限流没影响,数据还更全了”,但这个判断很可能是错的。
原因在于,限流返回的失败响应如果被脚本当成空结果写入,文件条数会增加,但其中混入了大量“未查到”的占位记录。条数变多不等于覆盖变好,反而可能让后续分析把失败误判为排名下降或消失。
如果工具在限流后仍返回了可识别的错误码,脚本也正确跳过了这些请求,那么失败只是让本次任务变慢或未跑完。已有结果仍然可信,只是覆盖不完整。
如果脚本把超时、空响应或错误页统一转成“无排名”,那么文件里会多出大量假阴性。此时条数增加是污染信号,不是数据变全。
不要只看总条数,要看失败记录和成功记录是否被分开保存。能区分解释的证据包括:
如果错误日志里能对上失败次数,且结果文件里没有对应占位记录,解释一成立;如果结果文件条数增加但错误日志为空或对不上,解释二更可能成立。
遇到限流时,按以下顺序处理,每一步的结果都会影响下一步:
做完第 2 步后,即使脚本被终止,也能从临时文件恢复;做完第 3 步后,重试不会重复消耗已成功的请求;做完第 5 步后,才能判断本次数据是否可用于后续分析。
假设一次 SEO排名查询任务计划查 200 个词,跑到第 120 个词时开始频繁超时。若脚本把超时写成“无排名”,结果文件会有 200 条,但其中 80 条是假的;若脚本把超时写入错误日志并停在 120 条,结果文件只有 120 条,却全部可信。前者看起来“完整”,后者才适合继续分析。这里的数字只用于说明比较方法,不代表任何真实任务规模。
如果错误日志完整、成功结果字段齐全、中断位置明确,可以从断点继续,不必重跑全部。如果结果文件里已经混入占位记录且无法区分来源,最稳妥的做法是保留原始文件作为证据,另起一份干净结果重跑缺失部分。不要直接在污染文件上修补,否则后续无法判断哪些值是真实的。
限流本身不是数据损坏的证明,条数增加也不是数据变全的证明。把成功结果、失败记录和中断位置分开保存,才能在下一次调用前知道该继续、该重试,还是该重跑。