提醒:本文发布于 4 年前 ,文中所描述的信息可能已发生改变,请谨慎使用。

总有人会问,AngularJS/BackboneJS/... 怎么做 SEO。

当时我的回答就是双倍的工作量,针对爬虫输出一套静态的页面。

然后今天突然发现了这个Prerender,他提供一套代理服务,可以把 SPA 静态化返回给爬虫。

思路

别人既然靠这套服务能赚钱,自己思考一下怎么做。

一,Prerender 是没有侵入服务端的,再考虑到 SPA 是在客户端渲染。大概推断 Prerender 会访问页面,并执行页面的 JS,待JS执行完毕后,将页面的 HTML 输出。

二,判断爬虫,这个相对简单,维护一个爬虫的 UserAgent 列表就可以了。

思路挺简单的,但是实现细节有些麻烦。

服务端页面渲染和抓取

如果用上开源的东西,自然而然就是 PhantomJS,但是之前帮别人基于 PhantomJS 做网页抓取时,发现了几个问题。

  1. 资源消耗大,Webkit 是个吃内存的大货;
  2. 缺少判断页面加载完成的条件,不知道什么时候页面才真正加载完成了;

同时结合 Prerender 的需求场景,还有问题

  1. 只需要输出 HTML,所以得不加载 CSS/image/等其他资源来降低服务器负载;
  2. 精简 Webkit 渲染,增加安全机制避免页面不正常的 JS 代码把服务器 CPU 资源消耗殆尽;
  3. 调度和缓存,网页渲染的速度不会太理想,需要一套合理的调度负载均衡系统加上简单的KV缓存来解决性能问题。

总的来说,Prerender 就是把 Google 的爬虫在自己服务端实现了一遍,从而解决像 Baidu 这样不支持 JS 解析的爬虫的抓取问题。

遗留问题

  1. 存在的一些问题似乎已经超越了前端工程师的能力范围,小团队除了购买 Prerender 收费服务似乎没有其他选择,国内似乎还没有类似的山寨产品;
  2. 由于服务端单独针对爬虫输出的不一样的页面,如何防止被搜索引擎判为作弊?