先保住已经拿到的数据,再决定要不要继续跑。遇到限流时,最危险的动作是让脚本原地重试并把内存里未落盘的结果一起丢掉。可行做法是:每查完一批就立即写入本地文件,限流触发后停止发起新请求,只对失败项做补查;补查前先确认限流是临时的还是配置本身有问题。下面用一个假设情境把决策过程走一遍。
假设你用脚本对两千个词做百度排名批量查询,每批五十个词,脚本在内存里累积结果,全部跑完再统一写文件。跑到第六百个词时,工具开始返回限流类错误,脚本按默认逻辑重试三次后退出,此时前六百个词的结果随进程结束一起消失,只剩日志里几行错误信息。这个情境的关键失误不是被限流,而是结果没有及时落盘。限流本身是外部约束,能不能保住成果取决于你自己的写入策略。
把写入时机从“全部跑完”改成“每批跑完”,同样的限流只会让你损失当前这一批。这个改动很小,但它决定了下一次运行是接着补六百到两千,还是从零开始。
停止重试后,不要立刻换 IP 或加并发硬冲,先做一次小规模试探:隔一段冷却时间,只发一批请求,观察返回是否恢复正常。可能的结果有三类,对应不同处理。
这里要提醒一点:请求量突然归零或错误数突然上升,并不能单独证明你判断对了原因。网络抖动、目标页面改版、脚本解析规则失效都会产生类似现象。所以试探之后要结合返回内容一起看,而不是只看错误计数。
落盘之后,用一个状态字段区分每条记录,而不是只保留成功项。建议至少分三类:已完成(拿到了可用的排名数据)、待补查(因限流未发出或明确失败)、需人工确认(返回了内容但格式异常、疑似解析错误)。第三类最容易被忽略,很多人把它直接当失败重跑,结果反复消耗请求额度。
具体动作是:脚本每批写入时同时记录该批的状态和时间戳;限流发生后,先统计三类各有多少条。如果待补查只有几十条,直接补查即可;如果待补查占了大头,说明限流发生在早期,此时更该先解决触发条件,而不是带着同样的参数重跑一遍。这个统计结果会直接决定下一步是先调参数还是先补数据。
补查阶段的目标是拿回缺失数据,不是追求速度。把批量调小、并发降到更低,必要时在批次之间加入固定间隔。判断是否有效的依据不是“这次没报错”,而是连续若干批都稳定返回且内容完整。如果降速后仍然触发限流,就不要再继续试探,转而核对工具当前的使用说明和额度状态,因为此时问题很可能不在你的调用节奏上。
另外,补查只针对待补查项,已完成项不要重跑。重跑不仅浪费额度,还可能因为两次查询时间不同而产生数据不一致,让后续对比失去意义。如果确实需要统一时间口径,就整体重跑,并明确记录这是一次全新的数据快照。
这次处理完之后,把三个改动固化进脚本:每批结束立即追加写入本地文件;限流错误单独识别并停止新请求,而不是混在通用重试里;启动时读取已有结果文件,自动跳过已完成项。这样即使再次被限流,损失也只限于当前批次。假设同样两千个词、同样在第六百个词被限流,改造后你只需要补查第六百到两千这一段,前面的结果可以直接复用。
至于限流的具体触发条件、额度上限和冷却时长,不同工具的设定并不相同,也没有通用数值可套,需要以你所用工具当前的说明为准。把写入和补查逻辑做扎实,比猜测阈值更可靠。