先保留已有结果,把“继续跑”改成“受控续跑”:脚本收到限流信号后不再按原频率请求,而是把已完成部分落盘、记录断点,再用更低并发和更长间隔只补缺口。直接停掉整批会丢掉可用的中间数据,硬撑着继续跑则可能把临时限流拖成更长时间的封禁。取舍的关键不在工具本身,而在你能否把“已获得的结果”和“还缺的请求”分开管理。
同一个报错,原因可能完全不同:请求频率过高、单账号配额用尽、目标站点对脚本特征做了拦截、网络出口被限制,或者对方服务临时不稳定。这几种情况对“已有结果”的影响不一样。频率类限流通常等一段时间就能恢复;配额类限流往往要等到下个周期;异常拦截则可能持续,继续重试只会加重。判断依据可以看响应码、响应体提示、重试后是否立刻再次失败,以及失败是集中在某个接口还是全站。这些现象只能作为线索,不能单独证明某个原因成立,因为对方调整策略、脚本并发突增、缓存失效都可能产生相似表现。
做法一:整体暂停,等限流窗口过去再从头或从断点重跑。它适合请求量不大、结果可重算、且重跑成本低的场景。代价是等待期间没有新数据,如果任务依赖时效,暂停本身就可能让结果失去价值。
做法二:保留已完成结果,降速续跑剩余部分。它适合数据量大、已抓部分难以重算、或缺口集中在少数页面的场景。代价是任务时间被拉长,而且如果限流原因是账号级配额,降速并不能解决,只会一直撞墙。
选择条件可以压成三条:已抓结果是否难以复现;限流是频率型还是配额型;剩余缺口占总量的比例。三者中只要“结果难复现”成立,就优先保结果;如果确认是配额型且缺口很大,暂停到配额恢复往往比降速硬跑更划算。
假设你用脚本对一批页面做状态码和标题采集,共 5000 条,跑到 3200 条时开始连续返回限流提示。此时不要清空重来,也不要把并发从 10 直接降到 1 继续冲。可以这样处理:先把已完成的 3200 条连同请求参数、时间戳写入本地文件,形成断点清单;再把剩余 1800 条按优先级排序,只保留真正需要的字段;然后把并发降到原来的三分之一、请求间隔拉长,先跑 50 条观察是否还触发限流。如果这 50 条通过,说明更像频率型限流,可以维持低速续跑;如果仍然立即失败,就停止续跑,改为等待或换时间段,避免把临时限制变成更严的限制。这个例子里的数字只是用来说明比较方法,不代表任何平台的实际阈值。
保护结果的核心动作是落盘和可恢复,而不是“保存一下”。具体要做到:每条结果带唯一标识,便于去重和比对;记录断点位置,让下次从缺口开始;把失败请求单独存成待办列表,而不是混在成功结果里;对结果做一次校验,比如字段是否完整、状态码是否合理,避免把限流返回的错误页当成正常数据存进去。做完这一步,你才能判断“续跑”到底补了多少、还差多少,进而决定是继续低速跑还是整体暂停。如果校验发现大量结果其实是错误页,那“已有结果”的价值就要重新评估,这时整体重跑反而更干净。
续跑一小批后,看三个信号:失败率是否下降、成功请求的响应时间是否稳定、缺口是否在缩小。失败率下降且缺口缩小,说明降速有效,可以保持当前节奏直到完成。失败率不降或反复波动,说明限流不是单纯频率问题,应停止续跑,转为等待或调整请求来源。缺口不再缩小但也没有新失败,可能是脚本逻辑问题,需要先查断点清单是否写错,而不是继续加请求。每次调整只改一个变量,才能分清是间隔、并发还是目标站点状态在起作用。这样做的结果是,你能在一到两轮观察内确定该停还是该续,而不是靠感觉反复试。