入口页的 HTTP 状态码,是搜索蜘蛛在读到 HTML 之前拿到的第一个信号。同样是“页面能打开”,返回 200 和返回 404,蜘蛛后续的动作可能完全不同。所以当目标 URL 迟迟没被发现时,先看响应头,往往比先看正文更省时间。
状态码决定的不是“抓不抓”,而是“抓完之后怎么用”
搜索蜘蛛请求一个 URL,拿到状态码后大致会做两件事:一是决定这个 URL 本身要不要进索引,二是决定还要不要继续解析这份响应体里的链接。这两件事经常被混在一起谈,其实是分开判断的。一个页面完全可以“不收录”,同时“里面的链接照样被跟进”。
几类常见状态码下的实际表现
200 与 304
200 是正常路径。304 表示内容未变化,蜘蛛会沿用缓存里的版本,缓存中已有的链接依然算已发现。反过来,如果入口页长期返回 304,而链接是后来才加上去的,蜘蛛可能短时间内看不到新增链接。这时更新一下页面内容或改动静态参数,会更直接。
301 与 302
301 会传递权重并让蜘蛛按新地址继续,但跳转链越长损耗越大,也更容易在某一环断掉。302 表示临时跳转,蜘蛛一般仍会解析,只是对“最终地址”的判定没那么确定。把入口页做成跳转页时,最好不要在跳转之后才放目标链接。
404 与 410
这两个状态码意味着页面本身不会被收录。不过蜘蛛在抓到内容后,通常还是会解析响应体里的链接,所以挂在 404 页面上的目标链接,仍有机会被发现。问题在于这类页面不会长期被重复抓取——一旦蜘蛛确认它是 404,之后可能就不再来了,链接的持续曝光也就没了。410 比 404 更明确,放弃得更快。
403 与 401
被拒绝访问时,蜘蛛拿不到响应体,自然也读不到里面的任何链接。有些站点的防护策略会对异常 UA 或高频请求直接返回 403,而站长在浏览器里访问一切正常,很容易误判成“页面没问题,是蜘蛛不来”。这种要结合日志里的状态码一起看。
429 与 503
这两个属于“暂时别来”。蜘蛛一般会降低对该站点的抓取频率,过一段时间再试。短时间的 503 影响有限,但如果入口页反复超时或频繁 503,整站的抓取配额都会被压下去,表现就是同一批链接的抓取间隔越来越长。
排查顺序
- 用命令行或抓包工具,以搜索蜘蛛的 UA 请求入口页,记录状态码和响应头。
- 确认响应体里确实有目标链接,而不是靠 JS 后置插入。
- 对照访问日志,看蜘蛛拿到的是哪个状态码。日志和实测不一致,通常是 CDN、WAF 或 UA 判断在中间改了响应。
- 如果是 3xx 且链路过长,把目标链接直接放到最终页面上。
- 如果是 4xx 或 5xx,先解决可用性,再谈链接发现。
几个容易忽略的细节
- 软 404:返回 200 但内容是一句“页面不存在”,蜘蛛照样可能判定为无效页面,链接价值被削弱。
- 状态码与正文矛盾:返回 200,正文却是错误提示页,长期如此会影响整体质量评估。
- 只对蜘蛛返回不同状态码:这类差异一旦被识别,风险由入口页自身承担,不一定只影响这一个页面。
- 日志里的状态码:注意区分蜘蛛请求和普通用户请求,两者常常走的是不同的缓存节点。
状态码解决的是“能不能被正常读取”,链接能不能被发现只是其中一环。入口页可用、响应稳定、链接真实存在,这三件事都做到了,剩下的交给时间和抓取节奏。