搜索抓取

首屏 HTML 里有什么,决定了蜘蛛能抓到什么

搜索蜘蛛拿到的是服务器返回的 HTML,不是浏览器渲染完的画面。本文说明服务端渲染、客户端渲染与混合渲染在抓取上的差别,并给出判断页面类型的方法与几处可落地的调整,让正文和内链出现在初始响应里,减少 URL 发现环节的损耗。

搜索抓取

首屏 HTML 里有什么,决定了蜘蛛能抓到什么

搜索蜘蛛抓取一个页面时,它先看到的是服务器返回的 HTML,而不是浏览器渲染完成之后的画面。这个差别决定了页面上的内容和链接能不能进入抓取路径。很多站点内容本身没有问题,卡住的地方在于首屏 HTML 里几乎什么都没有。

蜘蛛拿到的是响应体,不是屏幕上的画面

用户打开页面时,浏览器会下载 HTML、样式和脚本,执行 JavaScript,再请求接口拿数据,最后拼出可见内容。蜘蛛访问时只走前面的步骤,脚本渲染可能在后续的渲染队列里完成,但这需要额外的时间和资源,也不保证每次都执行得完整。

所以判断一个页面能不能被抓到,最简单的问题是:关掉 JavaScript,这个页面的主要内容还在不在。如果关掉之后只剩导航框架和一片空白,那蜘蛛第一次看到的也大概率是这样。

三种渲染方式在抓取上的差别

服务端渲染与静态生成:内容写在 HTML 里

服务端渲染和静态生成产出的 HTML 中,正文、标题、内链、分页链接都已经写好了。蜘蛛拿到响应体就能直接解析出 URL,不需要等待脚本执行。对于详情页、栏目列表页这类需要被发现的页面,这是最省事的形态。

客户端渲染:首屏依赖脚本执行

纯客户端渲染的站点,HTML 往往只有一个空的容器节点和一堆脚本引用。用户的浏览器会把内容补齐,但蜘蛛可能需要把页面放进渲染队列,等资源加载完再执行。脚本报错、接口超时、第三方资源加载失败,都可能让抓取结果停在空壳状态。即便渲染成功,也多花了一轮时间和带宽。

混合与预渲染:要看具体实现

不少框架是混合模式,一部分内容由服务端输出,一部分留给客户端。预渲染则是提前生成一份含内容的 HTML。两种做法本身没有对错,关键是确认最终返回给蜘蛛的那份 HTML 里,是否包含你希望被发现的 URL 和正文。

判断页面属于哪一种,可以用几个简单办法

  1. 查看网页源代码,搜一下正文里的关键词。如果只能看到脚本引用和空的容器节点,说明内容靠 JavaScript 生成。
  2. 临时禁用 JavaScript 打开页面,看看还剩多少内容和多少链接。
  3. 用抓取工具或命令行直接请求 URL,只看不带渲染的响应体。
  4. 在搜索平台的抓取诊断里查看返回的 HTML 是否完整,对比抓取时间和渲染状态。

想让蜘蛛少踩坑,优先调整这几处

  • 详情页和栏目页尽量采用服务端渲染或静态生成,至少保证正文和主要内链在初始 HTML 中。
  • 分页链接、列表项链接不要依赖滚动或点击才产生,写成真实的 a 标签。
  • 核心内容不要等接口返回后才出现,可以考虑把首屏数据直接内联进 HTML。
  • 如果必须用客户端渲染,把关键 URL 放进 Sitemap,作为内链之外的补充发现入口。
  • 渲染层出错时返回明确的状态码,不要用 200 返回一个空页面,那容易变成软 404。

链接也必须出现在 HTML 里

内容能被渲染出来还不够,链接同样要在初始 HTML 里可解析。如果导航和列表是脚本动态生成的,蜘蛛即使完成了渲染,也可能拿不到完整的 URL 集合。内链是抓取路径的主要来源,链接缺一块,后面很多页面就迟迟进不了队列。

另外要注意,渲染出来的链接应该是稳定的地址。每次渲染都带上随机参数,容易制造同一个内容的多个地址,把有限的抓取次数花在重复页面上。

蜘蛛看到的是 HTML,不是屏幕。想让内容进入抓取路径,先让它在源代码里出现。