先把结论说清楚:错误只出现在特定时段,通常不能靠事后翻看汇总报表解决,而要在这个时段尚未结束时,把“请求—响应—规则判定”三样东西同时固定下来。做法是提前布置一个按分钟留痕的抓取日志,并在异常窗口内手动触发一次相同请求,把那一刻的响应头、状态码和 robots.txt 的实际内容一起保存。下面以你手里那份“只在凌晨两点到四点出现大量 403”的日志为例,说明怎样把它变成可执行的处理方案。
汇总报表里的“时段异常”至少有三种来源:真实的服务端拒绝、日志时间戳与服务器时区不一致、以及采样或聚合把不同路径混在一起。要区分它们,先做一个最小动作:取异常时段和正常时段各一段原始日志,按同一路径、同一 User-Agent 分组对比。
这一步的结果决定下一步:确认是针对性拒绝,就去查该 UA 对应的规则;确认是全局性拒绝,就去查服务器层面的定时配置。不要跳过这一步直接改 robots.txt,因为 robots.txt 的抓取限制本身不等于可靠的索引移除,改动它既不能解释 403,也不会让已被拒的请求重新成功。
汇总日志通常只保留状态码和路径,丢掉了判断所需的上下文。要在异常时段内补三样证据:
curl -I 或等效方式,在异常时段对同一 URL 发一次请求,保存完整响应头。重点看 Retry-After、Server、X-Robots-Tag 以及任何限流标识。这些字段能区分“被规则拒绝”和“被临时限流”。假设一个场景:你在凌晨两点抓到的 robots.txt 与白天完全相同,但响应头里多了一个限流字段,那么问题不在抓取规则文件,而在请求频率或来源限制。反过来,如果 robots.txt 在异常时段多出一条针对该路径的 Disallow,那就是规则本身在变动。这两种解释对应的修复动作完全不同,所以必须在窗口内取证,事后无法补。
短暂错误往往同时符合多个解释。下面这组判据可以帮助你逐条排除,而不是凭直觉选一个:
把每条判据的观察结果写下来,与上面的解释逐一比对。如果两个解释都成立,就设计一个能在下一个窗口内区分它们的动作,例如在异常时段用两种不同频率发请求,看拒绝是否随频率出现。
证据固定后,处理方案应当包含一个明确的动作和它的预期结果。例如:若确认是限流字段导致,下一步是调整请求节奏并在下一个异常窗口复测,观察该字段是否消失;若确认是 robots.txt 在特定时段被替换,下一步是核对生成该文件的定时任务,并确认替换是否有意为之。站点地图不保证收录,所以不要用“提交站点地图”作为修复抓取拒绝的手段。
无论结论指向哪一边,都要在下一个异常窗口重复同样的取证流程,用前后两轮数据对比确认变化。如果第二轮里异常消失但你又改了其他配置,就无法判断是哪一项起了作用,因此一次只改一个变量。整个流程的关键不是找到某个“正确答案”,而是让每一次判断都留下能在下一时段复核的痕迹。