做蜘蛛池的人经常会遇到这种情况:入口页在浏览器里打开一切正常,但日志里搜索蜘蛛的访问量很少,目标 URL 也迟迟没有出现在抓取记录里。这时除了看内容、看链接,还有一个很容易被忽略的变量——入口页返回的 HTTP 状态码,以及中间经过了什么样的跳转。
搜索蜘蛛拿到一个 URL 后的第一步不是解析内容,而是先看服务器返回的状态码。状态码决定了它接下来做什么:是继续下载并解析 HTML,还是跟随跳转,还是直接放弃、甚至把这个地址标记为不可用。入口页里的目标链接能不能被发现,前提就是入口页本身有没有被真正读到。
200 与软 404:只有真正读到正文,链接才有被发现的机会
入口页稳定返回 200,并且返回的是完整 HTML 正文,搜索蜘蛛才会去解析页面里的 a 标签、提取 href,进而把目标 URL 放进待抓取队列。这里有一个常见坑:页面返回 200,但正文其实是“没有找到”“内容不存在”这类提示页,也就是所谓的软 404。这种情况蜘蛛拿到的 HTML 里通常没有目标链接,等于白抓一次。
还有一种更隐蔽的情况:入口页返回 200,但正文被模板占满,目标链接被塞在很靠后的位置,或者需要脚本才能渲染出来。状态码对了,只是“有机会”,不等于链接一定会被提取。
301、302、307:跳转能走通,但发现链条被拉长
搜索蜘蛛会跟随重定向,这一点基本可以放心。但需要注意两点:
- 跳转层数:一次 301 到真实入口页,一般问题不大;如果 A 跳 B、B 跳 C、C 再跳 D,蜘蛛可能在中间某一跳停下来,或者明显降低对这条路径的重视程度。
- 跳转后的落点:蜘蛛真正解析的是重定向之后的那个页面。如果入口页 302 直接跳到目标站首页,那被发现的其实是重定向落点,入口页里的链接列表根本没参与进来。
另外,用 302 做长期跳转,语义上是不对的。搜索引擎会把它当作临时跳转,可能反复回来检查原始地址,既浪费抓取预算,也让入口页的状态变得不稳定。
403、401:蜘蛛拿不到正文,链接就无从提取
这两个状态码意味着访问被拒绝。不管是权限配置错误、WAF 误拦,还是按 UA 做了限制,结果都一样:蜘蛛只拿到一个错误响应,不会去解析页面里的链接。如果你只在浏览器里测试,很容易漏掉这一点,因为浏览器带着 Cookie 和真实 UA,看到的页面和蜘蛛看到的完全不是一回事。
404、410:基本等于告诉蜘蛛这条路走不通
入口页返回 404 或 410 时,蜘蛛一般不会再从响应体里提取链接。410 比 404 更明确,表示资源已永久删除,搜索引擎会更快地把这个地址从索引和待抓取队列里清掉。如果入口页是批量生成的,某一批 URL 规则写错导致 404,那这批入口页等于完全失效。
5xx 与 503:不只是这一次没发现,还会影响后面的抓取节奏
5xx 属于服务器端错误。蜘蛛遇到 5xx 通常会认为是暂时性的,过一段时间再回来重试。但如果入口页长期返回 5xx 或频繁超时,搜索引擎会整体降低对这个站点的抓取频率,恢复起来需要时间。503 如果带 Retry-After 响应头,语义上是“暂时不可用,请稍后再来”,比裸的 500 更规范一些,但同样不适合长期使用。
状态码决定的是入口页有没有被读到;读到之后链接能不能被提取,还取决于链接的写法、位置和页面渲染方式。这两件事是串联关系,不是二选一。
一个可操作的排查顺序
- 用日志里的真实搜索蜘蛛 UA 去请求入口页,看返回的状态码,而不是用浏览器直接打开。
- 确认返回体是完整 HTML,而不是空响应、验证页或跳转提示。
- 统计入口页的状态码分布,重点看 3xx 占比和 5xx 出现频率。
- 检查重定向链,尽量把跳转层数控制在一次以内。
- 确认 robots.txt、WAF、CDN 规则没有针对蜘蛛做额外拦截。
把这些理顺之后,入口页的目标链接才有被发现的基础条件。需要说明的是,即使状态码全部正常,也只是让链接进入了候选范围,具体什么时候抓、抓不抓,仍然由搜索引擎自己决定,没有哪种配置能保证一定被抓取或被收录。