常见问题

入口页的目标链接由 JavaScript 动态写入,搜索蜘蛛还能发现吗?

入口页用 JavaScript 动态拼出目标链接,在浏览器里看着正常,搜索蜘蛛却未必拿得到。本文说明抓取与渲染两步处理的差异,列出几种高风险写法,并给出自测方法和降低不确定性的调整思路。

常见问题

入口页的目标链接由 JavaScript 动态写入,搜索蜘蛛还能发现吗?

把目标链接交给 JavaScript 动态拼进页面,是蜘蛛池入口页里很常见的做法。但从搜索蜘蛛的角度看,这些链接能不能被发现,取决于它有没有对这个页面做渲染,而渲染并不是必然发生的。

搜索蜘蛛处理页面大致分两步

主流搜索引擎通常先抓一次原始 HTML,从这份 HTML 里提取正文、链接和资源清单;之后再决定是否把页面送进渲染队列,用无头浏览器跑一遍脚本,重新提取一次。两次提取不是同步进行的,第一次拿不到的东西,只能等第二次。

这就带来两个事实:原始 HTML 里没有链接,那一次就等于没有发现入口;而渲染队列有取舍、有排队、有滞后,对大量入口页来说,渲染覆盖率通常明显低于首次抓取覆盖率。

几种常见写法的实际表现

相对可控的写法

  • 链接本身以 a 标签写在 HTML 里,JS 只负责统计、样式之类的增强。
  • 服务端渲染,首屏返回的 HTML 就带完整链接列表。
  • 用了前端框架但做了预渲染,返回的 HTML 与渲染后基本一致。

风险较高的写法

  • 等页面的脚本加载完成后才把链接插入 DOM。
  • 需要滚动到底、点击"加载更多"或展开折叠面板才出现链接。
  • 链接地址由接口异步返回,拿到数据后再拼进页面。
  • 整站客户端渲染,首屏 HTML 里只有一个空容器。

这些写法在浏览器里体验都正常,但搜索蜘蛛第一次拿到的 HTML 往往什么链接都没有。

先自测,再改结构

  1. 用"查看网页源代码"或命令行抓取看原始 HTML,不要用开发者工具里的元素面板,那里显示的是渲染后的结果。
  2. 关闭浏览器 JavaScript 后打开入口页,看看目标链接还在不在。
  3. 用站长工具里的抓取测试,分别查看原始 HTML 和渲染结果,对比链接数量差异。
  4. 过几天再翻服务器日志,确认目标 URL 有没有出现抓取记录,而不是只看有没有收录。

让 URL 发现更稳的调整方向

  1. 把最重要的入口链接放回静态 HTML,哪怕只保留一部分。
  2. 给异步列表配一套静态分页地址,让搜索蜘蛛有路可走。
  3. sitemap 可以作为补充通道,但不要当成唯一发现来源。
  4. 减少入口页对第三方脚本和外部接口的依赖,资源加载失败时,渲染出来的链接也会一起消失。
JS 输出链接不是不能用,而是不要把它当成唯一通道。URL 发现这件事,静态可读通常比依赖渲染更可靠。

几个容易踩的误区

  • "我在浏览器里能看到链接,搜索蜘蛛应该也能看到"——两者拿到的 HTML 常常不是同一份。
  • "提交了 sitemap 就不用管 HTML 里的链接"——sitemap 有助于发现,但不等于会被抓取。
  • "渲染早晚会发生"——渲染队列存在滞后,也可能跳过,不能当作兜底方案。

回到入口页本身的设计:能让搜索蜘蛛用尽量少的资源发现目标 URL,就是合格的入口页。脚本可以提升访客体验,但把整条发现链路压在渲染上,等于把不确定性留给了自己。