先给结论:限流发生后,第一动作不是继续重试,而是立即停止发起新请求,把已经拿到的结果落盘并标记采集进度,再判断是切换到低频队列还是等待窗口恢复。继续硬跑会把有限额度消耗在重复请求上,反而让已有结果失去可续接的上下文。
假设你用某款百度SEO软件批量查询一批页面的收录与标题状态,脚本跑到中途开始返回失败或空结果。此时你手上有两部分数据:一部分是已经成功写回的结果,另一部分是尚未完成的队列。限流本身不区分这两者,但你的处理方式会决定前者还能不能用。
这里要区分两种失败:一种是明确的限流提示或连续失败,另一种是返回速度骤降、结果字段变空。后者未必是限流,也可能是目标页面本身变化或解析规则失效。先看失败是否集中出现在同一时间段、同一批请求上,再决定按限流处理还是按解析问题处理。
停跑的动作很具体:终止脚本循环,把内存中未写入的结果强制写盘,记录最后成功处理的标识(如URL或任务序号),并保留失败请求的原始响应。这样做的结果是,下一次运行时可以从断点继续,而不是从头重跑。
代价是当天的采集量会明显低于预期,如果任务有交付时间,需要重新排期。适合的场景是:这批结果后续要用于人工核查或页面修改,重复采集成本高,且数据之间存在关联(比如同一站点的多个页面要放在一起看)。
判断是否值得停跑,可以看一个信号:如果已成功的结果已经覆盖了大部分目标,继续补全的边际价值低,停跑更划算;如果才刚开始就限流,说明请求节奏本身有问题,停跑同时还要调整间隔。
另一种做法是保留脚本运行,但把请求间隔调大、并发调低,让队列以更慢的速度推进。动作是修改脚本里的等待时间和并发数,然后观察一小段请求是否恢复成功。
这个选择成立的条件是:限流是短时的,且你的任务允许拉长到数小时甚至跨天。它的风险在于,如果限流阈值与账号或IP绑定,降频未必能恢复,只是把失败摊薄到更长时间里,反而更难判断问题边界。
一个可区分的证据是:降频后前若干个请求恢复正常,说明是节奏问题;如果降频后仍然连续失败,说明问题不在频率,继续跑没有意义,应回到选择一。
保护不是把数据留在内存里,而是让它可被下一次运行识别和续接。至少要做到三点:
如果脚本每次启动都会清空输出文件,那已有结果实际上没有被保护,限流一次就等于前功尽弃。检查这一点比调整请求参数更优先。
这套顺序的核心是:先保住已有结果,再决定要不要继续。限流只是外部约束,真正会毁掉工作的是没有断点和落盘机制的脚本。具体工具的限流表现和恢复方式需要以你实际使用的版本为准,不要照搬他人参数。