蜘蛛抓取一个 URL,只有“成功拿到 200”和“没拿到”两种结果,但“没拿到”的原因差别很大。同样是抓取失败,有的过几分钟就会再来,有的可能几个月都不再出现。日志里那一列状态码,其实是在告诉你该修什么。
先把失败分成两类
- 服务器没接住:5xx、连接超时、DNS 解析失败、TLS 握手失败。蜘蛛视角是“这次不行,下次再看”。
- 服务器明确拒绝:403、401、429,以及被 robots 规则挡下的路径。蜘蛛视角是“我被拦住了”,行为会更谨慎。
这两类的处理方式完全不同。前者要修稳定性,后者要改规则。
5xx:会被记成一次失败,然后重试
500、502、503、504 通常不会让蜘蛛立刻认为页面消失,它更倾向于过一段时间再来。问题是频率:偶尔一次 5xx 影响很小,但如果同一个 URL 连续几天都返回 5xx,蜘蛛的抓取分配会慢慢挪向别的目录,恢复速度也比掉下去的速度慢。
常见诱因是数据库连接被打满、后端超时阈值太短、或者某个页面依赖的第三方接口不稳定。查的时候不要只看首页,要按 URL 分组看错误集中在哪一类模板上。
429 与 503:这是在说“你太快了”
429 一般意味着单位时间内的请求超出了服务器愿意接受的范围,很多配置会同时返回一个 Retry-After 头。503 有时是维护,有时也是一种限速表达。对这两者的处理原则是一样的:尽量让响应里带上明确的等待时间,让蜘蛛知道该等多久,而不是反复撞门。
如果你把抓取速率调得很低,但日志里 429 依旧频繁,那多半不是蜘蛛太快,而是页面本身太慢,同一时间段内并发处理不过来。
403 与 401:多半不是临时问题
这类回应往往来自 WAF、UA 黑名单、地域限制或登录校验。蜘蛛一般不会去猜怎么绕过,结果就是这个 URL 长期抓不到。判断方法很直接:用普通浏览器打开正常,用类似蜘蛛的请求头打开就被拒,问题基本在拦截层。
检查顺序建议是:WAF 日志里有没有被规则命中的记录、是否有整体性的 UA 拦截、是否有把某个目录单独设了访问限制。放行时只放开需要被抓的静态目录,比整体关掉拦截更安全。
超时与 DNS:最容易被忽视的一类
服务器响应太慢时,蜘蛛往往等不到完整响应就断开,日志里表现为抓取中断或耗时异常。这类失败不写状态码,但对抓取预算的消耗很实在——蜘蛛在同一段时间里能抓的页面变少了。
DNS 层面的问题更隐蔽,通常表现为整段时间的抓取量骤降。如果多个搜索引擎同时出现这种曲线,优先怀疑解析而不是页面。
失败本身不会直接让站点受罚,真正起作用的是持续时间。短暂抖动基本可以忽略,长时间、大面积的失败才会让蜘蛛把注意力移到别处。
恢复期按这个顺序看
- 先看日志里状态码的分布,确认是单一目录还是全站。
- 区分是服务器问题还是拦截问题,别用同一个办法处理两类失败。
- 服务器类问题修完后保持稳定,不需要反复手动提交同一个地址。
- 拦截类问题调整规则后,观察同批 URL 是否重新出现在日志里。
- 关注“同一 URL 再次被抓”的间隔,间隔缩短通常说明信任在恢复。
抓取失败不是一个需要立刻消灭的错误,而是一个需要分清类型的信号。修对了地方,剩下的交给时间。