先给结论:不要因为限流就丢弃已经拿到的结果,也不要原样把它当成完整数据交付。正确做法是给每次运行加“检查点”,把已完成部分连同请求参数、时间戳和未完成标记一起落盘;限流触发后,先判断剩余缺口是否影响结论,再决定续跑、改写还是退出。下面把三种取舍的适用前提讲清楚。
限流只是调用节奏被打断,不等于已取回的数据失效。真正决定取舍的是:缺失部分会不会改变你要回答的问题。如果脚本的目标是盘点某个域名下已知栏目是否被收录,而限流发生在最后几个已知路径上,缺口很小,保留结果并标注“未覆盖”通常就够用。反过来,如果目标是估计整站被收录页面的规模,而你只取到前几十条就中断,这时结果的分母不完整,直接拿它下结论会误导。
可以按一个简单证据清单核对:
前两条成立时,保留并标注更划算;后两条成立时,说明缺口有结构性,值得续跑或改写。
保留的前提是你能说清“这份结果覆盖了什么、没覆盖什么”。实际动作是给输出文件加三个字段:本次请求的关键参数、运行截止时间、未完成区间。这样下一轮运行可以只补缺口,而不是从头再来。比如假设一次脚本计划按页码取 1 到 20 页,第 8 页触发限流,那么落盘时记录“已完成 1–7 页,第 8 页起未取”,下次从第 8 页续跑即可。这个动作的直接结果是:你不必重复消耗已经用掉的请求,也避免了把两次不同时间的快照混在一起。
保留还有一个容易忽略的条件:结果要能区分“查到了但没有”和“根本没查到”。很多脚本把空值直接写成空字符串,续跑后就分不清这个位置是真的无结果,还是上次没请求到。落盘时用明确的未完成标记,比事后猜更可靠。
改写不是把旧结果删掉重来,而是改变查询的粒度或范围,让它在更少的请求里回答同一个问题。常见触发条件是:原脚本按最细粒度逐条请求,限流后剩余预算不足以跑完;或者中途发现某个参数组合本身就会放大请求量。
可选的改写方向包括:把逐条查询改成按目录或按模板抽样,先得到可外推的样本;把多个相近查询合并成一次批量请求;或者缩小到只验证关键路径,把全量统计留到有稳定配额时再做。改写成立的前提是,你能接受结论从“精确清单”降级为“有边界的抽样判断”。如果读者需要的是逐条可核对的名单,抽样就不能替代,这时应选择续跑或退出,而不是用样本冒充全量。
改写后要重新记录口径,否则新旧两批结果无法合并。至少标明:这次是抽样还是全量、抽样覆盖了哪些范围、和上一批的参数差异在哪里。
退出不是失败,而是一种明确决策。适合退出的情形包括:限流反复触发且没有稳定的恢复节奏;剩余缺口虽然大,但对当前要回答的问题不重要;或者继续请求的成本已经超过这份数据能带来的判断价值。此时应当把已有结果整理成一份“带边界的中间产物”交出去,写清覆盖范围、中断原因和未验证部分,而不是留一个看起来完整、实际有洞的文件。
需要提醒的是,请求量归零、抓取量下降或某次返回为空,都不能单独证明限流已经解除或数据处理正确。它们也可能是参数写错、目标结构变化或网络异常导致的。判断恢复与否,应结合多次运行的一致性和返回内容本身,而不是只看某一个计数。
多个角色对同一份结果有不同理解时,争论往往集中在“这份数据到底算不算数”。与其反复解释,不如把分歧拆成可核对项:本次运行覆盖了哪些范围、缺失区间在哪里、结论依赖哪些假设。把这些写进结果文件,保留、改写还是退出的选择就有了共同依据。具体到某个查询工具或平台的现行限流规则、配额和恢复行为,需要以其当前公开说明和实测为准,不要沿用旧印象。
一个可操作的收尾动作是:每次运行结束都生成一份简短的运行记录,包含参数、时间、完成区间和未完成标记。下一次遇到限流时,你面对的不再是“要不要重跑”,而是“缺口是否影响结论”这个可以直接回答的问题。