「传统网页开发模式」,网站内容(html)都是采用服务端渲染(SSR)的方式产出的。这样做,方便「爬虫」能够定位到网站内容。这个过程就是:爬虫发现你的网站内容,并且将其展现在大众面前。
但是,按照传统网页开发模式生成页面的过程存在一个致命问题。每当页面中「很小」的数据变更(例如:提交一个表单),服务端需要对「整个页面进行重新渲染」并通过网络将最新的页面传到客户端。
另一方面,客户端渲染(CSR)允许单页面应用(SPA)能够在页面不刷新的前提下,进行页面信息的动态获取和展示。在页面初始阶段,浏览器只需接受页面「最基本的结构信息」(html)然后其余的页面内容都是通过JS来获取或者展示。
当页面中的「部分」内容发生了变更,浏览器只需要向服务端发送用于获取该与该变更信息相关的AJAX。服务端在接收到指定的请求后,经过拼装处理,将浏览器想要的结果(通常是JSON的数据格式)返回。
虽然,SPA能够很好规避SSR渲染时数据更新需要刷新整个页面的弊端,但是由于SPA在页面初始阶段,只返回了页面的基础架构,后续页面内容都是通过JS动态获取的。这样「很不利于爬虫对网站后续内容的收录」。
❝SPA对SEO不友好,是由其「后续」页面内容存在「滞后性」导致的 ❞
在2009年,Google 发布了一种用于解决SPA对SEO不友好的应变方案。
前置知识:何为
❝谷歌机器人是一种特殊的软件,通常被称为蜘蛛,被设计用来在公共网站的页面上爬行。它遵循从一个页面到下一个页面的一系列链接,然后将找到的数据处理成一个集体索引。 可以把它想象成一个拥有不断扩展的库存的图书馆 ❞
在讲方案前,我们先简单介绍一下,对网站应用的处理流程
当 Googlebot 尝试通过发出 HTTP 请求从抓取队列中抓取某个网址时,它首先会检查网页是否允许抓取。Googlebot 会读取 文件。如果此文件将该网址标记为「disallowed」,Googlebot 就会跳过向该网址发出 HTTP 请求的操作,然后会跳过该网址。
接下来,Googlebot 会解析 HTML 链接的 href 属性中其他网址的响应,并将这些网址添加到抓取队列中。若不想让 Googlebot 发现链接,使用 机制
抓取网址并解析 HTML 响应非常适用于「经典网站或服务器端呈现的网页」(在这些网站或网页中,HTTP 响应中的 HTML 包含「所有内容」)
Google的Ajax爬虫方案
该方案包含很多操作步骤。
最后,爬虫能够将原始URL和某时刻的页面快照对应起来,并且将快照内容对外展示。
❝号外:在2015年,Google宣布将放弃AJAX爬虫方案。并于2018年正式停止对其支持。 ❞
现在 不需要用户提供预渲染页面,就能够处理自带额外信息(#!)的URL。
如果想让你的应用在百度、(俄罗斯搜索引擎)、或者等搜索引擎中,SEO取到高分的话,「切记:和Google处理JS一样,不要过于轻信它们的AJAX爬虫方案」
下图展示了,各个浏览器对各种JS框架的爬虫支持程度
尽管,大部分搜索引擎对JS框架或多或少支持爬虫处理。但是,由于CSR的页面内容存在滞后性。使得网站信息不能及时送达用户。
你可以使用一些JS框架(React/Vue)进行网站开发,并且将应用转换为「静态HTML」,并存入指定的服务器。
当客户端向服务端发起页面请求时,浏览器能获取一个「完整」的初始化结构,而不像CSR那样:只获取一个包含指定JS的HTML简易壳子。采用SSR渲染页面,当JS还在后台加载时,用户已经看到完整的页面信息了。
网络爬虫还可以访问页面的完整HTML版本,并在搜索结果中建立索引和显示。
在后续的操作中,应用又变成了客户端渲染,这样能够保证页面变更内容能更快到达用户。
可以通过一个图,对比CSR和SSR渲染同一页面所用的时间。很明显,SSR渲染,页面的有效内容较早出现。
其实,针对SSR还有其他的技术细节需要考虑,例如,何为同构、数据脱水、渲染注入(hydrate)等。关于SSR,我们后期会有专门的文章来解释。
下面,就直接来一个React SSR的实现步骤哇。
❝Google建议「使用渐进增强」和「特性探测」用于对SPA进行SEO优化 ❞
来自SEO高手的建议:为网站建立一个 。即便爬虫已经将你的网站收录了,网站所有者仍然可以继续向爬虫报告网站中未被收录的页面。
「Sitemap.xml」是一个包含你网站中「所有」URL连接的文件。你可以把sitemap.xml想象成向导,用于指引爬虫对网站进行针对性的探索。
sitemap是需要对外公布的。所以,需要在robot.txt中进行注册。
这样,爬虫就能知道你网站的sitemap.xml的具体位置。
同时,在html文档中,需要添加元信息。这样,爬虫在访问到网站后,就会立马知道了,该网站是 SPA。
当网站中存在多个页面内容是一样的,的link标签就会派上用处。可以让爬虫知道URL的哪些部分是强制的,哪些不是。
例如,这将允许爬虫检测查询参数是否影响页面的呈现(分页参数,如?page=11,)或(跟踪参数,如source=baidu)。
如果有一个可以通过多个url访问的页面(电子商务网站经常发生这种情况),或者有多个内容重复的页面,那么让其中一个成为「规范页面」。
选择认为更重要的页面(或者访问者/链接最多的页面)。每当访问非关键页面的时候,总会被引用到关键页面。
对于 cannoical的使用方式,可以参考如上链接。