常见问题

入口页链接由 JavaScript 异步渲染出来,搜索蜘蛛还能发现目标 URL 吗

入口页的链接如果由 JavaScript 异步渲染,搜索蜘蛛能否发现目标 URL 并不确定:渲染要排队、有超时、受资源限制。本文梳理蜘蛛处理 JS 链接的大致流程、风险较高的写法、自查方法,以及更稳妥的 HTML 直出方案。

常见问题

入口页链接由 JavaScript 异步渲染出来,搜索蜘蛛还能发现目标 URL 吗

入口页的链接如果由 JavaScript 异步渲染出来,搜索蜘蛛还能不能发现里面的目标 URL,答案取决于渲染是否真的发生、发生在什么时候。主流搜索蜘蛛具备一定的渲染能力,但渲染是“尽力而为”:要排队、有超时、受资源限制。因此在 JS 渲染的链接上,URL 发现的确定性明显低于直接写在初始 HTML 里的普通 a 标签链接。

搜索蜘蛛处理 JS 链接的大致流程

  • 先抓取初始 HTML,这一步只能看到服务端返回的内容;
  • 如果判断需要渲染,页面进入渲染队列,延迟可能是几秒,也可能是几天;
  • 渲染时执行 JS,可能重新请求接口、JS 和 CSS 文件;
  • 渲染有超时限制,超时或资源被 robots.txt 屏蔽,通常只保留初始 HTML 的结果;
  • 渲染后新出现的链接,才进入后续的抓取队列。

也就是说,同一批链接,写死在 HTML 里可能当天就被发现,放在 JS 渲染里可能被推迟,甚至这一轮完全没有被发现。

风险较高的几种写法

  • 必须点击、滚动或悬停才触发加载的链接;
  • 依赖登录态或后端接口才返回的列表;
  • 接口响应很慢,渲染超时只拿到半截内容;
  • JS、CSS 文件被 robots.txt 屏蔽,渲染根本无法执行;
  • 没有可读的兜底链接,关掉 JS 后页面上什么都没有;
  • 链接由 JS 拼接随机参数,每次渲染出的 URL 都不一样。

可以按这个顺序自查

  1. 用站长平台的 URL 检查工具查看渲染后的 HTML,与初始 HTML 对比,确认目标链接是否出现;
  2. 用关闭 JS 的方式请求一次入口页,看服务端返回的内容里有没有目标链接;
  3. 查服务器日志:渲染需要的 JS 和接口是否被蜘蛛请求、返回码是什么;
  4. 看目标 URL 是否出现在抓取日志里,而不是只看入口页有没有被访问。

更稳妥的落地方式

  • 希望被稳定发现的目标 URL,优先用普通 a 标签写在初始 HTML 里;
  • 列表首屏和分页链接尽量服务端渲染;
  • 不要用 onclick 或事件委托替代 href;
  • 用 sitemap 做兜底,减少对渲染的依赖;
  • 单个入口页的链接数量适度,避免把发现机会摊薄。
渲染是补充手段,不是保证。把 URL 发现建立在“搜索蜘蛛一定会执行 JS”这个假设上,风险由自己承担。

和入口页运营相关的几点提醒

做入口页时,JS 渲染等于在“页面被访问”和“链接被发现”之间多插了一步。多一步就多一次失败可能:渲染队列延后、超时、资源被屏蔽、接口失败。入口页放量之后,这些不确定性会被放大,排查也更费劲。

如果目标只是让搜索蜘蛛接触到更多目标 URL,最省事的做法仍然是:服务端直出 HTML,用普通链接把目标地址列清楚,再用 sitemap 和日志观察实际抓取情况。渲染方案适合交互复杂的正常站点页面,不太适合用来做纯粹的 URL 分发。