蜘蛛抓一个页面,先看的是状态码,但状态码只说了一半。服务器回 200,页面主体却是空的,这种情况通常被叫做“软 404”:地址活着,内容没了。它比真正的 404 更麻烦,因为 404 会明确告诉蜘蛛这个地址不用再来了,而软 404 看起来一切正常,抓取预算照花,索引里也可能留下一个没有内容的壳。
什么样的页面算软 404
判断标准并不在状态码,而在“这个 URL 是否有独立存在的内容”。几类页面最容易被算进去:
- 商品下架、文章删除后,页面还在返回 200,只留下“暂无内容”几个字或一个空模板;
- 筛选、排序、站内搜索的结果页,条件组合出来是零结果,但 URL 依然可以访问;
- 分页超出范围,比如第 50 页早就不存在了,翻过去仍然回 200 的空列表;
- 依赖 JS 渲染的页面,HTML 里只有骨架,真正的正文要靠接口返回,蜘蛛拿到的就是这个空壳;
- 模板重复的聚合页,几十个 URL 输出几乎一样的标题和导航,正文部分为空。
蜘蛛怎么判断一个 200 页面是空壳
搜索引擎不会只看字数。它大致会综合几个信号:正文文本量与同站同类页面相比是否明显偏少;页面主体是否与站内其它 URL 高度重复;是否只有导航、页脚和广告位;以及这个 URL 是否被内链或 Sitemap 反复指向。多个信号叠在一起,才会被判定为软 404。
这也解释了一个常见现象:同样是一个空结果页,孤零零地存在往往没人管,而一旦被大量内链指向、又写进 Sitemap,就很容易被当成问题页面处理。
软 404 消耗的是什么
最直接的消耗是抓取预算。蜘蛛每次来都要发请求、下载 HTML、判断内容,而这些页面对用户和索引都没有价值。数量上千之后,占用的配额可能比真正需要更新的页面还多。
抓取预算不是被一次大抓取用掉的,而是被成千上万个“看起来正常”的空页面一点点磨掉的。
其次是索引质量。软 404 页面如果留在索引里,用户搜到点进去是空的,站点在“内容是否可靠”上的表现会被拉低。再往深一层,站内大量低质 URL 也可能影响蜘蛛对你整站抓取优先级的判断。
从哪里把这类页面找出来
- 看抓取统计报告里的“软 404”分类,这是最直接的入口,通常会给出示例 URL 和趋势;
- 拉服务器日志,按状态码筛出 200 的请求,再按路径模式分组,看是否存在大量同构 URL,例如带筛选参数的结果页;
- 抽样对比正文长度。取同类页面的正文文本量中位数,明显低于这个值的 200 页面值得单独看;
- 检查 Sitemap 和内链。如果某个空壳 URL 被大量链接指向,说明它是被主动喂给蜘蛛的,优先级要提前处理。
处理方式可以分几种
彻底不存在的页面
内容确实已经删除,就老老实实返回 410 或 404。不要为了保留权重而让一个空模板挂着 200,蜘蛛迟早会把它当软 404,而且这段时间它一直在消耗抓取。
还有入口价值的空结果页
筛选和站内搜索的结果页并非全都该删。零结果的页面如果对用户有导航意义,可以保留,但要控制它被蜘蛛走过的范围:不要放进 Sitemap,内链上尽量避免让它成为抓取主路径,或者对零结果状态单独返回合适的提示与状态码。
分页越界
超出末页的分页地址,直接在服务端判断并返回 404,而不是渲染一个空列表。同时把分页链接的生成逻辑收紧,别让内链自己指向不存在的页码。
JS 空壳
如果正文完全依赖客户端渲染,蜘蛛拿到的 HTML 本身就没有内容。至少要把核心正文和主要链接放在服务端可返回的 HTML 里,让蜘蛛第一次请求就能看到实际内容,而不是等渲染队列。
别把所有“空”都一刀切
有些页面正文确实少,比如分类首页、目录页、工具页,它们的价值在于组织入口,而不在文字量。判断软 404 时,重点看的是这个 URL 是否提供了别处没有的东西,而不是单纯比字数。把有价值的枢纽页误判成软 404 删掉,反而会切断蜘蛛往下走的路径。
比较稳妥的做法是定期抽查:从抓取报告里随机取一批软 404 样例,人工看一遍,再决定是返回 404、加 noindex,还是补充内容让它真正有存在的理由。这个动作不需要很频繁,但比只看总量数字有用得多。