搭蜘蛛池的时候,很多人盯着入口页能不能被爬到、能不能返回 200,却很少回头看一件事:这个 200 到底有没有内容。蜘蛛拿着 200 进来,看到的是空白、模板残页或者一句“正在加载”,它不会像人一样等待,也不会反馈,它只是安静地把这一页从待抓队列里划掉。次数多了,整个池子在蜘蛛那边的印象就变成“这片地址不值得再来”。
状态码只是第一步
HTTP 状态码是蜘蛛判断页面是否存在的最粗一层信号。200 表示“有”,404 表示“没有”,301/302 表示“去别处”。但状态码只是声明,不是事实。服务器说 200,蜘蛛还是会看正文、看标题、看页面主体有没有实质内容。声明与事实不符的时候,问题就出在软 404 上。
硬 404 与软 404
- 硬 404:服务器明确返回 404,蜘蛛一次就知道这页不存在,会较快从索引里移除。
- 软 404:服务器返回 200,但页面主体是空的、是错误提示、是“内容已删除”,或者整页只有导航和页脚。蜘蛛要反复抓几次才能确认这页没价值,这段时间它一直在消耗抓取配额。
蜘蛛池里软 404 的常见来源
- 入口页模板渲染失败,数据库查不到对应记录,程序没抛 404,直接吐了个空壳。
- 跳转脚本没执行成功,蜘蛛看到的是一个 JS 空页,正文靠前端填充。
- 采集或伪原创流程把内容过滤没了,剩下一堆标签。
- 入口页指向的目标站挂了,代理层返回一个自定义错误页,状态码仍是 200。
- 泛解析或者通配域名,任何不存在的子路径都能命中同一个空模板。
为什么它比 404 更麻烦
404 是诚实的,蜘蛛学得快。软 404 是含糊的,蜘蛛会把它当成“暂时没抓到内容”,过一阵再来。于是同一个没价值的地址被反复抓,挤掉的是其他真正有内容页面的抓取机会。如果池子里大量入口页都是这种状态,日志上会看到蜘蛛来得挺勤,但有效抓取很少,收录自然也不会动。
自查与修复的顺序
- 先看日志里的状态码分布,把 200 但响应体很小的地址筛出来。
- 关闭 JS,用纯文本方式请求这些地址,看返回的 HTML 里有没有正文。
- 确认是模板问题还是数据问题:模板问题改渲染逻辑,数据问题改查询与兜底。
- 确实不存在的地址,改成返回 404 或 410,不要再给 200。
- 暂时没内容但以后会有的,用 503 加 Retry-After,比 200 空页更清楚。
几个容易忽略的细节
- 自定义错误页要在服务端设置正确的状态码,只在页面里写“页面不存在”没用。
- 跳转要尽量用 301/302,而不是 meta refresh 加 200。
- 分页、筛选参数生成的空结果页,也属于软 404,别让它们进 sitemap。
- 空页不要长期留在池子的入口列表里,定期清理比事后补救省事。
判断标准很简单:把这一页当成一个陌生用户打开,如果他看不到任何有用的东西,那对蜘蛛来说也一样。
使用建议
蜘蛛池解决的是“让蜘蛛找到入口”的问题,不是“让蜘蛛觉得入口有价值”的问题。状态码这一类基础项没做对,后面叠再多入口、铺再多链接,效果都会被稀释。把池子里的入口页过一遍,该返回 404 的返回 404,该有内容的保证有内容,比继续加量更值得先做。