搜索抓取

搜索蜘蛛URL发现:客户端渲染页面的链接可见性与入口补挂

前端改版后抓取量下降,很多时候是因为列表链接只存在于渲染后的 DOM 里,初始 HTML 中并不可见。本文给出源码与渲染后 DOM 的对比自检方法,整理 onclick 跳转、前端路由、滚动加载等常见写法,并给出静态链接、分页地址、面包屑、Sitemap 等补充入口的实操思路与上线后的观察指标。

搜索抓取

搜索蜘蛛URL发现:客户端渲染页面的链接可见性与入口补挂

很多站点在做完前端改版后,会发现抓取日志里新增的 URL 明显变少,但内容确实在更新。这类情况常常不是服务器问题,而是入口链接只存在于浏览器渲染后的 DOM 里,抓取工具拿到的初始 HTML 中什么都没有。链接既然没出现,后续的抓取自然无从谈起。

先确认:源码里到底有没有链接

判断方法不复杂,关键是分别看初始 HTML 和渲染后 DOM 两个版本。

  • 用命令行或抓取工具直接取初始 HTML,统计其中的链接数量,只算指向站内、可点击的真实地址。
  • 在浏览器里打开同一页面,用开发者工具查看渲染后的 DOM,再统计一次。
  • 如果两个数字差距很大,比如初始 HTML 只有导航和页脚,渲染后却多出几十条列表链接,说明列表内容几乎完全依赖脚本注入。
  • 再看抓取日志:如果抓取集中在首页和少数栏目页,详情页几乎没有入口记录,基本可以印证上面的判断。

常见的链接隐形写法

  • 用 div 或 span 加 onclick 做跳转,没有 a 标签和 href。
  • href 写成 javascript:void(0),真实地址由脚本拼接。
  • 用前端路由切换页面,地址栏变了,但 HTML 中没有对应的链接。
  • 列表在滚动到底部或点击更多之后才注入,初始视口内没有可抓的链接。
  • 分页做成了按钮,缺少形如 /list/2、/list/3 的静态地址。

这些写法对体验未必差,但对 URL 发现并不友好。抓取工具通常不会执行复杂的交互,滚动加载和点击展开的内容往往拿不到。

补充入口的几种做法

  1. 保留一份静态链接:首屏列表用服务端渲染或预渲染输出真实的 a 标签,脚本只负责增强交互。
  2. 分页给出可访问地址:页码路径用 a 标签承载,即使视觉上是按钮,也要有可点击的真实链接。
  3. 面包屑与相关阅读内链:这两类位置结构稳定、数量可控,适合长期作为详情页的补充入口。
  4. 站点地图兜底:把重要详情页写入 Sitemap,作为脚本渲染之外的发现渠道,但不要指望它替代内链。
  5. 栏目与专题页:为更新频繁的内容维护一个静态聚合入口,减少对客户端渲染的依赖。

分页与筛选要分清主次

筛选和排序参数容易把入口摊薄。建议只把有稳定内容、会长期存在的列表地址纳入入口体系,临时组合参数通过 robots.txt 或页面上的 nofollow 收敛,避免把抓取预算耗在随时会变的路径上。

入口数量不等于抓取价值。一条能稳定到达详情页的链接,通常比几十条参数不同的临时链接更有用。

改动上线后看什么

  • 抓取日志中入口链接的命中次数是否回升,尤其是之前为零的详情页。
  • 新增 URL 的发现速度,观察从列表页出现到详情页被抓取的间隔。
  • 抓取工具是否仍在反复请求同一批参数页,若是则继续收敛。
  • 服务器返回状态是否稳定,避免渲染服务压力带来间歇性 5xx。

改造不必一次到位,可以先从更新最频繁的栏目页开始,把静态链接补上,再逐步覆盖其他模板。上线后按周对比日志,比一次性大改更容易看清哪一步起了作用。