先保住已经拿到的数据,再决定要不要继续请求。脚本遇到限流时,最危险的动作不是停下来,而是让程序继续重试并把内存里的结果覆盖掉。正确顺序是:立即停止新增请求,把当前批次结果落盘并标注完整性,然后再判断是降速续跑还是换查询方式。
看到返回变慢、空结果增多或报错集中出现,不要直接认定账号被封。常见原因有两类:一类是工具或接口对单位时间内的请求次数做了限制,另一类是脚本并发过高、参数构造有误,导致大量无效请求被拒绝。这两类现象相似,处理方式却不同。
能区分它们的证据是:把并发降到单线程、把间隔拉长后,如果请求恢复正常,说明是频率触发;如果仍然失败,且失败集中在某个参数组合或某类关键词上,说明是脚本构造问题。前者要改调用节奏,后者要先修脚本再发请求。判断清楚之前,不要反复重试,否则会把可恢复的限流拖成更长时间的封锁。
假设脚本正在批量查询一批词,跑到中途开始大量失败。此时有两个看似合理的做法。
选择条件是:如果已完成比例较高、结果字段多且重新获取成本大,选B;如果只是刚开始跑、失败任务占多数,选A更省事。但无论选哪个,落盘动作都应先于重试动作。动作本身很简单:每完成一批就写一次文件,并附上时间、任务标识和完成状态。这样做的结果是,即使后面全部失败,你手里仍有一份可用的部分结果,下一步可以只针对缺失部分补查,而不是从头再来。
只保存排名数字不够。至少保留:查询词、查询时间、结果状态(成功/失败/未查)、以及本次运行的任务批次标识。任务批次标识的作用是,当后续补查产生新数据时,你能按时间顺序判断哪条更新,而不是让新结果无条件覆盖旧结果。
写入方式上,优先追加而不是整体重写。整体重写意味着每次保存都要把全部结果重新序列化,中途出错就可能留下不完整文件。追加写入配合每行一条记录,即使进程中断,前面已写入的行仍然有效。这一步的结果是,限流造成的损失被限制在最后一批未写入的数据上,而不是全部结果。
恢复后不要立刻按原并发继续。先做一次小批量试探:取少量之前失败的任务,用降低后的频率跑一遍,观察是否稳定。如果稳定,再按剩余任务清单继续;如果仍不稳定,说明限制还没解除,继续等待比强行请求更划算。
续跑的依据是任务清单里标记为失败或未查的条目,而不是凭记忆。这样做的结果是,已经成功的任务不会被重复请求,既减少触发限流的概率,也避免新旧结果混在一起难以判断。若工具侧的限制周期未知,把续跑拆成多个小批次、每批之间留出间隔,比一次性补完更可控。
以上方法适用于脚本自行管理请求节奏、结果由本地保存的情况。如果工具本身提供导出功能或任务状态查询,具体入口和字段需要以该工具当前实际界面为准,不同工具差异较大,不能套用同一套字段假设。限流的具体触发条件、恢复时间和是否影响账号,也应以工具方说明或实际观察为准,不要根据单次现象推断固定阈值。