常见问题

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

入口页上的目标链接如果由 JavaScript 动态插入,搜索蜘蛛是否还能发现?本文说明搜索引擎抓取与渲染的两步流程、容易被漏掉的几种写法、可落地的改进做法,以及用日志验证渲染抓取有没有真正发生的方法,帮助站点运营排查 URL 发现环节的问题。

常见问题

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

入口页上放目标链接,是蜘蛛池里最常见的操作之一。现在不少入口页是用前端框架或者一段脚本拼出来的,链接在浏览器里看得见,但服务器返回的原始 HTML 里找不到。这种情况下,搜索蜘蛛能不能发现目标 URL,答案不是简单的能或不能,而是取决于链接出现在哪个环节。

先确认一件事:链接在不在初始 HTML 里

用浏览器打开入口页,右键查看网页源代码(注意不是“检查元素”)。如果在源代码里搜不到目标 URL,那这条链接就属于需要执行 JavaScript 才会出现的类型。搜索引擎处理这类链接的方式,和普通 HTML 链接并不一样。

搜索蜘蛛处理 JavaScript 的基本流程

主流搜索引擎通常分两步走:先抓取服务器返回的 HTML,把页面放进渲染队列;之后再安排一次带渲染能力的抓取,执行页面上的脚本,拿到渲染后的 DOM,再从里面提取链接。

也就是说,JS 渲染出来的链接是有机会被发现的,但要穿过更多环节:渲染队列可能积压、脚本可能报错、外部资源可能加载失败或超时、渲染结果可能不完整。任何一个环节出问题,这条链接在那一轮抓取里就不会被发现。

容易被漏掉的几种写法

  • 用 innerHTML 拼接字符串插入链接,或者在脚本里用 document.write 输出链接
  • 链接要等某个接口返回数据之后才插入,接口慢或失败时页面上什么都没有
  • 需要用户点击“展开更多”“加载更多”才会出现
  • 用 onclick 加 location.href 跳转,而不是标准的 a 标签加 href 属性
  • 设置了较长的延时(比如几秒后才插入),渲染抓取的等待窗口可能等不到
  • 内容依赖登录状态、cookie 或者特定地区判断,抓取时拿不到同样结果

想让目标 URL 更容易被发现,可以这样做

  1. 把最关键的目标链接放在服务端渲染的 HTML 里,脚本只负责附加内容
  2. 用标准 a 标签加 href,不要用按钮或 div 模拟链接
  3. 如果确实要异步插入,尽量缩短等待时间,不要依赖用户交互触发
  4. 保证接口和静态资源可正常访问,别让渲染过程因为某个资源返回 4xx、5xx 而中断
  5. 在入口页保留一份纯 HTML 的兜底链接列表,脚本加载失败时仍有链接可抓

怎么验证链接有没有被渲染到

  • 关闭浏览器 JavaScript 再看页面,如果链接全部消失,说明严重依赖渲染
  • 看服务器日志里有没有带渲染特征的抓取请求,以及脚本、接口等渲染资源是否被请求过
  • 对比原始 HTML 抓取和渲染抓取的时间,看渲染抓取是不是经常缺失或失败
  • 检查渲染相关请求有没有大量 429、超时,这通常意味着抓取预算被浪费掉了
JS 渲染只代表“有机会被发现”,不代表一定被发现,更不代表会被收录或获得排名。入口页本身的可访问性、稳定性和内容质量,仍然是更基础的前提。

常见的几个误区

  • 以为“浏览器能看到,搜索蜘蛛就能看到”,但浏览器和爬虫的执行环境并不等价
  • 以为渲染抓取是无限次的,实际上渲染消耗资源,频率和配额都有限
  • 以为单页应用不需要任何处理,如果路由用 history API 又没有服务端兜底,链接往往更难被发现
  • 把所有链接都交给脚本生成,原始 HTML 里空无一物,抓取预算花在渲染上却没换来 URL 发现

小结

如果入口页的目标链接必须由 JavaScript 才能出现,处理思路其实很直接:能放回 HTML 的就放回 HTML;放不回去的,缩短渲染依赖链、减少外部资源阻塞、保留兜底链接,然后用日志确认渲染抓取到底有没有发生。发现只是第一步,之后的抓取和收录,还要看目标页面自身的情况。