Puppeteer的基本使用及多目标同时访问

文章目录

      • 一、安装 puppeteer 并更改默认缓存路径
        • 1、更改 Puppeteer 用于安装浏览器的默认缓存目录
        • 2、安装 puppeteer
        • 3、项目结构目录
      • 二、基本使用
        • 1、启动浏览器并访问目标网站
        • 2、生成截图
        • 3、生成 PDF 文件
        • 4、获取目标网站 html 结构并解析
        • 5、拦截请求
        • 6、执行 JavaScript
        • 7、同时访问多个目标
        • 8、补充说明图片获取后传递至前端展示
      • 三、效果展示
      • 四、参考资料

一、安装 puppeteer 并更改默认缓存路径

1、更改 Puppeteer 用于安装浏览器的默认缓存目录

在项目文件夹根目录中创建 .puppeteerrc.cjs 文件,文件内容如下:

const {join} = require('path');/*** @type {import("puppeteer").Configuration}*/module.exports = {// Changes the cache location for Puppeteer.cacheDirectory: join(__dirname, '.cache', 'puppeteer'),
};

注:安装 Puppeteer 时,它会自动下载最新版本的用于测试的 Chrome,该方法适用于不希望将安装的浏览器(Chrome)安装在默认路径下。浏览器默认下载到 $HOME/.cache/puppeteer 文件夹(从 Puppeteer v19.0.0 开始)。根据自身实际可跳过该步骤。

2、安装 puppeteer

yarn add puppeteer

3、项目结构目录

项目结构目录

更多安装详情及环境配置参见官网:https://pptr.nodejs.cn/

二、基本使用

1、启动浏览器并访问目标网站
const puppeteer = require('puppeteer');// 启动浏览器
const brower = await puppeteer.launch({// 无头模式(默认值 true,设置为false后启动程序将弹出浏览器)headless: false,args: ['--no-sandbox', '--disable-setuid-sandbox', '--enable-accelerated-2d-canvas', '--enable-aggressive-domstorage-flushing'],// 忽略 https 报错ignoreHTTPSErrors: true,timeout: 120000,
});
// 创建标签页
const page = await brower.newPage();
// 设置可视区域的大小
await page.setViewport({ width: 1920, height: 800 })
// 访问目标(此处以访问百度为例)
await page.goto('https://www.baidu.com/', {// waitUntil: 'networkidle0',timeout: 120000
});// 1、生成截图
// 2、生成PDF文件
// 3、其他...// 关闭浏览器
await brower.close();

参数说明:

  • waitUntil:给定事件字符串,直到事件被触发,表示等待成功。
    • load:默认值,等待 load 事件触发。
    • domcontentloaded:等待 domcontentloaded 事件触发。
    • networkidle0:直到目标页面的请求不超过0个,且这一状态持续 500ms
    • networkidle2:直到目标页面的请求不超过2个,且这一状态持续 500ms

参考链接:https://pptr.nodejs.cn/api/puppeteer.puppeteerlifecycleevent

2、生成截图
...
await page.goto(...);let imgBuffer = null;
imgBuffer = await page.screenshot({// 保存路径path: './screenshot/img.png',// 全屏截取fullPage: true,// 截取范围// clip: {x: 0, y: 0, width: 1920, height: 800}
});await brower.close();// 后续可封装成函数
// return imgBuffer;

imgBuffer:截图获取成功后,生成 buffer 数据,便于后续将该图片传递至前端展示。
关于 screenshot 方法的更多参数见:https://pptr.nodejs.cn/api/puppeteer.screenshotoptions/

3、生成 PDF 文件
...
await page.goto(...);await page.pdf({path: `./public/pdf/article.pdf`,// 隐藏页眉和页脚displayHeaderFooter: true,// 页面范围(全部)pageRanges: '',// 格式format: 'A3',// scale: 1.2,// 生成带标签的(可访问的)PDF。// tagged: false,// 背景printBackground: true,margin: { top: '15px' }// outline: true,
})await brower.close();

更多详情参见:https://pptr.nodejs.cn/api/puppeteer.pdfoptions

4、获取目标网站 html 结构并解析

此处解析使用 cheerio,安装 cheerio

yarn add cheerio

获取 html 结构:

