蜘蛛池知识

蜘蛛池入口页的 HTTP 状态码:404、410、503 与软 404 的处理

蜘蛛抓到入口页时,最先拿到的不是页面内容而是状态码。本文讲清 404、410、503、429 分别在什么场景下使用,重点拆解返回 200 却没有内容的软 404 是怎么产生的、怎么排查,并给出一套从判断 URL 是否还需要存在到选择状态码的处理顺序。

蜘蛛池知识

蜘蛛池入口页的 HTTP 状态码:404、410、503 与软 404 的处理

蜘蛛访问一个入口页时,第一件事不是读正文,而是看响应头里的状态码。状态码决定了它接下来是解析页面、稍后再来,还是把这个地址从待抓队列里划掉。很多入口页的问题,其实不是内容写得不好,而是状态码给错了信号。

200 之外,几个常用的状态码该怎么用

404 与 410

  • 404:地址暂时找不到。适合页面结构变了、内容临时缺位的情况,蜘蛛会保留一段时间再来看。
  • 410:地址确定不再存在。入口页确认下线、不再复用这个 URL 时,用 410 比 404 更干脆,蜘蛛清理索引的速度通常更快。

两者的差别不在严重程度,而在你表达的态度:是不确定,还是确定不要了。如果一条入口页已经撤掉且不打算再挂任何内容,长期挂着 404 只会让它反复出现在抓取队列里。

503 与 429

  • 503:服务临时不可用。站点维护、后端重启、数据库短时不可用时使用,配合 Retry-After 告诉蜘蛛多久之后再来。
  • 429:请求过多。适合用在限速逻辑里,同样是临时的,不是永久拒绝。

要注意的是,503 只能短时间用。如果一挂就是几周,蜘蛛会把它理解成这个站点整体不可用,反而降低整体抓取频次。

5xx 用多了的代价

入口页批量生成时,模板报错、数据库连接失败经常会一次性吐出大量 500。蜘蛛不会去区分是代码问题还是策略问题,它只记录一件事:这个站点不稳定。抓取频次下降往往就是从这类批量错误开始的。

软 404:返回 200 却已经没有内容的页面

这是入口页最常见也最容易被忽略的问题。地址能打开,状态码是 200,但正文只剩模板骨架,或者显示一句“暂无数据”。蜘蛛会把它当成正常页面抓走,留在索引里,占着抓取配额。

  • 列表页的筛选参数组合出大量空结果页,每一条都是 200。
  • 详情页的数据已经删除,模板还在照常渲染,标题和导航都在,正文为空。
  • 跳转链接最终停在了一个没有实际内容的落地页上。

排查软 404 不用太复杂的工具,先看三件事:页面正文的实际字符数是否明显偏少、标题是否和其他页面大量重复、页面是否只有导航和页脚。三者同时出现,基本可以判定是软 404。

一个可以照做的判断顺序

  1. 先问自己:这个 URL 以后还需要存在吗?
  2. 需要,而且内容完整 → 返回 200,同时保证正文有实际信息。
  3. 不再需要,也不会复用 → 返回 410。
  4. 暂时下线,之后会恢复 → 返回 503,并设置 Retry-After。
  5. 一时判断不了 → 先用 404,然后看日志里这个地址是否还在被反复抓取。

几个容易踩的细节

  • 用 JS 跳转的入口页,蜘蛛看到的第一份响应仍然是 200,真正的目标页状态码它未必能拿到。
  • CDN 或反向代理有时会把源站的 404 替换成一张设计精美的“友好错误页”,状态码被改成 200,等于亲手制造软 404。
  • 状态码是对机器的信号,不是对内容的替代。页面该更新的内容不更新,改成 503 也只是把问题往后推。
判断入口页是否健康,看日志里的状态码分布,往往比逐个打开页面看内容更直接。四种状态码的比例,基本能反映这批入口页的真实状态。

把状态码当成入口页生命周期的一部分来管理:上线用 200,临时故障用 503,确定下线用 410,参数错误用 404。规则简单,但坚持执行下来,蜘蛛对这个站点的判断会稳定很多。