先给结论:限流发生时,最该保护的不是“继续跑完”,而是把已经拿到的结果变成可复用、可核对、可继续的本地资产。具体做法取决于一个前提——你的脚本是只读采集,还是会顺带写入或提交。只读场景优先缓存与断点续跑;有写入动作的场景要先停写、保留现场,再决定是否重试。
限流本身只说明请求频率或并发触发了对方的控制,并不说明你的数据错了。真正影响决策的是调用性质。
判断依据可以核对:看脚本日志里最后一次成功动作是读取还是写入,看返回体是否包含资源标识,看本地是否已有对应记录。如果无法确认,按带写入处理,代价只是多一步人工确认。
把当前批次的结果写入本地文件或数据库,字段至少包含:请求标识、取回时间、原始返回、处理状态。这一步的结果是:即使进程被杀,你仍有一份可核对的原始记录,后续不必从头再拉。
断点不是简单记一个页码。更稳的做法是给每条任务一个状态:已完成、已取回未处理、未取回。这样重跑时只补未取回部分,已取回的直接进入处理环节。
限流后立刻高频重试通常只会延长受限时间。可以拉长间隔、降低并发,或把任务拆成更小的批次。这个动作的结果是:你牺牲一点速度,换取后续调用能稳定返回,而不是反复撞墙。
假设某脚本分 20 批拉取页面数据,第 7 批触发限流。
这个对比只用于说明保护动作的差别,不代表任何具体工具的实际表现。数字可按你自己的批次规模替换。
请求量下降、抓取量归零、日志里不再出现错误,都不能单独证明限流已解除或数据处理正确。合理解释至少有:脚本已停止、任务队列已空、返回被缓存拦截、或写入被跳过。要区分这些解释,需要同时看三样东西:最后一次成功返回的时间、本地已完成记录数、以及下一次试探性请求的返回内容。
如果这三者互相矛盾,优先相信本地记录和原始返回,而不是界面上的汇总数字。
当返回信息明确指向权限、配额耗尽或账号状态异常时,继续重试不会改善结果。此时应停止脚本,保留现场,先核对账号权限与配额说明。具体工具的限制条件和恢复方式需要以该工具当前公开说明为准,不同工具差异较大,不宜套用同一套重试参数。
把已有结果保护下来,再决定下一步是补跑、换方式,还是先解决权限问题,这比在限流中反复试探更可控。