蜘蛛访问一个入口页时,服务器返回的第一个信息不是页面内容,而是状态码。蜘蛛通常会先看状态码,再决定这次抓取怎么处理:是收下页面、过段时间再来,还是把这个 URL 标记成失效。很多入口页效果不理想,问题并不在内容本身,而是状态码用错了地方。
状态码先分成四类看
2xx 表示正常返回,3xx 表示跳转,4xx 表示请求本身有问题,5xx 表示服务器这边出了问题。入口页日常会用到的,主要是 200、404、410、429、503 这几个。它们各自对应的语义不一样,混用会让蜘蛛的判断也跟着乱。
200:入口页的默认状态
只要页面能正常返回内容,就返回 200。不要为了临时隐藏页面、或者做灰度测试,把一个正常页面改成 404 或 503,这类改动蜘蛛看到之后,会按对应语义处理,恢复起来需要时间。
几种容易误用 200 的情况
- 空模板页、占位页返回 200,蜘蛛会当成正常页面收下;
- 后端报错时把错误信息渲染成一个正常页面返回 200;
- 列表页没有内容时仍然返回 200,而不是提示为空。
404 与 410:确认不再提供的入口页
404 表示暂时找不到,410 表示确定永久删除。理论上 410 的信号更明确,蜘蛛处理时通常更快把 URL 从索引中清理掉。但前提是:这个入口页确实不打算再做了。
- 入口页被合并到另一个保留页面:优先做 301,而不是直接 404;
- 内容彻底下线、也不再复用:410;
- 只是临时维护、换服务器:不要用 404 或 410,用 503 更合适。
429 与 503:限流和维护要用对
429 表示请求太频繁被限流,503 表示服务暂时不可用。这两个都允许带 Retry-After 响应头,告诉蜘蛛多久之后再过来。写得具体一点,比让它自己猜要稳妥。
- 自己做了访问频率限制:返回 429,并带上 Retry-After;
- 数据库、后端服务临时故障:返回 503,并带上 Retry-After;
- 不要用 200 包一个「请稍后再试」的提示页,那属于软错误。
5xx 长期挂着会有什么影响
短时间内少量 5xx 一般问题不大,但如果某个目录长期大量返回 500、502、503,蜘蛛通常会降低这个目录的抓取频率,严重时暂停抓取。等状态恢复之后,抓取节奏要重新爬回来,需要一段时间。所以 5xx 应该是短期的、有明确原因的,而不是服务器一直没修好。
软错误:状态码和内容对不上
返回 200,页面正文里写着「内容不存在」或「已删除」——这就是典型的软 404。蜘蛛会把它当作正常页面收下,时间一长,入口页里就堆了一批没有实际内容的页面,反而稀释了整体质量。
处理办法很简单:页面内容如果真的没了,就让状态码也跟着变,别让两者各说各话。
一份可直接对照的配置清单
- 能正常展示内容的入口页:200;
- 已合并的低质入口页:301 到保留页面,不要直接删除;
- 确认永久下线的入口页:410,过渡期先用 404 也可以;
- 触发频率限制:429 + Retry-After;
- 后端临时故障:503 + Retry-After,恢复后尽快改回 200;
- 定期抽检:日志里 5xx 的占比如果一直偏高,先查服务器,再谈抓取。
状态码本身不复杂,难的是长时间保持一致。入口页数量多的时候,建议用脚本定期抽查一批 URL,看看同一个模板下的页面是不是一半正常、一半报错。把这件事做成例行检查,比出问题之后再回头排查要省事得多。