限流发生时,最该做的不是立刻重试,而是先把已经拿到的结果固定下来,再判断这次限流属于临时波动还是配额边界。保留、改写、退出这三个选择没有绝对优劣,区别在于你手上的数据是否可复现、任务是否可拆分,以及继续调用会不会让已有结果失去一致性。
脚本收到的限流反馈通常表现为请求被拒、返回内容变短、响应时间明显拉长,或同一批参数的结果开始缺失。这些现象可能来自短时间请求过密,也可能来自账号或接口的周期配额已经用完,还可能是上游数据源本身不稳定。仅凭一次失败无法区分,需要看时间分布。
一个可操作的判断方法是:把失败请求的时间戳、参数和返回状态记下来,观察失败是否集中在某个时间窗口。如果间隔拉长后同一参数能正常返回,更接近节奏问题;如果无论怎么放慢都在同一位置失败,更接近配额或权限边界。这里要注意,抓取量归零或失败率上升本身不能证明是限流,也可能是参数写错、字段改名或网络中断,必须用对照请求排除。
只要脚本已经跑出一部分结果,第一步就是落盘,而不是继续在内存里追加。落盘时要同时保存三样东西:原始返回、请求参数、采集时间。这样后续即使重新调用,也能判断新旧结果是否来自同一口径。
建议在结果文件里加一个完整度字段,例如 status: partial 或 status: complete,并记录已覆盖的参数范围。假设一个脚本计划查询 200 个词,限流前完成了 120 个,那么这 120 个结果可以用于趋势观察,但不适合直接当作全量结论。保留的价值在于:它让你在限流解除后只需补齐缺口,而不是整批重跑,也避免新旧数据混在一起导致口径漂移。
适用前提是这些结果本身可复现,且参数没有在中途改动。如果脚本在限流前刚调整过请求字段,那么前后两段结果的比较意义有限,保留时应分开存放。
如果判断更接近节奏问题,改写脚本比被动等待更有效。常见做法包括:把批量查询拆成更小的批次,把并发数调低,把重试间隔改为递增而不是固定值,并给每个请求设置超时上限。这些改动的目的不是绕过限制,而是让调用节奏更接近可持续状态。
改写时要保留一个对照批次:用同一组参数分别跑旧节奏和新节奏,比较成功率和返回内容是否一致。如果新节奏下结果字段出现缺失,说明改写影响了数据完整性,这时应回退到保留策略,先保住已有结果,再重新评估。改写适合任务可以拆分、且你愿意用更长时间换取稳定性的场景;如果任务本身有明确截止时间,改写可能不是最优选择。
退出不是放弃,而是在证据指向配额边界或权限问题时,避免把时间消耗在无效重试上。触发退出的典型信号包括:同一参数在多个时间窗口反复失败、返回内容明确提示额度或权限、以及继续调用会导致已有结果被覆盖或混淆。
退出前应做两件事:一是把当前结果导出为独立文件并注明采集区间;二是记录最后一次成功请求的参数位置,作为下次续跑的起点。这样即使隔一段时间再处理,也不需要重新推导进度。退出适用于任务不紧急、且你无法确认限流何时解除的情况。它的代价是结果暂时不完整,收益是不会因为反复失败而污染已有数据。
无论选择保留、改写还是退出,下一步动作都应由一组可核对的证据决定,而不是由单次失败决定。可以按下面的顺序检查:
如果放慢后恢复,优先改写节奏并续跑;如果反复失败且提示额度,优先退出并保留缺口记录;如果结果已覆盖关键部分,可以先用部分结果推进,把补齐留到限流解除之后。关键是把“继续调用”当成一个有条件的动作,而不是默认动作。已有结果一旦落盘并标记完整度,后续无论重试还是换工具,都有可比较的基线,这比在限流中反复试探更能保护前期投入。