2linux 服务器上使用Node+Puppeteer搭建SSR环境的详细步骤
作者:admin | 分类:cuini | 浏览:105 | 日期:2024年11月30日SSR即Server Side Rendering,服务端渲染,是指在服务器端将动态页面生成HTML文件,再将生成的HTML文件返回给客户端展示。与之相对的是
(CSR,Client Side Rendering),客户端渲染是在浏览器端通过运行JavaScript等代码后生成HTML并渲染到页面上。
SSR的目的就是将页面的渲染放到服务器端完成,将渲染后的 HTML 代码返回给浏览器,加快页面的首屏加载速度。同时,由于服务器端渲染
的页面具有完整的 HTML 结构,可以被搜索引擎爬虫正常识别,提高了网站的 SEO。
SEO不友好:由于搜索引擎抓取不到由JavaScript生成的页面,因此CSR的页面对搜索引擎不友好,会影响网站的搜索引擎排名。
首屏加载慢:由于CSR需要等到JavaScript文件下载、解析、执行完毕后才能生成HTML并渲染到页面上,因此首屏加载速度慢,影响用户体验。
非常规浏览器不友好:有些非常规浏览器可能不支持JavaScript,这时就会导致页面无法正常显示。
因此,SSR能够提高页面加载速度、SEO友好,并且能够兼容非常规浏览器,具有重要意义。
本文就是用SSR环境,来解决搜索引擎抓取不到前面VUE渲染的HTML问题。
2、通过Node.js开启一个服务器,将爬虫抓取的网页返回给服务器
3、服务器使用Puppeteer在无头模式下模拟浏览器行为,渲染网页并生成HTML字符串
这种方式实现了对动态网页的渲染和静态化,使得爬虫可以抓取渲染后的网页,同时也提高了网站的性能和访问速度。
wget https://nodejs.org/dist/v16.19.0/node-v16.19.0-linux-x64.tar.gz
tar -xzvf node-v16.19.0-linux-x64.tar.gz
ln -s /opt/node-v16.19.0-linux-x64/bin/node /usr/local/bin/
ln -s /opt/node-v16.19.0-linux-x64/bin/npm /usr/local/bin/
2、安装 puppeteer,express 与 html-minifier
yum install pango.x86_64 libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 libXext.x86_64 libXi.x86_64 libXtst.x86_64 cups-libs.x86_64 libXScrnSaver.x86_64 libXrandr.x86_64 GConf2.x86_64 alsa-lib.x86_64 atk.x86_64 gtk3.x86_64 -y
vi /etc/yum.repos.d/google-chrome.repo
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
yum -y install google-chrome-stable --nogpgcheck
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch({
const page = await browser.newPage();
await page.goto('https://www.baidu.com/');
await page.screenshot({path: 'baidu.png'});
2、创建优化puppeteer性能角本,默认不加载一些多余的功能,提高访问效率。
const puppeteer = require('puppeteer')
let WSE_LIST = []; //存储browserWSEndpoint列表
for (var i = 0; i < MAX_WSE; i++) {
const browser = await puppeteer.launch({
'--blink-settings=imagesEnabled=false',
browserWSEndpoint = await browser.wsEndpoint();
WSE_LIST.push(browserWSEndpoint);
const puppeteer = require('puppeteer')
const WSE_LIST = require('./puppeteer-pool.js
const spider = async (url, isMobile) => {
let tmp = Math.floor(Math.random() * WSE_LIST.length);
let browserWSEndpoint = WSE_LIST[tmp];
const browser = await puppeteer.connect({
var page = await browser.newPage();
await page.setViewport({ width: 428, height: 926 });
page.setUserAgent('Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.5481.100 Mobile Safari/537.36');
//await page.waitForTimeout(1000);
var html = await page.content();
var express = require('express');
var spider = require("./spider.js")
var minify = require('html-minifier').minify;
app.get('*', async (req, res, next) => {
+ '://'+ req.hostname + req.originalUrl;
var mobileRegex = /Mobile|Android|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i;
var userAgent = req.get('User-Agent');
var isMobile = mobileRegex.test(userAgent);
var device = isMobile ? 'Mobile' : 'PC';
console.log(new Date().toLocaleString() + ' : ' + url+' Device: '+device);
(url, isMobile).catch((error) => {
(content,{removeComments: true,collapseWhitespace: true,minifyJS:true, minifyCSS:true});
node /home/wwwroot/nodeSpider/test.js
proxy_set_header Host $host:$proxy_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
if ($http_user_agent ~* "googlebot|bingbot
|facebot|exabot|yandex|Yahoo! Slurp|DuckDuckBot|bytespider|twitterbot|facebookexternalhit|rogerbot|linkedinbot
|embedly|quora link preview|showyoubot|outbrain|pinterest|pinterestbot
|slackbot|vkShare|W3C_Validator|whatsapp") {
proxy_pass http://127.0.0.1:8087;
vi /etc/supervisord.d/nodessr.conf
stdout_logfile_maxbytes = 200MB
stdout_logfile = /home/wwwlogs/nodessr.log
sudo supervisorctl start process_name # 启动进程
sudo supervisorctl stop process_name # 停止进程
sudo supervisorctl restart process_name # 重启进程
sudo supervisorctl status # 查看所有进程状态
sudo supervisorctl status process_name # 查看指定进程状态
sudo supervisorctl reread # 重新读取配置文件
sudo supervisorctl update # 重新加载配置文件中添加的新的进程配置
转:惆怅客


