蜘蛛沿着内链一路走过来,最怕的其实不是撞上 404,而是走到一个空壳页面,服务器还礼貌地回了 200。前者它立刻知道该停;后者它会以为这里有内容,把 URL 记住、排队、再来,甚至顺着这个路径继续往下铺。软 404 与空页面难处理的地方就在这里:在抓取日志里,它们看起来和正常页面没什么区别。
哪些页面容易变成空壳
- 商品下架或长期无货,页面框架还在,正文只剩一句提示;
- 列表页叠加筛选条件后没有结果,返回一个 200 的空列表;
- 站内搜索结果页被外部链接大量引用,关键词组合五花八门;
- 标签页、聚合页内容被清空,只剩模板占位块;
- 改版后遗留的旧路径,落到一个通用外壳页上。
为什么值得单列出来处理
抓取预算是有限的。蜘蛛愿意花在空页面上的每一次请求,都是从真正会变、有新内容的页面那里借走的。更麻烦的是路径信号:内链还指着这些页面,Sitemap 里可能还留着它们,蜘蛛每轮重访都会重新确认一次,长期占用队列位置。对用户来说,点进去看到空页面同样是流失。
几种收尾方式,别只用一种
确认下线的,回 404 或 410
如果这个 URL 以后不会再有对应内容,让它明确地消失比留一个空壳更干净。410 表示永久移除,语义更明确;404 也完全可以,重点是页面本身不要再返回 200。
有替代内容的,做 301 合并
把流量导向替代页是合理选择,但要确保目标页和原页面主题相关。跳到首页或栏目页这种兜底跳转用多了,蜘蛛会发现跳转前后内容对不上,反而降低对这批 URL 的信任度。也不要让它串成长跳转链。
需要保留的,用 noindex
空购物车、无结果搜索页这类页面,功能上必须存在,但不必进索引。加 noindex 即可,同时要清楚:noindex 不阻止抓取,蜘蛛仍会来读一次,所以它不能解决抓取预算被反复消耗的问题,只能解决收录问题。
canonical 只用在内容确实同源时
如果空壳只是参数不同导致的副本,而主版本有内容,canonical 指向主版本是合适的。但如果主版本也是空的,canonical 只是把问题转嫁给另一个 URL。
robots.txt 屏蔽要谨慎
用 robots.txt 挡住这些路径看起来省事,但被屏蔽的 URL 依然可能被外部链接带到蜘蛛面前,而且蜘蛛看不到 noindex 标签。结果是 URL 长期留在已发现未抓取的状态,与 Sitemap 里的记录也会冲突。
怎么把它们找出来
- 翻服务器日志:状态码 200 但响应字节数很小、或模板完全一致的路径,通常就是空壳;
- 看搜索后台的索引报告,关注已抓取未索引里集中出现的模板类型;
- 按内容类型抽样,商品、列表、搜索、标签页各取一批,手动点开看看;
- 检查 Sitemap 和内链,把已经下线或长期无内容的 URL 从这两处清掉。
处理的节奏
不要一次性改完所有模板。先处理被抓取频次最高、内链最多的那批,观察两周日志里这些路径的请求量是否下降,再推广到其他类型。同时记得同步三处信号:页面本身的状态码、Sitemap 里的清单、站内指向它的链接。三者不一致时,蜘蛛通常会以页面本身为准,但会多花几轮来确认。
空页面的问题不在于它没内容,而在于它没说清楚自己没内容。给蜘蛛一个明确的终点,比让它反复走过来更省事。