状态码是蜘蛛判断 URL 存留的第一手信号
蜘蛛抓一个 URL,最先看的是响应状态。它不了解你的业务,只能靠状态码、页面内容和历史记录去推断这个地址还该不该留在队列里。所以状态码写错,往往不只是“服务器报错”这种小事,而是直接影响 URL 的发现与去留。
200 与 3xx:正常路径
200 表示内容可取。需要注意的是,只有正文真正有内容时,200 才有意义。
3xx 是跳转。一跳的 301 能把访问者和发现信号顺着传到新地址,链条拉长了就会损耗。永久搬家用 301,临时活动用 302,别长期用 302 顶替 301。
404 与 410:删除也要给个明确答案
两者都表示内容不在,但语义不同。
- 404:暂时找不到或状态不确定,蜘蛛会保留观察,过段时间再来看看。
- 410:确定永久移除,通常比 404 更快让蜘蛛把地址从队列里清出去。
如果是批量下架的商品、过期活动页,用 410 更干脆;如果不确定以后会不会恢复,404 更稳妥。
还要提醒一点:如果这个地址本身有外部链接、也有真实用户访问,直接给 404 不如先做 301 到相关页面,把访问者和信号接住。
软 404 是最容易踩的坑
页面返回 200,正文却写着“该商品已下架”“暂无相关内容”——这就是软 404。蜘蛛拿到 200,会当成正常页面继续抓、继续占配额,甚至反复回来确认。判断方法很简单:在服务器日志或抓取工具里看看,那些空结果页是不是长期被反复抓取。如果是,把它们改成真正的 404 或 410。
503:临时停服的正确写法
维护、压测、临时过载时用 503,表示“现在不行,稍后再来”。它比 500 友好,因为语义上明确是临时的。
- 配合 Retry-After 响应头,告诉蜘蛛多久之后再来。
- 不要长期挂着 503,拖得太久,蜘蛛可能开始降低访问频率。
- 不要用 503 冒充 404 去藏地址,这样只会让蜘蛛反复重试。
5xx 持续出现会拖慢整站
500、502、504 这类错误偶发问题不大。但如果某个目录、某类模板经常 5xx,蜘蛛会判断这块区域不稳定,降低抓取频率,连带影响同一批 URL 的发现速度。
排查顺序一般是:先看是不是某个接口超时,再看数据库连接,最后看是否有模板在处理异常参数时崩溃。把出错集中在少数 URL 上,比让整站响应变慢要好。
状态码要前后一致
常见的不一致有几种:
- 同一个 URL,有时 301 到 A,有时 301 到 B。
- 移动端返回 404,PC 端返回 200。
- 带参数返回 200,不带参数返回 404,而两者其实是同一内容。
这些都会让蜘蛛反复试探,浪费抓取配额。处理原则是:一个 URL 只对应一种结果,跳转目标固定,设备差异交给自适应或对应的标注方式处理。
状态码不是给用户看的装饰,而是给机器看的结论。写得越确定,蜘蛛做决定越快。
一份可执行的检查清单
- 导出近期日志里的 4xx、5xx 地址,按目录归类。
- 区分哪些是真正下线的(该 410),哪些是跳转没做好(该 301)。
- 找出返回 200 但正文为空的页面,逐个改成 404 或 410。
- 检查维护页是否用了 503 并带 Retry-After。
- 检查同 URL 的状态码是否稳定,特别是移动端与 PC 端。
- 改完后观察一周,看这类地址的抓取频次是否下降。
状态码处理干净,URL 发现的队列才会干净。它不会直接带来排名,但能减少无效抓取,让蜘蛛把时间花在真正需要被看见的地址上。