先给结论:入口页正常只能说明该URL的渲染与响应链路是通的,不能说明整站抓取路径健康。深层链路失效通常断在四类位置——内链锚点不可达、分页或筛选参数被robots.txt拦截、目录层级超出抓取预算、以及服务端对深层路径返回软404。定位方法是从入口出发,逐跳核对响应码与可抓取性,而不是从日志总量推断。
这两个断点的证据完全不同,选错方向会浪费一轮排查。
如果深层URL在服务器访问日志里根本不出现,问题在抓取链路:爬虫没有走到那一层。此时应检查入口页到深层的链接是否真实存在于HTML中,而不是靠JS事件绑定或POST跳转生成。用curl或浏览器禁用JS后查看源码,若目标链接不在<a href>里,爬虫大概率不会跟进。
如果深层URL在日志里频繁出现,但索引状态异常,问题在索引链路:抓取到了但没被采纳。常见原因是深层页面返回200但内容为空壳、canonical指向入口页、或robots meta写了noindex。此时应抓取该URL的原始响应,比对canonical与meta robots,而不是只看渲染后的页面。
一个可操作的判断动作:在日志中筛选深层路径的响应码分布。若404与200混杂出现,说明部分内链指向了已变更的URL,断点在链接维护,而非抓取预算。
这种情况下断点在入口页到深层的路径上。优先检查三处。
nofollow或被JS阻止默认行为。检查rel属性与事件监听。实施动作:在入口页源码中搜索深层URL的路径片段。若搜不到,先修链接输出方式,把关键深层入口改为服务端渲染的<a href>。改完后观察日志中该深层路径是否开始出现。若出现,说明断点在链接生成;若仍不出现,再转向抓取预算与robots规则。
此时断点在服务端或路由配置。用逐跳请求的方式核对,不要只看首页。
Disallow规则覆盖。注意:robots.txt只限制抓取,不等于移除索引,已收录的深层URL仍可能出现在结果中。实施动作:把深层路径的响应码、响应体长度、canonical三项列成一张核对表。若某项在入口页与深层页之间不一致,例如入口页canonical指向自身而深层页canonical指向入口页,则断点在canonical配置,深层页不会被独立对待。修正canonical后,下一步应重新提交站点地图并观察日志,而不是直接判断已恢复。站点地图不保证收录,它只提供发现线索。
同一个现象往往有两种合理解释,需要证据区分。
现象:深层URL在日志中请求量下降。解释一,抓取链路断了;解释二,入口页改版后深层链接减少,爬虫自然少走。区分方法:对比改版前后入口页源码中深层链接的数量与位置。若链接数量未变而请求量下降,更可能是服务端响应变慢或返回异常导致爬虫降低频率。若链接数量明显减少,断点在链接结构。
现象:某深层目录整体不出现。解释一,robots.txt拦截;解释二,该目录下所有页面都返回软404。区分方法:直接请求该目录下一个具体URL,看响应码与内容。若返回200且内容正常,但robots.txt中该目录被Disallow,则断点在抓取规则。此时移除规则是必要动作,但移除后仍需确认页面本身可索引,因为抓取限制与索引状态是两件事。
假设一个站点结构为/a/ → /a/b/ → /a/b/c/,入口页/a/正常返回200,但/a/b/c/始终不被抓取。
第一步,请求/a/b/c/,返回200且内容完整,排除服务端故障。第二步,查看/a/源码,发现指向/a/b/的链接存在,但/a/b/页面中指向/a/b/c/的链接由JS点击事件生成,源码中没有href。第三步,禁用JS后再次查看/a/b/,确认链接消失。结论:断点在第二跳的链接生成方式。修正为服务端输出<a href="/a/b/c/">后,日志中该路径开始出现。此例子为假设,用于说明逐跳核对的方法,不代表任何真实站点数据。
例外情况:若/a/b/本身是筛选结果页,且参数被robots.txt拦截,则即使修正链接,抓取仍会被阻止。此时应先确认该页面是否值得被抓取。若筛选组合数量巨大,保留拦截是合理选择,代价是深层内容依赖其他路径被发现。
最后一步动作:在修正任一断点后,只观察对应路径的日志变化,不要同时改动多处。若一次改动多个环节,无法判断是哪一处生效。确认单点恢复后,再处理下一层断点。