搜索抓取

抓取失败的分层排查:从域名解析到页面解析,蜘蛛可能卡在哪一层

蜘蛛没抓到页面,原因未必在 Sitemap 或内链。把抓取过程拆成解析、连接、响应、内容解析、后续路径几层,逐层核对日志、状态码和页面源码,更容易定位是服务器、链接写法还是页面本身的问题。本文给出一个可操作的排查顺序。

搜索抓取

抓取失败的分层排查:从域名解析到页面解析,蜘蛛可能卡在哪一层

蜘蛛没来抓某个页面,很多人的第一反应是去看 Sitemap,或者怀疑内链太少。但抓取本身是一条有多道关卡的链路:域名能不能解析、连接建不建得起来、服务器返回什么、返回的内容能不能用、页面里还有没有值得继续跟的链接。任何一层断了,后面的动作都不会发生。把问题分层看,比反复提交 Sitemap 更有效。

为什么要把抓取问题分层

日志里只看到“没来抓”,看不到原因。分层的好处是每一层都有可验证的证据:DNS 有解析记录,服务器有访问日志,响应有状态码,页面有 HTML 内容,链接有具体的 href。逐层确认,就能把“蜘蛛不抓”这个模糊结论,缩小到一个具体环节。

抓取失败通常不是单一原因,而是某几层同时存在问题。先找到第一道断裂的关卡,再谈优化。

第一层:域名解析与网络可达

如果蜘蛛连域名都解析不了,后面所有讨论都没有意义。常见情况包括:

  • 更换服务器后 DNS 记录未同步,部分地区仍解析到旧 IP;
  • 解析商对某些来源的请求做了限制,导致抓取方拿不到正确结果;
  • 域名刚启用,解析尚未全网生效。

这一层的证据是解析结果和线路差异,而不是站点日志——因为请求根本没到你的服务器。

第二层:连接与响应

请求到了服务器,接下来看连接是否稳定。服务器忽快忽慢、并发被占满、TLS 握手频繁失败,都会让蜘蛛在拿到内容前就放弃。

需要关注的信号

  • 响应时间是否长期偏高,尤其是首字节时间;
  • 是否出现间歇性 5xx,而不是稳定错误;
  • 是否因为频控或 WAF 规则,把正常抓取一起拦掉。

这一层的特点是“时好时坏”。如果同一个 URL 有时能抓、有时失败,优先怀疑服务器承载和防护策略,而不是内容问题。

第三层:内容能否被正常解析

状态码 200 不代表抓取成功。页面主体依赖前端渲染、关键内容由脚本异步加载,或者返回了一个空壳 HTML,蜘蛛拿到的就是一份没有信息的文档。

  • 首屏内容是否直接存在于 HTML 源码中;
  • 重要链接是不是通过 JS 事件绑定,而不是真正的 a 标签;
  • 页面是否因为体积过大,在抓取时被截断。

验证方式很直接:关掉脚本,看页面还剩多少内容和链接。剩得越少,抓取效率越受影响。

第四层:URL 发现与后续路径

前面三层都通了,蜘蛛确实进来了,但只抓了这一个页面就走。问题往往在链接结构上:

  • 页面里没有指向其他相关内容的链接,形成孤岛;
  • 链接都集中在页脚或导航,路径重复且层级混乱;
  • Sitemap 里列了 URL,站内却没有对应的入口。

抓取是沿着链接不断前行的过程。没有出口的页面,对蜘蛛来说就是终点站。

一个可操作的排查顺序

  1. 确认域名解析在主要线路上一致,先排掉 DNS 问题;
  2. 从服务器日志里筛出抓取来源,看状态码分布和响应时间;
  3. 对失败 URL 做单点复测,区分稳定错误和间歇错误;
  4. 查看页面源码,确认正文和链接是否可直接读取;
  5. 检查这些 URL 在站内是否有真实入口,以及入口所在的层级;
  6. 最后再回头看 Sitemap 是否与实际可抓取的 URL 一致。

顺序很重要。先把 Sitemap 做得再漂亮,前面几层不通,也只是把一份清单交给了到不了的蜘蛛。

几个容易误判的地方

  • 把没抓当成没收录:抓取、收录、展现是三件事,日志能看到的只有抓取;
  • 只看一次失败就下结论:间歇性错误需要多时段对比;
  • 用提交代替修复:提交只是提示,不解决连接和内容层面的问题。

抓取排查的收益,往往来自少做无用功。与其不断新增 Sitemap 条目,不如先确认站点的每一层都能稳定交付内容,让蜘蛛顺着链接走得下去。