抓取日志里最容易被忽略的一类问题,是状态码正常但内容空洞的地址。它们返回 200,服务器没有报错,蜘蛛也愿意抓,但抓到的页面没有可索引的实质内容。这类地址会持续消耗抓取资源,也会稀释站点的内容质量信号。
软 404 与空壳页的区别
软 404 通常指本该返回 404 的地址,被服务器用 200 加一段“内容不存在”的提示页返回。空壳页则是地址本身有效,但页面内容由模板拼凑,缺少独立信息。两者在日志里的表现接近:都有 200、都有正常的响应头,区别主要在返回内容与页面本身的设计意图。
判断时可以关注三点:
- 响应体大小是否长期稳定在模板的最小值附近;
- 页面主体是否存在与 URL 相关的独有信息;
- 同一批地址是否只在参数或路径末尾不同,内容却高度相似。
常见的空壳页面形态
- 站内搜索结果页,尤其是无结果或结果很少的关键词;
- 筛选参数组合后没有匹配内容的列表页;
- 用户主页、标签页、归档页在数据为空时仍然输出模板;
- 改版后保留的旧模板页面,只剩导航与页脚;
- 需要登录或需要交互才显示内容的入口页。
这些地址往往由内链或 Sitemap 主动暴露,蜘蛛顺着入口一路抓下去,最后停在大量无内容页面上。
从抓取日志里识别
日志本身不会标注“这是空壳页”,需要结合几个字段交叉核对:
- 响应体大小:把同类 URL 的字节数排序,长期处于最小值区间的一批地址值得单独查看。
- 抓取频次变化:正常页面在被抓取几次后会进入相对稳定的回访节奏,空壳页往往抓过一次就不再出现。
- 抓取深度分布:如果某一层级的 URL 数量庞大但几乎不产生后续抓取,说明这一层没有可继续延伸的内容。
- 抓取时间集中度:大量空壳页集中在同一时间段被抓取,通常意味着它们来自同一个入口。
把这些线索放在一起看,比单看状态码更容易定位问题。
返回码与内容的一致性核对
规范的写法是:地址不存在就返回 404 或 410,不要用 200 加提示文案代替。需要保留的内容页面,则确保返回 200 时有实际内容。以下几类情况需要重点核对:
- 前端路由站点把所有路径都交给同一个 HTML 模板;
- 接口出错时返回 200 加错误 JSON,页面再渲染为空;
- CDN 缓存了错误状态,源站正常但边缘节点返回空内容。
另外要留意响应头里的缓存策略。如果空壳页被缓存了较长时间,蜘蛛在短时间内会反复拿到同一份空内容,抓取节奏被打乱,日志上看起来像是频繁回访,实际并没有新信息可取。
状态码只说明请求是否被正常处理,不说明这个地址是否值得被抓取。这两件事需要分别核对。
处理顺序建议
- 先确认这批地址是否应该存在。不该存在的,直接返回 404 或 410,并清理指向它们的入口。
- 应该存在但内容为空的,先补内容,再决定是否开放抓取。
- 参数组合产生的空页面,用 robots.txt 规则或页面级 noindex 收敛,不要让它继续出现在内链与 Sitemap 中。
- 把处理结果与 Sitemap、内链入口同步更新,避免入口仍指向已下线的地址。
- 处理完成后观察一段时间的日志,确认抓取集中在有内容的页面上。
服务器稳定性同样会影响判断。返回码抖动、超时与 5xx 会掩盖真实的内容状态,建议在站点响应平稳的时段再做核对,必要时对照源站与 CDN 两边的返回结果,确认蜘蛛拿到的是哪一份内容。