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.mzph.cn/diannao/7452.shtml

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

相关文章

大模型最新消息

最新消息如下&#xff1a; 大语言模型服务的多样化&#xff1a;互联网上出现了许多免费的大语言模型服务&#xff0c;如OpenAI的ChatGPT、Google的Gemini、Anthropic的Claude、Meta的Llama等。这些服务的推出使得大语言模型的应用更加广泛和便捷。软银和苹果的AI新动向&#x…

IEEE(TOP),CCF推荐,5本毕业神刊,最快7天录用!指标优秀

本期盘点计算机领域超顺快刊&#xff0c;涵盖IEEE1区TOP、CCF推荐SCIE&#xff0c;期刊指标优秀&#xff0c;审稿周期短&#xff0c;质量稳定&#xff0c;有意向作者请看下文&#xff1a; IEEE旗下1区&#xff08;TOP&#xff09; 1 期刊简介 ✅出版社&#xff1a;IEEE ✅影…

《安富莱嵌入式周报》第336期:开源计算器,交流欧姆表,高性能开源BLDC控制器,Matlab2024a,操作系统漏洞排名,微软开源MS-DOS V4.0

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 本周更新一期视频教程&#xff1a; BSP视频教程第30期&#xff1a;UDS ISO14229统一诊断服务CAN总线专题&#xff0c;常…

Golang | Leetcode Golang题解之第68题文本左右对齐

题目&#xff1a; 题解&#xff1a; // blank 返回长度为 n 的由空格组成的字符串 func blank(n int) string {return strings.Repeat(" ", n) }func fullJustify(words []string, maxWidth int) (ans []string) {right, n : 0, len(words)for {left : right // 当前…

简述 BIO 、NIO 模型

BIO : 同步阻塞I/O&#xff08;Block IO&#xff09; 服务器实现模式为每一个连接一个线程&#xff0c;即客户端有连接请求时服务器就需要启动一个线程进行处理&#xff0c;如果这个连接不做任何事情会造成不必要的线程开销&#xff0c;此处可以通过线程池机制进行优化。 impo…

工业光源环形系列一高均匀条形光源特点

产品特点 ◆可以根据检测需求随意调整照射角度&#xff1a; ◆可以根据检测需求选择光源颜色&#xff1a; ◆多个条形光源可以自由组合&#xff1a; ◆使用贴片灯珠&#xff0c;均匀性更好。

VMP 简单源码分析(.net)

虚拟机 获取CPU的型号 实现了一个指令集解释器&#xff0c;每个操作码对应一个特定的处理函数&#xff0c;用于执行相应的指令操作。在执行字节码时&#xff0c;解释器会根据操作码查找并调用相应的处理函数来执行指令。 截获异常 先由虚拟机处理 处理不了再抛出异常 priva…

第五节 内联框架强化练习

建立左右常用框架结构说明 1、添加动态面板如下&#xff1a; 2、添加树元件 3、添加树节点&#xff08;右键->添加子节点 右键->点添加节点&#xff09; 4、添加交互页面 5、添加单击交互跳转事件到内联框架中(注意当前内联框架与当前面板要处在同级目录) 6、添加交互跳…

外贸尾货全新变现玩法,冷门暴利项目,单月轻松3W+

有些朋友可能不太了解什么是外贸尾货。实际上&#xff0c;当我们国内的厂家进行外贸出口业务时&#xff0c;生产的商品并不总是能够完全销售到国外。为了避免出现瑕疵品&#xff0c;厂家通常会生产超出订单数量的产品&#xff0c;以确保产品质量和满足出口需求。例如&#xff0…

uniapp实现下拉刷新效果-uniapp原生接口

onPullDownRefresh | uni-app官网 1、需要在 pages.json 里&#xff0c;找到的当前页面的pages节点&#xff0c;并在 style 选项中开启 enablePullDownRefresh 2、生命周期中添加onPullDownRefresh&#xff0c;下拉时获取数据 3、处理完数据后&#xff0c;停止下拉效果stopPul…

