结论先说:如果限流只是让后续请求变慢或间歇失败,而已经取回的结果仍能按批次落盘、能定位到来源和参数,那么最该做的是停止重试、把已有结果封存并标记完成度;如果调用方把整批结果攒在内存里,限流一来进程被中断,已有结果就跟着丢失,此时保护重点不是继续请求,而是先改写入方式。下面把判断条件、失效反例和下一步动作拆开讲。
限流发生时,不同角色常对“结果还在不在”有不同理解。脚本作者看到的是内存里的对象,运维看到的是进程是否存活,业务方看到的是导出文件有没有生成。把分歧转成可核对的项目,至少要看三件事。
这三项都满足,限流通常只影响“还差多少没取”,不会毁掉已取部分。只满足第一项而缺少参数对应关系,后续合并多批结果时仍会出现重复或错配,等于没真正保住。
假设脚本先把所有返回结果追加到一个列表,循环结束后再统一写文件。中途触发限流,进程退出,列表随内存释放,文件从未生成。这时即使日志里能看到部分请求成功,也无法还原结果内容。这个反例说明:“调用成功过”不等于“结果被保护”,判断依据应是持久化动作是否发生在限流之前,而不是成功请求的数量。
另一个容易误判的情况是只把去重后的关键词写进文件,却丢掉了每个词对应的指标和抓取时间。后续想核对差异时,没有原始记录可比,只能重新请求,反而更容易再次撞上限流。保护已有结果的标准应包含原始返回,而不只是加工后的清单。
一旦确认触发限流,先停止自动重试,把当前批次标记为“未完成”,再把内存中尚未落盘的部分立即写出,哪怕格式粗糙。这个动作的结果是:进程即使随后被终止,也能从最后一个完整批次继续,而不是从零开始。
接着做一次覆盖度核对,用计划条数减去成功条数,得到缺口清单,并记录失败类型是限流、超时还是参数错误。缺口清单决定下一步是补抓还是放弃:若缺口集中在少数参数组合,可以缩小范围重跑;若失败原因混杂,先修调用逻辑再重试,否则只是重复消耗配额。
最后把已完成部分与缺口部分分开存放,不要覆盖写入同一文件。分开存放让后续合并有明确依据,也避免补抓时把已验证结果再次打乱。
脚本作者、数据使用方和运维对同一次限流的描述往往不同:一个说“大部分成功了”,一个说“文件是空的”,一个说“进程被杀了”。把分歧转成可核对项目,可以约定三份最小记录:调用参数清单、每次写入的时间与条数、失败原因计数。三方对着同一份记录核对,争论就从“成功了多少”变成“缺口在哪一段”。
需要核对的还包括工具本身的限制说明。不同关键词推荐工具对调用频率、并发数和返回字段的约束并不相同,具体额度、错误码含义和恢复方式需要以该工具当前文档或控制台提示为准,不能沿用旧截图或他人描述。若无法确认,就按更保守的并发和批次大小执行,并把假设写进任务记录。
先检查现有脚本的写入时机:如果写入发生在全部请求之后,把它改成按批写入并保留原始返回;如果已经按批写入,补上参数对应关系和缺口清单。完成这一步后,再决定是否重试以及用多大并发。限流本身不是结果丢失的原因,写入时机和记录粒度才是决定已有结果能否被保护的关键。