咱们测试了谷歌爬虫是如何抓取 JavaScript,下面就是咱们从中学习到的知识。javascript
认为 Google 不能处理 JavaScript ?再想一想吧。Audette Audette 分享了一系列测试结果,他和他同事测试了什么类型的 JavaScript 功能会被 Google 抓取和收录。java
长话短说web
咱们进行了一系列测试,已证明 Google 能以多种方式执行和收录 JavaScript。咱们也确认 Google 能渲染整个页面并读取 DOM,由此能收录动态生成的内容。编程
引言:Google 执行 JavaScript & 读取 DOM浏览器
早在 2008 年, Google 就 成功抓取 JavaScript,但极可能局限于某种方式。服务器
而在今天,能够明确的是,Google 不只能制定出他们抓取和收录的 JavaScript 类型,并且在渲染整个 web 页面上取得了显著进步(特别在最近的 12 到 18 个月)。框架
在 Merkle,咱们的 SEO 技术团队想更好地理解谷歌爬虫能抓取和收录什么类型的 JavaSscript 事件。通过研究,咱们发现使人瞠目的结果,并已证明 Google 不只能执行各类 JavaScript 事件,并且能收录动态生成的内容。怎么样作到的?Google 能读取 DOM。编程语言
DOM 是什么?ide
不少搞 SEO 的都不理解什么是 Document Object Model(DOM)。函数
当浏览器请求页面时会发生什么,而 DOM 又是如何参与进来的。
当用于 web 浏览器,DOM 本质上是一个应用程序的接口,或 API,用于标记和构造数据(如 HTML 和 XML)。该接口容许 web 浏览器将它们进行组合而构成文档。
DOM 也定义了如何对结构进行获取和操做。虽然 DOM 是与语言无关的 API (不是捆绑在特定编程语言或库),但它广泛应用于 web 应用程序的 JavaScript 和 动态内容。
DOM 表明了接口,或“桥梁”,将 web 页面与编程语言链接起来。解析 HTML 和执行 JavaScript 的结果就是 DOM。web 页面的内容不(不只)是源码,是 DOM。这使它变得很是重要。
JavaScript 是如何经过 DOM 接口工做的。
咱们兴奋地发现 Google 可以读取 DOM,并能解析信号和动态插入的内容,例如 title 标签、页面文本、head 标签和 meta 注解(如:rel = canonical)。可阅读其中的完整细节。
这一系列测试和结果
由于想知道什么样的 JavaScript 功能会被抓取和收录,咱们单独对 谷歌爬虫 建立一系列测试。经过建立控件,确保 URL 活动能被独立理解。下面,让咱们详细划分出一些有趣的测试结果。它们被分为 5 类:
JavaScript 重定向
JavaScript 连接
动态插入内容
动态插入 Meta 数据 和页面元素
例子:一个用来测试谷歌爬虫理解 JavaScript 能力的页面。
咱们首先测试了常见的 JavaScript 重定向,用不一样方式表示的 URL 会有什么样结果呢?咱们选择了 window.location 对象进行两个测试:Test A 以绝对路径 URL 调用 window.location,而 Test B 使用相对路径。
结果:该重定向很快被 Google 跟踪。从收录来看,它们被解释为 301 - 最终状态的 URL 取代了 Google 收录里的重定向 URL。
在随后的测试中,咱们在一个权威网页上,利用彻底相同的内容,完成一次利用 JavaScript 重定向到同一个站点的新页面。而原始 URL 是排在 Google 热门查询的首页。
结果:果真,重定向被 Google 跟踪,而原始页面并无被收录。而新 URL 被收录了,并马上排在相同查询页面内的相同位置。这让咱们很惊喜,以排名的角度上看,视乎代表了JavaScript 重定向行为(有时)很像永久性的 301 重定向。
下次,你的客户想要为他们的网站完成 JavaScript 重定向移动,你可能不须要回答,或回答:“请不要”。由于这彷佛有一个转让排名信号的关系。支持这一结论是引用了 Google 指南:
使用 JavaScript 为用户进行重定向,多是一个合法的作法。例如,若是你将已登陆用户重定向到一个内部页面,你可使用 JavaScript 完成这一操做。当仔细检查 JavaScript 或其余重定向方法时,以确保你的站点遵循咱们的指南,并考虑到其意图。记住 301 重定向跳转到你网站下是最好的,但若是你没有权限访问你网站服务器,你能够为此使用 JavaScript 重定向。
咱们用多种编码方式测试了不一样类型的 JS 连接。
咱们测试下拉菜单的连接。历史上的搜素引擎一直不能跟踪这类型的连接。咱们想肯定 onchange 事件处理器是否会被跟踪。重要的是,这只是执行特定的类型,而咱们须要是:其它改动后的影响,而不像上面 JavaScript 重定向的强制操做。
例子: Google Work 页面的语言选择下拉菜单。
结果:连接被完整地抓取和跟踪。
咱们也测试了常见的 JavaScript 连接。下面是最多见类型的 JavaScript 连接,而传统的 SEO 则推荐纯文本。这些测试包括 JavaScript 连接代码:
做用于外部 href 键-值对(AVP),但在一个标签内(“onClick”)
做用 href 内部 AVP(“javascript : window.location”)
做用于 a 标签外部,但在 href 内调用 AVP(“javascript : openlink()”)
结果:连接被完整抓取和跟踪。
咱们下一个测试是更进一步地测试事件处理器,如上面测试的 onchange。具体地说,咱们但愿利用鼠标移动的事件处理器,而后隐藏 URL 变量 ,该变量只在事件处理函数(在该案例是 onmousedown 和 onmouseout)被触发时执行。
结果:连接被完整抓取和跟踪。
构造连接:咱们知道 Google 能执行 JavaScript,但想确认它们是否能读取代码里的变量。因此在该测试中,咱们链接能构造 URL 字符串的字符。
结果:连接被完整抓取和跟踪。
很明显,这些都是重点:动态插入文本、图像、连接和导航。优质的文本内容对搜索引擎理解网页主题和内容是相当重要的。在这个动态网站的时代,它的重要性是无需质疑的。
这些测试,设计出来是为了检查在两个不一样场景下动态插入文本的结果。
测试搜索引擎可否统计动态插入的文本,而文本是来自页面 HTML 源码内的。
结果:在两个案例中,文本都能被抓取和收录,而且页面是根据该内容进行排名。爽!
为了了解更多相关信息,咱们测试了一个经过 JavaScript 编写的客户端全局导航,而导航里的连接都是经过 document.writeIn 函数插入,而且肯定它们能被彻底抓取和跟踪。应该指出的是:Google 能解释使用 AngularJS 框架 和 HTML5 History API(pushState)构建的网站,能渲染和收录它,并能像传统静态网页同样排名。这就是 不由止谷歌爬虫 获取外部文件和 JavaScript 的重要性,并且这也许是 Google 正在从 《支持 Ajax 的 SEO 指南》 中移除它的缘由。当你能简单地渲染整个页面时候,谁还须要 HTML 快照呢?
通过测试后发现,无论什么类型的内容,都是一样的结果。例如,图像加载到 DOM 后会被抓取和收录。咱们甚至作了这样的一个测试:经过动态生成 data-vocabulary.org 结构数据来制做 breadcrumb(面包屑导航),并将其插入 DOM。结果呢? 成功插入后的面包屑出如今搜索结果中了 (search engine results page)。
值得注意的是,Google 如今 推荐用 JSON-LD 标记 造成结构化数据。我敢确定未来会出现更多基于此的东西。
咱们将各类对 SEO 相当重要的标签动态插入到 DOM:
Title 元素
Meta 描述
Meta robots
结果:在全部案例中,标签都能被抓取,其表现就像 HTML 源码里的元素同样。
一个有趣的补充实验帮助咱们理解优先顺序。当存在冲突信号时,哪个会胜出呢?若是源码里有 noindex、nofollow 标签,而 DOM 里有 noindex、follow 标签的话,将会发生什么呢?在这协议里,HTTP x-robots 响应头部的行为如何做为另外一个变量?这将是将来综合测试的一部分。然而,咱们的测试显示:当冲突时,Google 会无视源码里的标签,而支持 DOM。
咱们想测试 Google 如何应对出如今源码和 DOM 的链路级别的 nofollow 属性。咱们也所以建立了一个没有应用 nofollow 的控件。
对于 nofollow ,咱们分别单独测试源码 vs DOM 生成的注解。
源码里的 nofollow 正如咱们所期待的那样运行(连接没被跟踪)。而 DOM 里的 nofollow 却失效(连接被跟踪,而且页面被收录)。为何?由于在 DOM 里修改 href 元素的操做发生得太晚了:Google 在执行添加 rel=”nofollow” 的 JavaScript 函数前,已准备好抓取连接和队列等待着 URL。然而,若是将带有 href =”nofollow”的 a 元素插入到 DOM,nofollow 和连接因在同一时刻插入,因此会被跟踪。
结果
从历史角度上看,各类 SEO 推荐是在任何可能的时候,要尽量专一 ‘纯文本’ 内容。而动态生成内容、AJAX 和 JavaScript 连接会损害主流搜索引擎的 SEO。显然,这对 Google 再也不是问题。 JavaScript 连接以相似普通的 HTML 连接方式运行(这只是表面,而咱们不知道幕后程序进行了什么操做)。
*动态插入内容,甚至 meta 标签,如 rel canonical 注解,不管在 HTML 源码,仍是在最初 HTML 被解析后触发 JavaScript 生成 DOM ,都以同等方式对待。
*Google 视乎能彻底渲染页面和理解 DOM ,而不只是源码。实在是使人可不思议!(记得容许谷歌爬虫获取那些外部文件和 JavaScript。)
对于 SEO,那些没有理解上述基本概念和 Google 技术的人,应该好好研究和学习,以遇上当前技术。若是你不把 DOM 考虑在内,您可能会丢失一半份额。
本文所表达观点不全是由 Search Engine Land (一家搜索引擎网站)提供,部分观点是由客座做者提供。全体做者列表。