先保住本地已经拿到的数据,再谈继续抓取。最有效的动作是立即停止重试,把已写入的每条记录补上来源、时间和状态标记,并把未完成部分单独存成待办队列。限流只说明当前请求被拒绝,不能证明数据已经完整,也不能证明之前的字段都正确。
脚本被限流时,最常见的破坏不是拿不到新数据,而是重试逻辑把旧结果覆盖成空值或错误值。以你手里的一份推广软件导出的关键词表为例,假设字段包括词、落地页、抓取时间、状态。遇到限流后,第一步是复制一份只读快照,命名为带日期的原始版本,后续所有处理都基于副本。
然后给每条记录补三个字段:source、fetched_at、status。状态只允许写ok、partial、blocked三种。这个动作的结果是:你不再需要判断哪条数据可信,下一步可以只针对blocked和partial做补采。
限流响应本身不是失败,而是调度信号。把每个未完成的请求写成一条待办,至少包含目标标识、已尝试次数、上次响应类型。不要只记“失败”,要区分是请求被拒绝、返回内容不完整,还是解析报错。这三类原因对应不同处理:请求被拒绝应降低频率或换时段;内容不完整应保留原响应再解析;解析报错应修解析规则而不是继续请求。
一个可执行的最小动作是:把待办队列导出为本地文件,暂停脚本,等下一次运行只处理队列中的条目。这样做的结果是,已成功的记录不会被重复请求,限流压力下降,同时你能看出是整体被限还是个别目标被限。
如果你没有后台导出权限,只能看到页面上的部分结果,仍可以做一件事:把当前可见内容按页面为单位保存,并标注“页面可见范围”。不要把它当成全量数据。此时能推出的结论只有“这些条目在本次可见范围内存在”,不能推出总量、排名变化或覆盖度。
假设你手里有二十条记录,其中八条来自页面复制,十二条来自脚本。限流后脚本部分中断,页面部分仍在。此时应把两部分分开存放,分别标记来源,不要合并后直接算比例。下一步是确认页面复制部分是否包含脚本缺失的字段,如果有,可以作为补充证据,但仍需注明采集方式不同。
不要直接全量重跑。先选队列中最小的一个子集,比如同一目录下的前五条,用降低后的频率跑一轮。观察三件事:请求是否被接受、返回字段是否与快照结构一致、写入是否只追加不覆盖。只有这三项都符合预期,才扩大范围。
如果小目标仍然被限,说明限制条件不在单次频率,可能在账号、时段或目标范围。此时应停止扩大,改为人工核对已有结果,并把未完成部分留作下一轮。这个判断依据比“再试几次”更可靠,因为它把限流原因和恢复动作分开了。
最终交付的不是一个数据文件,而是一份带状态的包:只读快照、待办队列、采集说明。采集说明里写清楚哪些字段是完整的,哪些是部分可见,哪些完全缺失。这样执行人员接手时不会把blocked当成已处理,也不会把页面复制内容当成脚本结果。
限流期间最该保护的是已有结果的可信边界,而不是追求一次跑完。先冻结、再分队列、后小范围验证,这三步能让你在权限和数据都不完整时仍然做出可复核的处理决定。