使用谷歌headless(puppeteer)解决SEO问题

使用headless解决SEO问题,原理是在服务器使用浏览器渲染好页面后返回给有益的蜘蛛爬虫,代码也没有服务端客户端的区别。渲染过程可能会比较消耗服务器资源,建议单独使用一台服务器搭建,我没有做压力测试,如果有人做了也希望分享我一下。

1、安装依赖

# 安装 puppeteer
cnpm install puppeteer

# puppeteer依赖,如果已安装谷歌浏览器可略过
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
yum install xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi xorg-x11-utils xorg-x11-fonts-cyrillic xorg-x11-fonts-Type1 xorg-x11-fonts-misc
yum update nss -y

2、server.js

const http = require('http');
const puppeteer = require('puppeteer');

let conf = {
   // 是否使用https访问API
   useHttps: false,
   // 是否检测IP,防止伪造UA
   checkIp: false,
   // 可以访问的蜘蛛IP地址
   allowIpList: [],

   launchOption: {
      args: ['--no-sandbox', '--disable-setuid-sandbox']
   }
};

/**
 * 获取IP地址
 *
 * @param req
 * @returns {*|string}
 */
function getIp (req) {
   return req.headers['x-real-ip'] ||
      req.headers['x-forwarded-for'] ||
      req.connection.remoteAddress ||
      req.socket.remoteAddress ||
      req.connection.socket.remoteAddress || '';
}

/**
 * 检测ip是否合法
 *
 * @param ip
 * @returns {boolean}
 */
function checkIP(ip) {
   //也可以使用别的规则校验
   return conf.checkIp ? conf.allowIpList.includes(ip) : true;
}


// 载入浏览器
puppeteer.launch(conf.launchOption).then(async browser => {
    const server = http.createServer();
    server.on('request', function(request, response){
        let url = (conf.useHttps ? 'https://' : 'http://') + request.headers.host + request.url;
        let ip = getIp(request);

        // 检测ip地址
        if (checkIP(ip)) {
         browser.newPage().then(async page => {

            // 访问url
            await page.goto(url);
            let content= await page.content();

            // 关闭页面,返回数据
            await page.close();
            response.end(content);
         })
      } else {
         response.statusCode = 404;
         response.end("404 NOT Found");
      }
    })

    server.on('close', function(){
        browser.close();
    })

    server.listen(3000, '127.0.0.1', function () {
        console.log('puppeteer server listening on port 3000!');
    });
});

这里我选择先打开浏览器再启动服务;还有一种方式时先启动服务,接受到请求再打开浏览器处理请求,但我觉得这样每个请求都要打开关闭一次浏览器,有点浪费资源。不知道我这个想法是否正确,欢迎指正。

3、nginx配置

location / {
    # 蜘蛛爬虫处理
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    if ($http_user_agent ~* "spider|bot") {
        proxy_pass http://127.0.0.1:3000;
    }

    try_files $uri $uri/ @router;
}
location @router {
    rewrite ^(.*)$ /index.html last;
}

4、hosts配置

配置host,从内网访问API

127.0.0.1  api.domain.com

5、其他

puppeteer 并不是最优解决方案,甚至是很差的解决方案。需要最新的 vue 3 的服务端渲染方案,可以看我的另一篇博文 Vue 3 + Vite + SSR

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值