搜索抓取

蜘蛛抓取失败的几种结果:哪些会重试,哪些直接放弃

抓取失败并不都是一回事。连接超时、5xx、429 通常会被重试,404、410、robots 禁止则基本不会再来。本文按失败发生的层级拆解蜘蛛的重试逻辑,并给出日志排查与修正验证的具体做法,帮助区分“蜘蛛没来”和“来了但没抓成”。

搜索抓取

蜘蛛抓取失败的几种结果:哪些会重试,哪些直接放弃

看服务器日志的时候,很多人的关注点是“蜘蛛今天来了多少次”。但更有价值的问法是:那些没抓成功的请求,蜘蛛后来还来不来?同样是抓取失败,结果差别很大——有的它几分钟后再来,有的它几个月都不再看一眼,还有的它干脆把这个地址从待抓列表里划掉。

先分清失败发生在哪一层

把失败先归类,判断起来会清楚很多:

  • 连接层:DNS 解析不出来、TCP 连不上、TLS 握手失败、连接被重置或超时。这一层失败时,蜘蛛连 HTTP 状态码都没拿到。
  • 协议层:拿到了状态码,但状态码本身表示异常,比如 5xx、429。
  • 内容层:返回 200,但内容为空、全是模板,或者跟用户看到的不一样。

这三层对应的处理逻辑不一样,混在一起看日志容易得出错误结论。

大概率会重试的情况

如果失败是临时性的,蜘蛛通常会再来:

  • 连接超时、连接被重置:一般视作网络波动,会在一段时间后重排。
  • 5xx 服务端错误:会被当作站点暂时不可用。
  • 429 请求过多:如果同时给出了 Retry-After,蜘蛛往往会按这个时间等。

需要注意的是,重试不是无限次、也不是固定间隔。连续失败几次之后,间隔通常会被拉长,同一批 URL 的抓取节奏也会整体放慢。换句话说,短暂抖动代价不大,持续抖动会让整个站点的抓取频率往下掉。

基本不会再来的情况

下面这些属于“明确表态”,蜘蛛一般不会反复尝试:

  1. 404 和 410:内容不存在。410 的语义更明确,处理上通常更快。
  2. robots.txt 里禁止抓取的路径:蜘蛛不会去试探。
  3. 长期返回 403 的地址:除非站点侧有明显变化,否则它没有理由再回来。
  4. 域名已经无法解析:连入口都没有了。

夹在中间的几种情况

实际排查里最麻烦的往往不是上面两类,而是灰色地带:

  • 软 404:状态码是 200,但页面其实是空的,或者提示“内容已删除”。这类页面会一直被当成正常页面,既占抓取额度,又可能被索引。
  • 403 与验证码:有时是防火墙误伤,蜘蛛看到的和真实用户看到的不一样。如果抓取端被拦,站点自己很难察觉,只能从日志里识别。
  • 间歇性 5xx:偶发一两次影响有限,但如果每次抓取都撞上,蜘蛛对站点的整体评价会变差。

站点侧可以做的几件事

  1. 把日志按状态码分组统计,看的是比例而不是绝对数量。5xx 占比哪怕只有百分之一二,也值得查。
  2. 错误页一定要返回正确的状态码。用 200 伪装错误是最容易被忽略的问题。
  3. 维护窗口尽量给出明确的不可用状态,而不是让请求大量超时。
  4. 对于确实下线的页面,用 410 或 301 给出明确去向,别让它挂着 200。
  5. 把抓取日志和服务器监控对照着看,区分“蜘蛛没来”和“蜘蛛来了但没抓成”。
抓取失败本身不可怕,可怕的是失败得含糊:状态码说不清原因,蜘蛛就只能靠猜,而它猜的结果通常是不再来。

怎么验证修正有没有起作用

改完之后不要只看一两天。可以用一个简单的方法:挑一组之前频繁失败的 URL,在日志里追踪它们后续的状态码变化和最后一次被抓时间。如果状态码回归正常,而且抓取间隔逐渐缩短,说明修正生效;如果状态码正常了但蜘蛛依然不来,那问题多半不在服务器,而在这些 URL 本身的内容价值或内链位置上。