结论先说:如果限流只是短时封堵、已有结果已经落盘,优先做“增量续跑”;如果限流伴随会话失效或返回数据明显错乱,应停止续跑,先冻结已有结果并做一致性校验。判断依据不是请求失败的数量,而是失败是否改变数据可信度。
脚本调用排名查询接口时,常见的限流表现有两类。第一类是明确拒绝:返回频率超限、稍后重试或连接被断开,但此前拿到的字段结构完整。第二类是隐性异常:请求看似成功,但返回空值、重复值或与上一轮差异过大。两类情况的处理方式完全不同。
如果属于第一类,已有结果通常仍可保留。此时应把已完成部分写入独立文件或数据表,记录每个查询对象的完成状态,再按剩余队列继续。动作要点是:把“已成功且字段完整”的记录标记为完成,把“失败但未污染”的记录放回待跑队列。这样做的结果是,下一次运行只处理缺口,避免整批重跑带来的再次限流。
如果属于第二类,继续续跑会把不可信数据混入已有结果。此时应暂停脚本,保留原始响应样本,先做字段完整性检查和前后轮差异比对。只有确认异常来自限流而非查询对象本身变化,才考虑重新拉取。
保护已有结果的核心不是“多存一份”,而是让新旧结果可区分。建议在结果中至少保留三个信息:查询对象标识、采集时间、数据来源轮次。这样即使后续续跑,也能判断某条记录是旧结果、补跑结果还是重试结果。
冻结时可以按以下顺序处理:
这个动作的结果是,已有结果不会被半途失败冲掉,后续也能明确知道哪些对象需要补查。若不做冻结,直接重跑并覆盖,一旦再次限流,可能连上一轮可用结果也丢失。
假设脚本依赖登录态或临时凭证调用查询接口,限流后返回的“成功”响应里,字段名仍在但值为空。此时如果只看状态码,很容易误判为可续跑。实际应检查响应体中的关键字段是否为空、是否全部相同、是否缺少原本稳定存在的标识字段。
一旦发现这些迹象,正确动作是停止续跑,先保存当前会话下的原始响应,再重新建立会话后小批量验证。若小批量验证仍异常,说明问题不在限流本身,而在调用方式或凭证状态。此时继续补跑只会产生更多不可信记录。
限流缓解后,不要立即全量重跑。先取一小批此前失败的查询对象,按原参数补跑,并与冻结结果做字段级比对。比对通过后,再扩大补跑范围。若比对不通过,应回到调用参数、会话状态和返回结构上排查。
这套顺序的关键在于:限流本身不必然损坏已有结果,真正需要保护的是结果的可追溯性。只要每轮结果可区分、缺口可定位、补跑可验证,就不需要因为一次限流推翻全部数据。反之,如果失败已经影响字段可信度,冻结和校验比继续跑更重要。