puppeteer-不需重构,无痛加强vue单页面应用的SEO,提升百度收录排名

news2025/1/21 12:00:43

背景

最近产品觉得我们网站在百度收录上排名太靠后了,又不肯花钱,就让我们想办法提升网站的SEO。由于项目是用vue3写的,并且已经迭代多个版本了,用nuxt实在不适宜,当然俺的开发水平也不够,周期也会拉得很长,此时!想偷懒的我看到了puppeteer,可以一试!

原理

实际上就是当普通用户访问我们的网站时,访问的就是单页面应用,但是当爬虫访问我们的网站时就会被转发到puppeteer服务上,传送给爬虫的页面是比较完整的的HTML页面,有利于提升单页面应用的SEO

上流程!

首先将我们开发完的vue项目打包到本地;
将打包后的dist文件夹放在本地nginx的html文件夹下;
正常配置nginx.conf文件;
新建文件夹,执行npm init生成package.json文件;
安装express\puppeteer;
写入流程;
启动服务;
在nginx.config的 location /下配置判定是否为爬虫,是则转发至puppeteer服务。

代码

假设puppeteer服务项目名为server,则文件目录为下:
在这里插入图片描述

service.js

const express = require('./node_modules/express');
var app = express();
var spider = require("./spider.js")
app.get('*', async (req, res) => {
	 let url = "你所部署到nginx的完整访问路径,例如http://127.0.0.1:80" + req.originalUrl;
	console.log('请求的完整URL:' + url);
	let content = await spider(url).catch((error) => {
		console.log(error);
		res.send('获取html内容失败');
		return;
	});
	res.send(content);
});
app.listen(3000, () => {
	console.log('服务已启动!');
});

puppeteer-pool.js

const puppeteer = require('./node_modules/puppeteer');
const MAX_WSE = 2; //启动几个浏览器 
let WSE_LIST = []; //存储browserWSEndpoint列表
//负载均衡
(async () => {
	for (var i = 0; i < MAX_WSE; i++) {
		const browser = await puppeteer.launch({
            //无头模式
			headless: 'new',
            //参数
			args: [
				'--disable-gpu',
				'--disable-dev-shm-usage',
				'--disable-setuid-sandbox',
				'--no-first-run',
				'--no-sandbox',
				'--no-zygote',
				'--single-process'
			],
			//一般不需要配置这条,除非启动一直报错找不到谷歌浏览器
			executablePath:'chrome.exe在你本机上的路径,例如C:/Program Files/Google/chrome.exe'
		});
		let browserWSEndpoint = await browser.wsEndpoint();
		WSE_LIST.push(browserWSEndpoint);
	}
})();

module.exports = WSE_LIST

spider.js

const puppeteer = require('./node_modules/puppeteer');//由于目录不一致,所以使用的是绝对路径
const WSE_LIST = require('./puppeteer-pool.js') //这里注意文件的路径和文件名
const spider = async (url) => {
	let tmp = Math.floor(Math.random() * WSE_LIST.length);
	//随机获取浏览器
	let browserWSEndpoint = WSE_LIST[tmp];
	//连接
	const browser = await puppeteer.connect({
		browserWSEndpoint
	});
	//打开一个标签页
	var page = await browser.newPage();
	//打开网页
	await page.goto(url, {
		timeout: 0, //连接超时时间,单位ms
		waitUntil: 'networkidle0' //网络空闲说明已加载完毕
	})
	//获取渲染好的页面源码。不建议使用await page.content();获取页面,因为在我测试中发现,页面还没有完全加载。就获取到了。页面源码不完整。也就是动态路由没有加载。vue路由也配置了history模式
	let html = await page.evaluate(() => {
		return document.getElementsByTagName('html')[0].outerHTML;
	});
	await page.close();
	return html;
}

执行node service,即可在终端看到服务已启动字样

nginx部分配置

server {
listen 80;
server_name 127.0.0.1;

location /api {
	你的后端转发配置。。。。。
}
location / {
	set $prerender 0;
	set $prerender_url 'http://120.0.0.1:3000'
    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 ~* "Sogou Pic Spider|Baiduspider|Baiduspider-render|YisouSpider|Sogou web spider|Bytespider|360Spider|Googlebot|YodaoBot") {
       set $prerender 1;
    }
    if($prerender = 1){
    proxy_pass $prerender_url;
    }
    root html/dist;
    index  index.html /index.htm;
    try_files $uri $uri/ /index.html;
}

}

