常见问题

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

搜索蜘蛛读页面分抓取原始 HTML 和执行 JS 后渲染两步,链接只出现在第二步就多了一层不确定性。本文说明原始 HTML 与渲染后 DOM 的区别,分析哪些 JS 写法最容易漏抓,给出更稳妥的链接输出方式,以及用源代码、官方工具和服务器日志自查的具体方法。

常见问题

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

很多人在做入口页的时候,为了省事或者为了控制链接的输出,会让 JavaScript 在页面加载后再把目标链接写进 DOM。这种页面用浏览器打开一切正常,点一下就跳走,但搜索蜘蛛拿到的东西可能完全不一样。

先给结论

JS 动态生成的链接,搜索蜘蛛有可能发现,但确定性远不如直接写在 HTML 里的 a 标签。能不能发现,取决于蜘蛛是否会对这个页面做渲染,以及渲染排期要等多久。对做 URL 发现来说,凡是停留在有可能,就意味着有相当一部分抓取会落空。

入口页的目标是降低发现成本,而不是展示前端技术。链接出现在源码里,是成本最低的做法。

搜索蜘蛛读页面有两种模式

主流搜索引擎处理一个 URL,大致分成两步:

  • 抓取原始 HTML:先把服务器返回的那段源码拿回来,这一步不执行 JS。链接不在源码里,这一步就什么都拿不到。
  • 渲染后再看一遍:把页面放进渲染队列,用类似无头浏览器的方式执行 JS,再取一次 DOM。链接如果是这一步生成的,才有机会被看到。

问题在于第二步是有成本的。搜索引擎不会对每个页面都做完整渲染,渲染排期也要排队。页面抓取频次低的时候,这一步可能迟迟不发生,甚至一直不发生。

哪几种写法最容易漏

  • 用 onclick 加 window.location 代替 a 标签跳转,源码里根本没有链接。
  • 把链接地址放在 JS 变量或接口返回的数据里,等异步请求回来再插入页面。
  • 整页由前端框架渲染,首屏 HTML 里只有一个空容器。
  • 先加载骨架屏,链接要等一两秒才出现。
  • 渲染所需的脚本或样式文件本身被 robots.txt 挡住,渲染必然失败。

反过来,如果只是用 JS 给已经存在的 a 标签加埋点、改样式,链接本身还在源码里,那基本不受影响。

想用 JS 又想稳妥,可以这样处理

  1. 把目标 URL 至少以 a 标签加 href 的形式写进服务端输出的 HTML,JS 只做增强。
  2. 必须动态插入时,尽量在首屏同步插入,不要等异步接口,也不要等用户交互。
  3. 确认渲染要用的 JS、CSS 文件没有被 robots.txt 拦掉。
  4. 控制一次抓取里要执行的脚本量,减少不必要的第三方资源。
  5. 重要入口页尽量保持服务端渲染或静态输出,JS 只作为补充手段。

怎么判断自己的页面有没有被读到

  • 用浏览器查看网页源代码,注意不是审查元素,看能否直接搜到目标域名。搜不到,就是纯 JS 生成。
  • 用搜索引擎官方的 URL 检查类工具,对比原始 HTML 和渲染后 HTML 两种结果。
  • 看服务器日志,如果入口页被频繁抓取,但目标站日志里始终没有对应蜘蛛的记录,多半就卡在渲染这一步。
  • 做对照实验:同样的链接,一份静态写死、一份 JS 生成,分别放在两个入口页,观察目标 URL 的抓取情况。

小结

JS 渲染不是不能用,但它把确定会被发现变成了可能会被发现。入口页的作用是让目标 URL 尽快被看到,那就没必要在这里增加不确定性。能静态写进源码的链接,就不要交给 JavaScript。