保护已有结果的核心动作是:把每次成功返回的数据立即落盘,并让脚本在收到限流信号时停止请求、保留断点,而不是重试到被封。下面用一个假设情境说明这个决策链。
假设你写了一个脚本,通过某个google关键词工具的接口批量拉取一批种子词的扩展结果。前两百个词正常返回,之后开始出现错误码或空响应,继续跑下去错误率明显上升。此时你手上已经有两百条结果,但脚本没有保存中间状态,全部数据还在内存里。
这个情境里最危险的不是限流本身,而是脚本崩溃或你手动中断后,已抓到的两百条也随之丢失。限流只是让你暂时拿不到新数据,丢掉已有结果才是真正的损失。
错误集中出现时,不要默认就是限流。以下现象都可能产生类似表现:
区分方法:用一个已知上次能正常返回的词再请求一次。如果它也失败,倾向于限流或服务端问题;如果它正常而新词失败,更可能是词本身或权限范围的问题。这一步决定了你下一步是等待还是换策略。
要让已有结果可保护,存储结构至少要包含两部分:结果数据和进度标记。一个可行的最小做法是每成功一条就追加写入本地文件,同时记录已完成的词列表或游标位置。
用伪代码表示这个动作:
for kw in seed_list: result = call(kw); append_to_file(result); save_cursor(kw)
这样做的直接结果是:无论脚本在哪一步中断,重新启动时都能从断点继续,已写入的结果不需要重新请求。代价是写入频率变高,文件可能出现重复行,需要在后续合并时按关键词去重。
如果接口支持分页,断点应记录到页级而不是词级,否则一个词拉到一半失败,重启后可能重复拉取整词。
确认是限流后,按顺序执行:
等待多久没有通用答案,取决于具体工具的限制规则,需要你核对所用工具的说明或观察恢复时间,不要照搬别人的数值。
如果限流期间你只有部分结果,仍可执行的最小动作是:对已拿到的词做初步归类,标记哪些词有扩展、哪些没有,把这份中间结果作为待补清单保存下来。等恢复后只补缺失部分。
但不能从这份不完整数据推出结论:不能因为某个词没出现在已有结果里就判断它没有搜索需求,也不能用部分样本的分布去估计整批词的整体情况。缺失是随机的还是集中在某类词上,在补全之前无法判断。
同样,请求量归零或错误率下降,也不能单独证明限流已解除——可能是脚本已停止请求,也可能是对方调整了策略。要恢复批量前,用单次试探确认更稳妥。
下一次运行前,先加两件事:一是每次成功即写盘,二是捕获限流类错误后主动退出而不是继续循环。这两处改动会让脚本在异常时留下可用数据,而不是留下一堆需要重跑的空结果。之后你再决定是补充抓取还是直接使用已有部分,判断依据就是落盘文件的完整度。