限流发生时,最该做的不是立刻重试,而是先冻结已经拿到的数据,再判断哪些结果可信、哪些需要补跑。对旧内容或旧合作关系,你不需要把整批外链重做一遍,只要保住仍然有价值的那部分,并把脚本改成可续跑的状态。
脚本被限流后继续高频重试,通常只会把错误状态扩散到更多请求上,还可能让原本成功的返回被覆盖成失败记录。正确顺序是:停止写入,把当前结果落盘为只读快照,再区分限流来源。
常见的限流信号有三类,对应的处理方向不同:
把这三类混在一起处理,是脚本续跑失败的主要原因。冻结快照后,先统计失败集中在哪个维度,再决定下一步动作。
限流保护的核心,是让脚本知道“这条已经拿到、不用重跑”。假设你手里有一份旧页面清单,每条记录包含目标地址、外链类型和状态字段,可以按下面的方式改造:
pending、done、failed、skipped。done 的记录才写入最终结果文件,其余保留在待处理队列。done 记录,只处理 pending 和 failed。failed 记录单独存放,并记录失败原因,避免和从未尝试的记录混在一起。这样做的直接结果是:限流恢复后重新运行,脚本不会重复请求已经成功的地址,也不会因为一次失败就丢掉整批进度。你付出的代价是多维护一个状态文件,但换来的是可中断、可恢复的执行过程。
假设你有一批 200 条旧外链记录,脚本跑到第 80 条时开始大量失败。冻结快照后你发现:前 60 条成功,第 61 到 80 条部分成功,之后全部失败。此时不要直接重跑全部 200 条。
更稳妥的做法是:把前 60 条标记为 done,把第 61 到 80 条逐条核对状态,只把确实没有返回结果的标记为 pending,其余全部标记为 failed 并记录原因。下一次运行时只处理 pending 和 failed。这个假设例子的关键不是数字,而是判断依据:已成功且可验证的结果优先保留,失败记录必须带原因,不能靠重跑碰运气。
如果失败原因是目标域名反爬,那么这批记录即使重跑也很可能继续失败,此时应把它归入 skipped,等确认该域名策略变化后再单独处理,而不是让它拖住其余任务。
面向旧内容或旧合作关系,限流反而是一个筛选时机。你可以借这次中断,把外链结果分成三类:仍然指向有效页面、指向已失效页面、指向已改变主题的页面。第一类保留并标记完成,后两类不急于补跑,先确认是否还值得维护。
具体动作是:导出冻结快照,按目标地址逐条打开核对,把仍然有效的记录写回最终清单,把失效或主题不符的记录移入待评估文件。这个动作的结果会直接影响下一步——只有保留清单确定后,才值得为剩余部分调整脚本参数并重新运行。否则你只是在为一批已经没有价值的目标消耗请求额度。
限流解除后原样重跑,很可能再次触发同样的限制。恢复前至少做两件事:降低并发数和拉长请求间隔,并把失败记录与正常队列分开处理。如果工具本身提供配额或频率设置,具体名称和位置需要以你实际使用的版本为准,不要照搬他人截图。
对未知来源的工具,判断其是否适合续跑,看三点即可:能否导出中间结果、能否按状态跳过已完成项、失败信息是否足够定位原因。三点都满足,限流就只是一次中断;缺少任何一点,你都需要在脚本外层自己补上状态管理,否则每次限流都等于从头再来。