web前端学习笔记7-iconfont使用

7. iconfont的使用流程 字体图标使用较多的是阿里巴巴iconfont图标库,它是阿里巴巴体验团队推出的图标库和图标管理平台,提供了大量免费和可定制的矢量图标,以满足网页设计、平面设计、UI设计、应用程序开发和其他创意项目的需求。 官方网站:https://www.iconfont.cn/ 使用…

MYSQL RR隔离级别下无索引更新是否表锁?

最近在MYSQL菜鸟群有群友提问,说他看了某个公众号里面文章说 "MYSQL RR隔离级别下无索引更新会导致表锁! " 他表示疑惑,而且不仅是他,还有很多个她在不同的群里同样表示疑惑! 下面是群友的截图 是啊 MYSQL 以及进化到了8.3.0版本了,普遍都使用5.7和8.0版本.而且还…

Navicat for MySQL Mac:数据库管理与开发的理想工具

Navicat for MySQL Mac是一款功能强大的数据库管理与开发工具&#xff0c;专为Mac用户设计&#xff0c;旨在提供高效、便捷的数据库操作体验。 它支持创建、管理和维护MySQL和MariaDB数据库&#xff0c;通过直观的图形界面&#xff0c;用户可以轻松进行数据库连接、查询、编辑和…

提升开发者效率的必备工具

目录 前言1. Git2. Docker3. Postman4. Apipost5. PyCharm6. IntelliJ IDEA7. Everything8. Sublime Text9. 截图工具&#xff08;Snipaste&#xff09;10. Markdown 在线编辑器11. Xmind 思维导图12. 在线流程图制作工具&#xff08;如 ProcessOn&#xff09;结语 前言 在快节…

MambaMOS:基于激光雷达的三维运动物体分割与运动感知状态空间模型

MambaMOS:基于激光雷达的三维运动物体分割与运动感知状态空间模型 摘要INTRODUCTIONRelated WorkMethod MambaMOS: LiDAR-based 3D Moving Object Segmentation with Motion-aware State Space Model 摘要 激光雷达基于的运动目标分割&#xff08;MOS&#xff09;旨在利用之前…

106短信群发平台:拓客拉新、商品促销,效果究竟如何?一试便知!

106短信群发平台在拓客拉新和商品促销方面的效果是非常显著的。 首先&#xff0c;从发送速度和到达率来看&#xff0c;106短信平台表现优秀。无论是节假日还是平日&#xff0c;其发送速度都能保持在一个较快的水平&#xff0c;这对于需要及时到达的营销信息尤为重要。同时&…

STM32学习笔记--疑问篇

STM32学习笔记–疑问篇 GPIO是什么的缩写通用寄存器的缩写和全程 3.、这是什么的缩写 不同输出模式之间的差异 PB是GPIOB的缩写&#xff1f; 怎样知道端口应该设置成输入模式还是设置成输出模式

【强训笔记】day11

NO.1 思路&#xff1a;枚举&#xff0c;设一号大礼包的数量为x&#xff0c;二号大礼包的数量为y&#xff0c;用循环枚举一号大礼包的个数得到二号大礼包的数量&#xff0c;使得某一时刻axby的值最大。 代码实现&#xff1a; #include<iostream>using namespace std;lo…

Node.js里面 Path 模块的介绍和使用

Node.js path 模块提供了一些用于处理文件路径的小工具&#xff0c;我们可以通过以下方式引入该模块&#xff1a; var path require("path") 方法描述 序号方法 & 描述1path.normalize(p) 规范化路径&#xff0c;注意.. 和 .。2path.join([path1][, path2][,…

Web开发小知识点(一)

1.input不支持自动换行解决办法 input不支持换行&#xff1b; textarea&#xff1a;支持换行&#xff1b; 设置提示文案的css 用&#xff1a;&#xff1a;placeHolder 2.textarea禁止拖拽、去掉右下角三角&#xff08;css下&#xff09; textarea{resize:none; } 3.用户对访…