蜘蛛访问一个入口页时,第一件事不是读正文,而是看响应头里的状态码。状态码决定了它接下来是解析页面、稍后再来,还是把这个地址从待抓队列里划掉。很多入口页的问题,其实不是内容写得不好,而是状态码给错了信号。
200 之外,几个常用的状态码该怎么用
404 与 410
- 404:地址暂时找不到。适合页面结构变了、内容临时缺位的情况,蜘蛛会保留一段时间再来看。
- 410:地址确定不再存在。入口页确认下线、不再复用这个 URL 时,用 410 比 404 更干脆,蜘蛛清理索引的速度通常更快。
两者的差别不在严重程度,而在你表达的态度:是不确定,还是确定不要了。如果一条入口页已经撤掉且不打算再挂任何内容,长期挂着 404 只会让它反复出现在抓取队列里。
503 与 429
- 503:服务临时不可用。站点维护、后端重启、数据库短时不可用时使用,配合 Retry-After 告诉蜘蛛多久之后再来。
- 429:请求过多。适合用在限速逻辑里,同样是临时的,不是永久拒绝。
要注意的是,503 只能短时间用。如果一挂就是几周,蜘蛛会把它理解成这个站点整体不可用,反而降低整体抓取频次。
5xx 用多了的代价
入口页批量生成时,模板报错、数据库连接失败经常会一次性吐出大量 500。蜘蛛不会去区分是代码问题还是策略问题,它只记录一件事:这个站点不稳定。抓取频次下降往往就是从这类批量错误开始的。
软 404:返回 200 却已经没有内容的页面
这是入口页最常见也最容易被忽略的问题。地址能打开,状态码是 200,但正文只剩模板骨架,或者显示一句“暂无数据”。蜘蛛会把它当成正常页面抓走,留在索引里,占着抓取配额。
- 列表页的筛选参数组合出大量空结果页,每一条都是 200。
- 详情页的数据已经删除,模板还在照常渲染,标题和导航都在,正文为空。
- 跳转链接最终停在了一个没有实际内容的落地页上。
排查软 404 不用太复杂的工具,先看三件事:页面正文的实际字符数是否明显偏少、标题是否和其他页面大量重复、页面是否只有导航和页脚。三者同时出现,基本可以判定是软 404。
一个可以照做的判断顺序
- 先问自己:这个 URL 以后还需要存在吗?
- 需要,而且内容完整 → 返回 200,同时保证正文有实际信息。
- 不再需要,也不会复用 → 返回 410。
- 暂时下线,之后会恢复 → 返回 503,并设置 Retry-After。
- 一时判断不了 → 先用 404,然后看日志里这个地址是否还在被反复抓取。
几个容易踩的细节
- 用 JS 跳转的入口页,蜘蛛看到的第一份响应仍然是 200,真正的目标页状态码它未必能拿到。
- CDN 或反向代理有时会把源站的 404 替换成一张设计精美的“友好错误页”,状态码被改成 200,等于亲手制造软 404。
- 状态码是对机器的信号,不是对内容的替代。页面该更新的内容不更新,改成 503 也只是把问题往后推。
判断入口页是否健康,看日志里的状态码分布,往往比逐个打开页面看内容更直接。四种状态码的比例,基本能反映这批入口页的真实状态。
把状态码当成入口页生命周期的一部分来管理:上线用 200,临时故障用 503,确定下线用 410,参数错误用 404。规则简单,但坚持执行下来,蜘蛛对这个站点的判断会稳定很多。