...
await page.goto(...);// 获取页面 html 结构
const html = await page.content();
// 有点类似于 JQuery 
const $ = cheerio.load(html);
// 获取目标元素中的属性
const link = $('#xxx .xxx').find('a').attr('href');
// 获取文本内容
const title = $('#xxx .xxx').find('a span').text();await brower.close();
5、拦截请求
// 创建标签页
let page = await brower.newPage();
// 启用请求拦截
await page.setRequestInterception(true);// 设置请求处理函数
page.on('request', (request) => {// 只允许加载HTML、CSS、JS文件,其他资源(如图片)则阻止加载,提高加载速度if (request.resourceType() === 'image' || request.url().endsWith('.mp4')) {// 终止请求request.abort();} else {request.continue();}
});await page.goto(...);
6、执行 JavaScript
...
await page.goto(...);await page.evaluate(async () => {// 获取目标元素const element = document.querySelector('#xxx');// 隐藏目标元素element ? element.style.display = 'none' : '';
})
7、同时访问多个目标
// 目标网站信息,可以把过滤规则写在里面
const targetUrl = {"url1": { "url": "http://xxx.com","filter": async (html) => {const $ = cheerio.load(html);// 获取文本内容const title = $('#xxx .xxx').find('a span').text();return title;}},"url2": { "url": "xxx",... },
}// 启动浏览器 ... 
const brower = await puppeteer.launch({...})// 针对不同网站获取信息
const promises = Object.keys(targetUrl).map(async (target) => {let page = target;// 创建标签页page = await brower.newPage();// 访问目标网址await page.goto(targetUrl[target]['url'], {waitUntil: 'domcontentloaded'});// 获取页面 html 结构const html = await page.content();// 针对不同的网站过滤提取不同的信息const titleList = await targetUrl[target]['filter'](html);// 关闭标签页await page.close();// 以对象的键命名return { [target]: titleList }
})// 处理返回的信息,插入数据库
const data = {};
await Promise.all(promises).then((result) => {// 获取集合,此处使用的mongodb数据库,集合名称为 eng_newsconst engNewsTable = mongoDB.collection('eng_news');result.forEach((el, index) => {// 获取键名const target = Object.keys(targetUrl)[index];// 获取键名对应的值data[target] = el[target]})// 插入数据库engNewsTable.insertOne(data);
}).catch((error) => {console.log(error);
});// 关闭浏览器
await brower.close();
8、补充说明图片获取后传递至前端展示

后端使用 express 框架:

router.post('/getTargetImg', async function (req, res, next) {const pdfResult = await getTargetPDF(req.body.url);if (pdfResult) {const imgBuffer = pdfResult.imgBuffer;if (imgBuffer) {// 设置 Content-Type 为 image/pngres.setHeader('Content-Type', 'image/png');res.send(imgBuffer);} else {res.send(null);}} else {res.send(null);}
})

前端使用 vue3 接收:

await getTargetImgAPI({ url: url }).then((response) => {if (response.data) {// 图片获取成功 ...const blob = new Blob([response.data], { type: "image/png" });const url = URL.createObjectURL(blob);} else {// 图片获取失败...}},(error) => {console.log(error);}
);

前端获取到 buffer 数据并处理完成后,生成的 url 可直接放在 img 标签的 :src 中使用。例:<img :src="xx">

三、效果展示

效果展示

四、参考资料

  • https://pptr.nodejs.cn/
  • https://blog.csdn.net/zhai_865327/article/details/104792646
  • https://juejin.cn/post/7047794666191716383
  • https://juejin.cn/post/6923868889306644488
  • https://zhuanlan.zhihu.com/p/76237595

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络工程师必备知识点

网络工程的基础知识 随着信息化建设不断深入&#xff0c;网络工程项目的实施也越发重要。网络工程涵盖多个方面&#xff0c;例如局域网、广域网、互联网、安全系统等。网络工程项目的实施是建立在信息化技术的基础上的企业信息化建设过程。在网络工程项目实施的过程中&#xf…

OFD(Open Fixed-layout Document)

OFD(Open Fixed-layout Document) &#xff0c;是由工业和信息化部软件司牵头中国电子技术标准化研究院成立的版式编写组制定的版式文档国家标准&#xff0c;属于中国的一种自主格式&#xff0c;要打破政府部门和党委机关电子公文格式不统一&#xff0c;以方便地进行电子文档的…

资源管理器CPU占用太高

最近资源管理器经常飙到80%-100%&#xff0c;所以电脑很卡。比如下面的新打开一个文件目录就这样 工具 shexview下载地址 排除 排序 先点Microsoft排序&#xff0c;上面粉色的就是所谓的外部插件 全部禁用 粉色全选->右键->Disable Selected Items &#xff08;看其他…

天锐绿盾 | 办公加密系统,源代码防泄密、源代码透明加密、防止开发部门人员泄露源码

天锐绿盾作为一款专注于数据安全与防泄密的专业解决方案&#xff0c;它确实提供了针对源代码防泄密的功能&#xff0c;帮助企业保护其核心的知识产权。 PC地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是天锐绿盾可能采…

java—异常

异常 什么是异常 异常的体系 编译时异常处理方式 1、选择报错的整个代码块&#xff0c;快捷键crtlaltt键&#xff0c;选择try/catch将代码围起来。 2、编译异常处理方式2 在main方法上抛出异常 自定义异常 例子&#xff1a; 自定义运行时异常 自定义编译时异常 异常…

Misc 流量分析

流量分析简介 网络流量分析是指捕捉网络中流动的数据包&#xff0c;并通过查看包内部数据以及进行相关的协议、流量分析、统计等来发现网络运行过程中出现的问题。 在CTF比赛中&#xff0c;以及各种技能大赛对于流量包的分析取证是一种十分重要的题型。通常这类题目都是会提供…

容器Docker:轻量级虚拟化技术解析

引言 随着云计算和虚拟化技术的飞速发展&#xff0c;容器技术以其轻量级、高效、可移植的特性&#xff0c;逐渐成为了软件开发和部署的新宠。在众多容器技术中&#xff0c;Docker以其简单易用、功能强大的特点&#xff0c;赢得了广泛的关注和应用。本文将全面介绍Docker的基本概…

软件系统测试方案书(测试计划-Word原件)

2 引言 2.1 编写目的 2.3 测试人员 2.4 项目背景 2.5 测试目标 2.6 简写和缩略词 2.7 参考资料 2.8 测试提交文档 2.9 测试进度 3 测试环境 3.1 软硬件环境 4 测试工具 5 测试策略 5.1 测试阶段划分及内容 5.1.1 集成测试 5.1.2 系统测试 5.1.2.1 功能测试 5.…

第六代移动通信介绍、无线网络类型、白皮书

关于6G 即第六代移动通信的介绍&#xff0c; 图解通信原理与案例分析-30&#xff1a;6G-天地互联、陆海空一体、全空间覆盖的超宽带移动通信系统_6g原理-CSDN博客文章浏览阅读1.7w次&#xff0c;点赞34次&#xff0c;收藏165次。6G 即第六代移动通信&#xff0c;6G 将在5G 的基…

Xshell生成ssh密钥及使用

目录 1. 概述2. 环境3. 步骤3.1 生成密钥3.2 部署密钥3.3 使用密钥 1. 概述 使用Xshell软件生成ssh秘钥&#xff0c;正常连接服务器。 2. 环境 Xshell 6 3. 步骤 3.1 生成密钥 1. 打开Xshell --> 工具 --> 新建用户密钥生成向导 2. 选择密钥类型&#xff0c;建议…

Python-100-Days: Day11 Files and Exception

1.读取csv文件 读取文本文件时&#xff0c;需要在使用open函数时指定好带路径的文件名&#xff08;可以使用相对路径或绝对路径&#xff09;并将文件模式设置为r&#xff08;如果不指定&#xff0c;默认值也是r&#xff09;&#xff0c;然后通过encoding参数指定编码&#xf…

计算图:深度学习中的链式求导与反向传播引擎

在深度学习的世界中&#xff0c;计算图扮演着至关重要的角色。它不仅是数学计算的图形化表示&#xff0c;更是链式求导与反向传播算法的核心。本文将深入探讨计算图的基本概念、与链式求导的紧密关系及其在反向传播中的应用&#xff0c;旨在为读者提供一个全面而深入的理解。 计…