测试

1.打开postman,将默认的User-Agent取消勾选,新建User-Agent,值为Bingbot,向你所部署到nginx的完整访问路径发送请求,server项目终端有输出即成功。
2.在谷歌浏览器打开开发者工具,点击右上方三个点,选择更多工具,选择网络情况,取消user-agent默认勾选,设置值为Bingbot,刷新所在页面,server项目终端有输出即成功。
在这里插入图片描述

可能会遇到的报错

  1. 新建文件夹无法安装express\puppeteer?
    在此文件夹内执行npm init,生成package.json文件即可安装包
  2. puppeteer安装一直失败?
    执行npm install puppeteer --ignore-scripts
  3. 其他问题请在评论区留言

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/527369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

字典翻译EasyTrans简单使用分享

前言 最近太忙了&#xff0c;一直按在项目上摩擦&#xff0c;都没有时间写分享了。今天终于市把所有负责的模块都写完了&#xff0c;本次迭代引入了字典翻译&#xff0c;借这个机会顺便分享下。 一、什么是字典翻译 所谓的字典翻译其实简单理解就是一些不常更新的有键值对属性的…

什么是 Java 的内存模型?如何保证安全

Java 的内存模型定义了多线程程序中&#xff0c;不同线程之间如何共享和访问共享变量的规则。Java 内存模型的设计旨在保证线程安全和可见性&#xff0c;同时保证程序的性能。本文将介绍 Java 内存模型的基本概念、线程安全的实现方法以及如何使用 synchronized 和 volatile 关…

yolo 训练

这里写目录标题 分配训练集&Validation数量数据集读取读取全部文件夹替换路径 loss weightNMSBBox_IOUEIou Optimizer 分配训练集&Validation数量 validation_size training_size * validation_ratio / (1 - validation_ratio)training_size 219 validation_ratio …

基于Java+SpringMVC+vue+element实现前后端分离校园失物招领系统详细设计

基于JavaSpringMVCvueelement实现前后端分离校园失物招领系统详细设计 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获…

单轴丝杠平台实现搬运功能

1. 功能说明 本文示例将实现R279样机单轴丝杠平台搬运的功能。 该机构是由一个丝杠模组和一个 舵机关节模组 组合而成&#xff0c;关节模组上安装了一个电磁铁。 注意限位开关【①触碰传感器、②近红外传感器】的安装位置&#xff1a; 2. 丝杠传动机构原理 丝杠传动机构是一个将…

基于海思Hi3531 ARM+K7 FPGA高性能综合视频图像处理平台

板卡概述 XM703是自主研制的一款基于PCIE总线架构的高性能综合视频图像处理平台&#xff0c;该平台采用Xilinx的高性能Kintex UltraScale系列FPGA加上华为海思的高性能视频处理器来实现。 华为海思的HI3531DV200是一款集成了ARM A53四核处理器性能强大的神经网络引擎&#xff…

最新域名查询-中文域名注册到期查询软件

最新域名查询 最新域名查询指的是查询最新注册的域名或者快速确认某个域名是否被注册等相关信息的工具。以下是一些常用的最新域名查询工具&#xff1a; 域名Whois查询工具&#xff1a;Whois查询是一种查询域名注册信息的方式&#xff0c;可以查询已经注册的域名的所有信息&am…

http/https

http 基本概念 超文本传输协议&#xff0c;是互联网应用最广泛的协议之一&#xff0c;用于从 WWW 服务器传输超文本到本地浏览器的传输协议&#xff0c;它可以使浏览器更加高效&#xff0c;使网络传输减少。 https 基本概念 HTTPS是HTTP over SSL的简称&#xff0c;即工作…

LTI连续线性时不变系统能控性证明(格拉姆判据、秩判据)

一、能控性和能达性 1.1、能控性和能达性的定义 能控性&#xff1a;如果在一个有限的时间间隔内&#xff0c;可以用幅值没有限制的输入作用&#xff0c;使偏离系统平衡状态的某个初始状态回复到平衡状态&#xff0c;就称这个初始状态是能控的。 能达性&#xff1a;系统在外控…

【网红营销】海外网红营销怎么做?及注意事项?

随着互联网的发展和全球化的进程&#xff0c;海外网红营销逐渐成为企业推广产品和服务的重要途径。海外网红可以借助其社交媒体平台上的影响力&#xff0c;帮助企业扩大品牌知名度、提升销售业绩。然而&#xff0c;海外网红营销存在着一定的挑战和风险&#xff0c;企业需要制定…

