遇到限流时,第一原则不是继续重试,而是先把已经拿到的结果落盘并冻结,再决定是等待、降速还是切换数据来源。判断依据是:你手里的是可复现的原始响应,还是只剩一份无法追溯的汇总表。前者可以安全暂停,后者必须立刻补录。
如果脚本每次调用都能返回同一批字段,且调用参数完整记录在日志里,那么限流只是进度问题。此时应停止循环,把已写入的响应文件标记为“部分完成”,同时保存当次请求参数、时间戳和返回状态码。下一次从断点续跑,不需要重新抓取已经成功的条目。
如果返回内容包含动态排序、个性化推荐或随时间变化的计数,那么已抓到的片段可能无法再次获得。这种情况下,保护已有结果意味着立即转存为不可变副本,并记录抓取时刻。后续任何补抓都要视为新增批次,而不是覆盖旧批次。
执行完这三步后,下一步的选择会变得清晰:如果校验通过且断点完整,等待限流窗口结束后续跑;如果校验不通过,则需要重新设计请求粒度,而不是加大重试频率。
条件一:限流是短时的,且已有结果覆盖了核心字段。此时选择等待并降速续跑。动作是把并发数调低、请求间隔拉长,并设置单次运行的最大请求数上限。结果是单轮完成量下降,但已有结果不会因反复失败而被覆盖或截断。
条件二:限流持续,且已有结果只覆盖了次要字段。此时选择停止调用,转为人工导出或改用其他已授权的数据来源。动作是先冻结当前文件,再评估哪些字段必须补齐、哪些可以放弃。结果是项目范围可能缩小,但不会因为强行续跑而触发更严格的限制。
两种选择的共同前提是:你已经能区分“已成功保存”和“仅显示在内存中”。如果脚本把结果暂存在变量里,限流导致的进程退出会直接丢失全部内容,这种情况下任何策略都无从谈起。
有些限流表现为返回空结果或错误码,而不是明确的拒绝提示。空结果不等于没有数据,也不等于已有结果正确。应结合请求参数和返回状态判断:如果同一参数在限流前有返回、限流后变为空,优先怀疑限流,而不是数据消失。
另外,请求量下降或抓取量归零,不能单独证明你的保护动作生效。它也可能来自目标站点结构变化、网络中断或调用凭据失效。要确认原因,至少需要同时看请求日志、返回状态和本地文件写入记录三项。
如果脚本依赖的接口或工具来自第三方,其限流规则、配额和返回格式可能随时调整,具体信息需要以该工具当前公开的文档或控制台提示为准。在未核实之前,不要把某一次的成功参数当作长期可用的配置。
最后,保护已有结果的目的是让下一步决策有依据。当你确认已有批次完整、断点可续、校验通过时,再决定等待还是换源;当确认结果不可复现且覆盖不足时,尽早缩小范围比反复重试更稳妥。