遇到限流时,先不要继续重试,而是把已经拿到的结果冻结成只读快照,再判断哪些部分需要补采。这样做的目的是:即使后续请求全部失败,已有数据仍然可用、可核对、可续跑。下面以你手里的一份相关搜索采集结果为例,逐步说明怎么把它转成可执行的处理方案。
脚本常见的坏习惯是每轮都写同一个输出文件。限流发生时,如果下一轮请求返回空数组或错误码,很容易把上一轮的好数据覆盖掉。你的第一个动作应该是:把当前结果另存为一个带批次标识的只读文件,后续所有补采写入新文件,最后再合并。
具体做法可以按这个顺序:
这一步的结果会直接决定下一步:如果快照里已经包含足够的字段(词、来源层级、采集时间、请求参数),你就可以只补缺失部分;如果只有一列词,就需要重新设计补采范围,代价会大很多。
请求失败或返回变少,不一定是被限流。同样表现为“结果变少”的原因至少有几种:请求频率过高触发了临时限制、参数写错导致返回空、页面结构变化使解析落空、以及相关搜索本身在该词下确实条目较少。把这几种混在一起,就会误判。
可以用一组可区分的证据来判断:
假设你有 200 个待查词,前 50 个正常,之后开始连续失败。这个模式更支持“触发了频率限制”,而不是“数据消失”。但要注意,这只是一个合理解释,不能单独证明限流就是唯一原因,仍需结合响应内容和换词测试确认。
确认是频率问题后,不要一次性重跑全部。把待补词拆成小批次,每批之间加入间隔,并且让脚本在失败时保存进度而不是从头开始。这样即使再次被限制,也不会丢掉已经补到的部分。
一个可执行的结构是:
这里的关键取舍是:批次越小,越不容易触发限制,但总耗时越长;批次越大,越快完成,但一旦被限制,浪费的请求也越多。没有通用最优值,需要根据你自己的失败模式调整,而不是照搬别人的参数。
补采完成后,把快照和新数据合并。此时容易出现一个隐患:新数据覆盖了旧数据中原本正常的条目,或者把不同时间采集的结果混在一起当成同一批。建议在合并时保留每条记录的来源批次和采集时间,遇到同一词多次出现时,保留全部版本或明确标注以哪次为准。
这样做的实际影响是:当你后续发现某个词的结果异常时,能追溯到它是哪一批、哪个参数下拿到的,而不是面对一份无法解释来源的清单。对于需要长期维护的相关搜索数据,这种可追溯性比单次结果的完整性更重要。
如果限流是账号级或长期封禁,而不是短时频率限制,那么“等待后重试”不会恢复,需要先核对具体限制类型和恢复条件,具体信息以你所使用工具的说明为准。另外,如果快照本身字段极少、无法判断缺失原因,那么保护已有结果的意义有限,此时更合理的动作是先补全采集字段,再谈续跑。
还有一种边界:当相关搜索数据需要与其他来源交叉验证时,单靠脚本采集的快照不足以支撑结论,需要保留原始页面或接口返回作为对照。是否值得这样做,取决于你对结果准确性的要求,而不是默认所有场景都适用。