【一】. 原理
国内主要使用的搜索引擎还是百度。百度的机制还是传统的爬虫机制。在googleSpider上已经有了调整。Google的爬虫可以等待页面渲染成功后进行爬取内容。所以,我们要针对国内的各种爬虫进行优化。让他不需要等待,就可以直接快速爬取页面。

【二】. SSR解决办法是什么
SSR 别搞的那么高大上,本质解释:服务器侧渲染—— service side render。服务端完成部份的渲染。
原理如下:

【三】. 官方的解决方式
爬虫是有名字的,名字写在浏览器头上,叫作UserAgent:baiduSpider;
如果是爬虫,就走Nginx反向代理到:serverless的页面上去;
如果是正常的人:就走nginx 访问正常的网页。

【四】. 开启步骤
有腾讯云账号API 信息不用说了,其他地方很多教程,如果有需要我再完善和贴出来;
把这两个给写上(ServerLess 开通步骤待会儿说):

【五】. nginx配置和补充官方说明
官方的Nginx文档写的不好。
nginx.conf的配置还是相对复杂的,对于很多小白来说不太友好。
如果不懂,不用懂按我说的做即可。
我的文件如下,需要你进行复制,这几天我想办法把备注(nginx的#号注释,被识别成了dzq的话题):
map $http_user_agent $ua_device {
default 'desktop';
~*Baiduspider|Yisouspider|Googlebot|spider|Spider|360Spider|bingbot|Sosospider/i 'bot';
~*(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge\ |maemo|midp|mobile.+firefox|netfront|opera\ m(ob|in)i|palm(\ os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows\ ce|xda|xiino/i 'mobile';
~*android|ipad|playbook|silk/i 'tablet';
}
server
{
listen 80;
server_name www.jindachang.com cdn-aliyun-www.jindachang.com;
index index.html index.htm index.php default.html default.htm default.php;
root /home/wwwroot/www.jindachang.com/public;
include enable-php-pathinfo.conf;
set $dst $uri;
set $dst2 $uri/;
set $dst3 /index.php?$query_string;
if ($ua_device = 'bot') {
set $dst2 "";
set $dst3 @proxypass;
}
location / {
#try_files $uri $uri/ /index.php?$query_string;
try_files $dst $dst2 $dst3;
}
location @proxypass {
proxy_pass http://service-kenft7b9-1308719024.bj.apigw.tencentcs.com;
proxy_connect_timeout 10;
proxy_send_timeout 15;
proxy_read_timeout 20;
proxy_buffer_size 1M;
proxy_buffers 8 1M;
proxy_busy_buffers_size 1M;
proxy_temp_file_write_size 1M;
}
【六】. Nginx配置文件分断解释
下面这一段主要是说是浏览器的header中的UserAgent。
map是nginx里面的指令,主要的作为是建立映射关系,必须要写到 server{ }区域以外。
不用考虑映射是啥意思,如果你想深入了解,看一下nginx官方手册。
map $http_user_agent $ua_device {
default 'desktop';
~*Baiduspider|Yisouspider|Googlebot|spider|Spider|360Spider|bingbot|Sosospider/i 'bot';
~*(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge\ |maemo|midp|mobile.+firefox|netfront|opera\ m(ob|in)i|palm(\ os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows\ ce|xda|xiino/i 'mobile';
~*android|ipad|playbook|silk/i 'tablet';
}
下面这一段要注意,一个server中只能有一段 location / { },我们将内容进行合并调整,调整为:
location / {
#try_files $uri $uri/ /index.php?$query_string;
try_files $dst $dst2 $dst3;
}
下面这一段是设置nginx里面的变量:
set $dst $uri;
set $dst2 $uri/;
set $dst3 /index.php?$query_string;
下面这一段是说明,如果是正常浏览器走 location /{},如果是爬虫则执行反向代理:
if ($ua_device = 'bot') {
set $dst2 "";
set $dst3 @proxypass;
}
下面是反向代理的配置,proxy_pass后面的服务器地址一定要填为你未来的serveless的URL:
location @proxypass {
proxy_pass http://service-kenft7b9-1308719024.bj.apigw.tencentcs.com;
proxy_connect_timeout 10;
proxy_send_timeout 15;
proxy_read_timeout 20;
proxy_buffer_size 1M;
proxy_buffers 8 1M;
proxy_busy_buffers_size 1M;
proxy_temp_file_write_size 1M;
}
【七】. 开通servless
实验中
【八】. 触发机制和应用模板的选择(已实验成功)
需要使用serverless 创建的是Prerender 服务。
我们先说一下,什么是Prerender?
使用Prerender做网站预渲染,可以将网站页面渲染之后再返回给网络爬虫,间接完成网页的解析。Prerender相较于其他的解决方案,配置相对要简单一些,不用修改项目源码,代码零侵入,是一个不错的解决方案。
官方还没有直接提供Prerender的 serverless模板。
Prerender 有PHP的、还有node.js,感觉未来实现会在node.js中实现。
我的Prerender在自己服务器上实验通了。还未使用官方的 serverless(实验中)。
【九】. Prerender 实现步骤
服务器:Linux
需要提前安装:Chrome
9.1 安装chrome
在命令行下安装chrome 使用yum 或者 apt无法安装,因为有一个墙。
建议 rpm安装或者dpkg安装
chrome启动有一些依赖。
由于,建议提前使用yum或者apt将依赖安装好,需要安装的依赖如下:
libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 libnss3
9.2 启动chrome测试
如果启动正常,没报错,说明安装成功
google-chrome --headless --no-sandbox --disable-gpu --remote-debugging-port=9222 --hide-scrollbars
9.3 安装prerender
export PRERENDER_SERVICE_URL=http://localhost:3000
$ git clone https://github.com/prerender/prerender.git
$ cd prerender
$ npm install
$ node server.js
node server.js 这一步会报错。
9.4 修改 server.js
// 修改var server = prerender();
// 改为下面一段代码
var server = prerender({
chromeFlags: ['--no-sandbox', '--headless', '--disable-gpu', '--remote-debugging-port=9222', '--hide-scrollbars']
});
再次启动
9.5 结果实验
curl http://localhost:3000/render?url=https://www.jindachang.com/

9.6 配置服务
- 将上面的nginx配置进行修改;
- 将3000端口的防火墙进端口解禁;
- 设置token;
- 使用chrome useragent 头测试访问结果;
- 实验成功;
模拟 BaiduSpider 的UserAgent方法:

【十】 写在最后
官方的serverless 的应用模板我猜还有准备中。
对docker还挺熟悉,对于serverless接触使用还不太熟悉。 serverless的腾讯云版本我也在实验中。
未来官方的,实现方式应该有两种:
- dzq 的命令行,与本地的api打通,进行dzq的ssr 内容转发到serverless上来,进行反向代理;
- prerender 进行读取后的反向代理。