搜索抓取

服务端错误与抓取退避:蜘蛛遇到超时、5xx 之后会怎么走

蜘蛛抓取失败并不都是一回事:连接超时、连接重置、5xx 在蜘蛛眼里含义不同,触发的退避强度和恢复速度也不一样。本文按失败类型拆解蜘蛛的处理逻辑,说明降速通常有哪些表现,并给出抓取恢复需要满足的条件与日常该盯的指标。

搜索抓取

服务端错误与抓取退避:蜘蛛遇到超时、5xx 之后会怎么走

很多人盯蜘蛛日志时只看“今天来了多少次”,很少看“哪些请求没成功”。实际上,蜘蛛对失败的记忆比我们想象的长:一次超时、一段连续 5xx,都会让它重新评估这个站点的稳定性,进而影响接下来的抓取节奏。下面按失败的类型、退避的表现、恢复的动作三个层面拆开讲。

一、先分清三种“抓不到”

日志里的失败往往被笼统记成“抓取异常”,但原因不同,蜘蛛的处理方式也不同。

  • 连接层失败:连接超时、连接被重置、TLS 握手失败。这类通常意味着网络或服务器在前面就拒绝了请求,蜘蛛连响应头都没拿到。
  • 响应层失败:500、502、503、504 等。服务器接了请求但没正常返回,蜘蛛能明确知道“这是你的问题”。
  • 内容层失败:返回 200,但内容是错误页、空壳页、验证码页。蜘蛛未必能立刻识别,但反复抓到无效内容,同样会降低后续访问的频率。

前两类会直接触发退避,第三类更隐蔽,往往要靠人工比对抓取内容才能发现。

二、超时和连接重置:先降速,再试探

蜘蛛在单次抓取里能容忍的等待时间是有限的。一旦某个 URL 连续超时,它通常不会当场重试很多次,而是把该主机标记为“暂时不稳定”。

表现上大概是这样的:原本一分钟来几十次的抓取,会降到个位数;抓取集中在首页、栏目页这类它已经确认可用的 URL;新 URL 的发现和抓取明显变慢。连接重置比超时更麻烦,因为蜘蛛看到的是“连接被主动切断”,容易被理解成对方在拒绝访问。

如果这种情况持续几个小时以上,退避的力度会加大,恢复也要更久。所以临时性的容量问题,越早处理越好。

5xx 的信号强度比超时更高

500 系列里,蜘蛛对 503 的容忍度相对高一些,因为 503 的意思是“我现在不可用,稍后再来”。如果配合合理的重试提示,蜘蛛通常会按提示推迟,而不是立刻判定站点质量差。反过来说,500、502、504 这类没有明确“稍后再来”含义的错误,连续出现就容易让蜘蛛降低抓取频率。

需要提醒的是,服务器返回 5xx 时,页面本身可能是好的——比如某个接口挂了、缓存服务连不上,导致整页渲染失败。对蜘蛛来说结果是一样的。

三、退避之后,抓取怎么恢复

退避不是永久的。把问题修好之后,蜘蛛会逐步恢复,但节奏通常比当初下降得慢,恢复需要几个条件同时成立。

  1. 错误率真正降下来:不是“某一次成功了”,而是连续一段时间不再出现同类失败。偶尔成功一次,蜘蛛可能只是碰巧赶上,不足以改变判断。
  2. 响应时间稳定:从几百毫秒到十几秒来回跳,即使都返回 200,也会被视作不稳定。
  3. 关键 URL 可用:首页、主要栏目页、Sitemap 这几处必须稳定。蜘蛛恢复抓取时,通常先从这些入口重新确认站点状态。
  4. Sitemap 和内部链接保持正常:这是蜘蛛重新找到 URL 的主要路径。如果这段时间内链结构也变了,恢复会更慢。

四、日常该盯哪几个指标

  • 蜘蛛抓取的状态码分布:5xx 占比、429 占比、超时次数,按小时看比按天看更容易发现抖动。
  • 响应时间分位数:平均值好看不代表没事,P95、P99 偏高说明有部分请求在拖后腿。
  • 抓取 URL 的分布变化:如果抓取突然集中到少数几个页面,往往是退避的前兆。
  • 新 URL 的首次抓取时间:这个值明显拉长,说明蜘蛛的抓取节奏还没回到正常水平。
退避是蜘蛛的自我保护,不是惩罚。它不会因为你某天挂了十分钟就永久减少抓取,但如果服务器长期处于“时快时慢、偶尔 5xx”的状态,抓取节奏就很难回到正常水平。与其研究怎么把蜘蛛引进来,不如先把响应时间和错误率稳住。

最后补一句:蜘蛛池、外链引导这类手段能带来更多抓取请求,但它们解决的是“蜘蛛来不来”的问题,解决不了“来了能不能顺利抓完”的问题。服务器稳定性属于后者,而且优先级更高。