探索将大语言模型用作推荐系统

编者按&#xff1a;目前大语言模型主要问答、对话等场景&#xff0c;进行被动回答。是否可以将大模型应用于推荐系统&#xff0c;进行主动推送呢&#xff1f; 这篇文章回顾了可以将大模型作为推荐系统的理论基础&#xff0c;并重点描述了基于英文和阿拉伯语的购物数据集微调T5-…

菜鸟健身-新手使用哑铃锻炼手臂的动作与注意事项

目录 一、前言 二、哑铃锻炼手臂的好处 三、哑铃锻炼手臂的注意事项 四、哑铃锻炼手臂的基本动作 1. 哑铃弯举 2. 哑铃推举 3. 哑铃飞鸟 五、哑铃锻炼手臂的进阶动作 1. 哑铃侧平举 2. 哑铃俯身划船 六、哑铃锻炼手臂的训练计划 七、总结 一、前言 哑铃是一种非常…

2023年5月天津/南京/成都/深圳CDGA/CDGP数据治理认证报名

6月18日DAMA-CDGA/CDGP数据治理认证考试开放报名中&#xff01; 考试开放地区&#xff1a;北京、上海、广州、深圳、长沙、呼和浩特、杭州、南京、济南、成都、西安。其他地区凑人数中… DAMA-CDGA/CDGP数据治理认证班进行中&#xff0c;报名从速&#xff01; DAMA认证为数据管…

MySQL 日志管理与恢复

MySQL日志管理 MySQL的默认日志保存位置为/usr/local/mysql/data 日志开启方式有两种&#xff1a;通过配置文件或者是通过命令 通过命令修改开启的日志是临时的&#xff0c;关闭或重启服务后就会关闭 MySQL日志管理 日志的分类 1.错误日志 用来记录当MySQL启动、停止或运行时…

畅购商城4.0

畅购商城4.0 1.走进电商 1.1电商行业分析 近年来&#xff0c;世界经济正向数字化转型&#xff0c;大力发展数字经济成为全球共识。党的十九大报告明确提出要建设“数字中国”“网络强国”&#xff0c;我国数字经济发展进入新阶段&#xff0c;市场规模位居全球第二&#xff0c;数…

DC-DC直流隔离升压电源模块高压稳压可调输出12v24v48v转60V80V110V150V200V220V250V300V400V500V

特点 效率高达 80%以上1*2英寸标准封装单电压输出价格低稳压输出工作温度: -40℃~85℃阻燃封装&#xff0c;满足UL94-V0 要求温度特性好可直接焊在PCB 上 应用 HRB W2~40W 系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为&#xff1a;4.5~9V、9~18V、及18~36V、…

我们拆了一款将ChatGPT“落地”的AI语音交互机器人,八核A7全志R58主控

视频版本拆机&#xff1a;【60块钱&#xff0c;垃圾佬的第一台机器人&#xff0c;国产8核CPU全志R58】 https://www.bilibili.com/video/BV1Qk4y177ja/?share_sourcecopy_web&vd_source6ec797f0de1d275e996fb7de54dea06b 公子小白是一对由狗尾草智能科技推出的人工智能机…

Pytorch代码——持续更新

1 连续两个argsort 返回张量中每个元素对应的排名 torch.argsort(torch.argsort(pred, dim1, descendingTrue),dim1,descendingFalse) 例子 使用一个argsort后得到的是张量中按列降序排序后的索引&#xff0c; 再使用一个argsort后是张量中每一个元素的排名。 例如第2行中…

港联证券|股票分批技巧是什么?分批买进的手续费如何计算?

股票分批是股市中常用操作&#xff0c;根基股票的波动不同&#xff0c;将资金分批投资在不同股价还在时间上。那么股票分批技巧是什么&#xff1f;分批买进的手续费如何计算&#xff1f;下面就由港联证券为大家分析&#xff1a; 股票分批技巧是什么&#xff1f; 1、补仓股票选…

国药集团蒸汽表内网图像识别案例

一、项目需求 项目背景&#xff1a;国药集团MES系统硬件仪表数据采集项目 为了实现现场蒸汽表计数据的采集和存储&#xff0c;我们提供了本地内网图像离线识别方案&#xff0c;它可以在不接线的情况下实现对现场蒸汽表计数据的采集&#xff0c;并通过485接口将数据传输到客户内…