蜘蛛抓取一个 URL 时,最先拿到的不是页面内容,而是服务器返回的状态码。状态码决定了这次抓取算不算成功、这个 URL 还要不要再来。问题在于,不少站点把 200 当成万能返回——只要请求能被处理,一律给 200。结果是:明明没有有效内容的页面,在蜘蛛眼里却是“正常页面”,于是被反复抓取,占掉了抓取配额,真正有价值的 URL 反而排不上队。
蜘蛛怎么判断一个 URL 值不值得再来
大致会看三件事:返回的状态码是否正常、正文内容是否有效、内容与 URL 指向的主题是否一致。状态码正常但内容为空或高度重复,就落到了“软 404”的范围。与直接返回 404 不同,软 404 需要蜘蛛多抓几次才能确认,这个过程会额外消耗抓取资源。
常见的状态码误用
- 空搜索结果返回 200:站内搜索没有结果,页面只是“未找到”,却渲染出完整模板并返回 200,容易被当成低质页面。
- 商品或内容下架后页面仍在:正文清空但 URL 保留,状态码仍是 200,蜘蛛会持续回访。
- 错误页返回 200:出错时展示“系统繁忙”“稍后再试”,状态码却给 200,蜘蛛会把它当正常内容处理。
- 临时维护统一返回 404:本该用 503 表示暂时不可用,结果给出 404,可能让正常 URL 被判定为已消失。
软 404 的几种典型形态
需要交互才出现的内容
页面骨架先返回 200,正文要等点击、滚动或输入之后才加载。蜘蛛拿到的是空壳,却仍按正常页面记账。
大量 URL 指向同一份空内容
参数组合、筛选条件能翻出很多地址,内容却几乎一致或干脆为空,这类 URL 容易一起被判定为无效。
自查:从日志里把问题挑出来
- 按状态码分组统计蜘蛛访问,看 200 的占比是否高得反常。
- 抽一批 200 的 URL,用不带 Cookie、不执行脚本的方式请求,确认正文是否有实质内容。
- 重点检查站内搜索、筛选、分页这三类模板,是否存在“无结果也返回 200”。
- 对照抓取频次:被反复抓取、却从来不带来访问的 URL,往往是空壳。
处理思路
真正不存在的页面,该给 404 就给 404;已经彻底下架、不会再恢复的,用 410 表达更明确。站内搜索无结果、筛选结果为空这类情况,可以选择返回 404,或至少在页面上明确说明无结果,并减少内链指向。维护、限流造成的暂时不可用,用 503 并配合 Retry-After,比直接 404 更稳妥。已经被大量抓取的空壳 URL,可以先撤掉站内入口,让蜘蛛自然降低访问频次。
noindex 与状态码别混用
noindex 解决的是“页面有效但不想被收录”,状态码解决的是“页面是否还存在”。用 noindex 处理已经删掉的页面,等于让蜘蛛继续回访一个没有价值的地址;反过来,给正常但不想收录的页面返回 404,只会制造更多无谓的抓取失败。
状态码是蜘蛛判断页面生死的首要信号,含糊的返回会让它一直猜。让有效页面拿到 200,让无效页面得到明确的否定,抓取次数才会花在该花的地方。
最后提醒一句:调整状态码属于影响面较大的改动,动手前先用小范围 URL 验证,观察一到两周日志变化,再决定是否扩大范围。