前端工程师的一大神器——puppeteer

article/2025/6/26 12:01:40

大家好,我是若川。欢迎加我微信 ruochuan12,长期交流学习。今天推荐神器puppeteer,我猜有挺多人不知道。文章不长,看完有空也可以试玩。

我18年也写过一篇puppeteer爬取生成pdf的文章,时间真快。前端使用puppeteer 爬虫生成《React.js 小书》PDF并合并

点击下方卡片关注我、加个星标,或者查看源码等系列文章。学习源码整体架构系列、年度总结、JS基础系列

一、Puppeteer简介

Puppeteer 是一个 Node 库,它提供了一个高级 API 来通过 DevTools 协议控制 Chromium 或 Chrome,利用Puppeteer可以获取页面DOM节点、网络请求和响应、程序化操作页面行为、进行页面的性能监控和优化、获取页面截图和PDF等,利用该神器就可以操作Chrome浏览器玩出各种花样。

二、Puppeteer核心组成结构

Puppeteer的结构也反映了浏览器的结构,其核心结构如下所示:

  1. Browser:这是一个浏览器实例,可以拥有浏览器上下文,可通过 puppeteer.launch 或 puppeteer.connect 创建一个 Browser 对象。

  2. BrowserContext:该实例定义了一个浏览器上下文,可拥有多个页面,创建浏览器实例时默认会创建一个浏览器上下文(不能关闭),此外可以利用 browser.createIncognitoBrowserContext()创建一个匿名的浏览器上下文(不会与其它浏览器上下文共享cookie/cache).

  3. Page:至少包含一个主框架,除了主框架外还有可能存在其它框架,例如iframe。

  4. Frame:页面中的框架,在每个时间点,页面通过page.mainFrame()和frame.childFrames()方法暴露当前框架的细节。对于该框架中至少有一个执行上下文

  5. ExecutionCOntext:表示一个JavaScript的执行上下文。

  6. Worker:具有单个执行上下文,便于与 WebWorkers 交互。

三、基本使用和常用功能

该神器整体使用起来比较简单,下面就开始我们的使用之路。

3.1 启动Browser

核心函数就是异步调用puppeteer.launch()函数,根据相应的配置参数创建一个Browser实例。

const path = require('path');
const puppeteer = require('puppeteer');const chromiumPath = path.join(__dirname, '../', 'chromium/chromium/chrome.exe');async function main() {// 启动chrome浏览器const browser = await puppeteer.launch({// 指定该浏览器的路径executablePath: chromiumPath,// 是否为无头浏览器模式,默认为无头浏览器模式headless: false});
}main();

3.2 访问页面

访问页面首先需要创建一个浏览器上下文,然后基于该上下文创建一个新的page,最后指定要访问的网址。

async function main() {// 启动chrome浏览器// ……// 在一个默认的浏览器上下文中被创建一个新页面const page1 = await browser.newPage();// 空白页访问该指定网址await page1.goto('https://51yangsheng.com');// 创建一个匿名的浏览器上下文const browserContext = await browser.createIncognitoBrowserContext();// 在该上下文中创建一个新页面const page2 = await browserContext.newPage();page2.goto('https://www.baidu.com');
}main();

3.3 设备模拟

经常需要不同类型的机型的浏览结果,此时就可以采用设备模拟实现,下面模拟一个iPhone X的设备的浏览器结果

async function main() {// 启动浏览器// 设备模拟:模拟一个iPhone X// user agentawait page1.setUserAgent('Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1')// 视口(viewport)模拟await page1.setViewport({width: 375,height: 812});// 访问某页面
}main();

3.4 获取DOM节点

获取DOM节点有两种方式,一种方式是直接调用page所带的原生函数,另一种是通过执行js代码获取。

async function main() {// 启动chrome浏览器const browser = await puppeteer.launch({// 指定该浏览器的路径executablePath: chromiumPath,// 是否为无头浏览器模式,默认为无头浏览器模式headless: false});// 在一个默认的浏览器上下文中被创建一个新页面const page1 = await browser.newPage();// 空白页访问该指定网址await page1.goto('https://www.baidu.com');// 等待title节点出现await page1.waitForSelector('title');// 用page自带的方法获取节点const titleDomText1 = await page1.$eval('title', el => el.innerText);console.log(titleDomText1);// 百度一下// 用js获取节点const titleDomText2 = await page1.evaluate(() => {const titleDom = document.querySelector('title');return titleDom.innerText;});console.log(titleDomText2);
}main();

3.5 监听请求和响应

下面就来监听一下百度中某一js脚本的请求和响应,request事件是监听请求,response事件是监听响应。

async function main() {// 启动chrome浏览器const browser = await puppeteer.launch({// 指定该浏览器的路径executablePath: chromiumPath,// 是否为无头浏览器模式,默认为无头浏览器模式headless: false});// 在一个默认的浏览器上下文中被创建一个新页面const page1 = await browser.newPage();page1.on('request', request => {if (request.url() === 'https://s.bdstatic.com/common/openjs/amd/eslx.js') {console.log(request.resourceType());console.log(request.method());console.log(request.headers());}});page1.on('response', response => {if (response.url() === 'https://s.bdstatic.com/common/openjs/amd/eslx.js') {console.log(response.status());console.log(response.headers());}})// 空白页刚问该指定网址await page1.goto('https://www.baidu.com');
}main();

3.6 拦截某一请求

默认情况下request事件只有只读属性,不能够拦截请求,若想拦截该请求则需要通过page.setRequestInterception(value)启动请求拦截器,然后利用request.abort, request.continue 和 request.respond 方法决定该请求的下一步操作。

async function main() {// 启动chrome浏览器const browser = await puppeteer.launch({// 指定该浏览器的路径executablePath: chromiumPath,// 是否为无头浏览器模式,默认为无头浏览器模式headless: false});// 在一个默认的浏览器上下文中被创建一个新页面const page1 = await browser.newPage();// 拦截请求开启await page1.setRequestInterception(true);// true开启,false关闭page1.on('request', request => {if (request.url() === 'https://s.bdstatic.com/common/openjs/amd/eslx.js') {// 终止该请求request.abort();console.log('该请求被终止!!!');}else {// 继续该请求request.continue();}});// 空白页访问该指定网址await page1.goto('https://www.baidu.com');
}main();

3.7 截图

截图是一个很有用的功能,通过截取就可以保存一份快照,方便后期问题的排查。(注:在无头模式下进行截图,否则截的图可能有问题)

async function main() {// 启动浏览器,访问页面的操作// 截屏操作,使用Page.screenshot函数// 截取整个页面:Page.screenshot函数默认截取整个页面,加上fullPage参数就是全屏截取await page1.screenshot({path: '../imgs/fullScreen.png',fullPage: true});// 截取屏幕中一个区域的内容await page1.screenshot({path: '../imgs/partScreen.jpg',type: 'jpeg',quality: 80,clip: {x: 0,y: 0,width: 375,height: 300}});browser.close();
}main();

3.8 生成pdf

除了利用截图保留快照外,还可以使用pdf保留快照。

async function main() {// 启动浏览器,访问页面的操作// 根据网页内容生成pdf文件,使用Page.pdf——注意:必须在无头模式下才可以调用await page1.pdf({path: '../pdf/baidu.pdf'});browser.close();
}main();


最近组建了一个江西人的前端交流群,如果你也是江西人可以加我微信 ruochuan12 拉你进群。


················· 若川出品 ·················

今日话题

一直涨粉很乏力,公众号不写原创,平时转载文章,活下来艰难。想着破局,但平时工作又忙,写原创文章艰难。只能暂时少接公众号广告了,能接广告变现有时是更新的动力啊,以后的路难走啊。同时深知写原创重要,但运营也很重要。原创、高质量和每天更新,这三点靠个人只能做到两点。欢迎分享、收藏、点赞、在看我的公众号文章~

一个愿景是帮助5年内前端人走向前列的公众号

可加我个人微信 ruochuan12,长期交流学习

推荐阅读

我在阿里招前端,我该怎么帮你?(现在还能加我进模拟面试群)

如何拿下阿里巴巴 P6 的前端 Offer

点击方卡片关注我、加个星标,或者查看源码等系列文章。
学习源码整体架构系列、年度总结、JS基础系列


http://chatgpt.dhexx.cn/article/lnPVEufc.shtml

相关文章

自制炒股盯盘神器——python实现GUI版本

有公众号粉丝在后台反馈:问能不能做一个可以在Windows环境下运行的GUI窗口,用来完成盯盘的功能。经过这几天的调试,现在这个小工具的基本功能已经初步调试完毕。下面就来看看它长什么样子吧: 主界面 主界面比较简单,只…

二十一个微信公众号推广技巧

微信营销说起来门槛很低,人人都可以做,门槛又很高,做到很好,需要很多的资源和投入,不说别的,要推广公众号,发展用户就是挑战,例如微信认证需要500用户是个门槛。也许你会抱怨为什么&…

gitbook 入门教程之还在搞公众号互推涨粉?gitbook 集成导流工具,轻轻松松躺增粉丝!...

相信大多数博客作者都或多或少有过这样想法: 现在各种平台这么多,想要实现全平台发布就要到处复制粘贴,等我有空一定做统一平台一次性全部解决! 不知道正在阅读文章的你,有没有这样的想法? 反正我确实这么想过,甚至 github 上相关项目早已创建,可一直迟迟没有下一步,要么是工作…

相见恨晚的IDEA热部署神器 JRebel

点击蓝色“java大数据修炼之道”关注我哟加个“星标”,每晚21:00,一起学技术来源: github.com/judasn/IntelliJ-IDEA-Tutorial/blob/master/jrebel-setup.md 作者: duanluanPart1JRebel 介绍 在 Java Web 开发中, 一般更新了 Java 文件后要手…

这5个摸鱼神器太火了!程序员:知道了快删!

这届打工人最喜欢的两个词 除了下班,就是摸鱼 鲁迅曾说过:要想成为一名合格的打工人 摸鱼是必备技能之一 △ 图源网络,如侵删 适(放)当(空)摸(自)鱼(己&#…

gitbook 入门教程之还在搞公众号互推涨粉?gitbook 集成导流工具,轻轻松松躺增粉丝!

相信大多数博客作者都或多或少有过这样想法: 现在各种平台这么多,想要实现全平台发布就要到处复制粘贴,等我有空一定做统一平台一次性全部解决! 不知道正在阅读文章的你,有没有这样的想法? 反正我确实这么想过,甚至 github 上相关项目早已创建,可一直迟迟没有下一步,要么是工…

单条视频播放超6000万,涨粉24万,撒狗粮也能轻松上热门?

在如今这个CP满天飞的时代,“无CP,无流量”似乎已成为金科玉律,不少沙雕网友常调侃:我可以单身,但我的CP一定要结婚。 在这样的粉丝经济背景下,也催生出了不少情侣KOL,他们都曾凭借在短视频中的…

卧槽,又一款Python神器

写Python代码最头疼的两件事是什么?我总结了两点 1、Windows 平台安装第三方包经常失败的问题,还记得第一次安装mysql依赖包时的那个场景吗?怎么都装不上。 2、虚拟环境切换的问题,如果我们同时在一台电脑上开发多个项目&#xff…

教培企业如何引流增粉?

教育培训行业,经过2020年疫情的影响,开始与互联网加速融合,以在线教育这个模式迅速出圈。 在线教育,可以突破时间和地域的限制,将优质的教育资源通过互联网和线上工具,触达更多区域更大范围的用户&#xf…

神器DeskGo!

本文,给大家带来一款超级良心的桌面整理工具,文末有下载方式! 使用电脑过程中,一直都存在一个令人矛盾的问题--文件是否放在桌面。 对于我来说,喜欢把各种各样的东西放在桌面,这对于使用过程中寻找文件带来…

月均200wUP主活跃的B站涨粉密码是什么?

本篇关键词:B站、UP主、涨粉、内容创作 B站是Z世代高度聚集的文化社区和视频平台。越来越多UP主加入构建出一个源源不断产出浓厚Z世代气息的多元文化社区。月均活跃UP主数量达200万的B站,UP主们如何实现粉丝的长效增长? 风格创作的魔力 B站…

ICCV2021涨点神器:新方式在视觉类领域提升精度(附源代码)

关注并星标 从此不迷路 计算机视觉研究院 公众号ID|ComputerVisionGzq 学习群|扫码在主页获取加入方式 计算机视觉研究院专栏 作者:Edison_G 基于非局部的块设计用于捕获计算机视觉任务中的远程时空依赖性。尽管表现出出色的性能,…

自媒体如何涨粉?这4个技巧

自媒体怎么引流?这4个技巧,0基础也能操作。经常会有很多朋友跟我吐槽,为什么自己明明花了很多心思做自媒体,但流量就是提不上来?其实,自媒体的引流的思路非常简单:内容 平台!文章引流…

抖音配音都有哪些软件好用?好的配音可以快速热门涨粉丨国仁网络资讯

刷抖音的时候,你是不是经常刷到这种视频: 想知道这样的AI配音是怎么做到的吗? 其实都是配音软件合成的,不仅能够支持AI配音,还有各种方言、各种声色都可以在配音软件中找到哦! 今天就给大家推荐几款抖音配音神器,各种语言、各种声音应有尽有,赶紧来get一款适合你的吧…

虾皮店铺有哪些涨粉方法?知虾数据教你八招快速涨粉技巧

做shopee电商平台,通常排名靠前的产品店铺,粉丝体量都很大。那么虾皮粉丝有没有用?如何快速涨粉呢?接下来知虾数据教你几个方法。 第1个方法,直接关注同行店铺的粉丝 操作很简单,打开虾皮手机APP&#xff…

自媒体人涨粉攻略:3个免费的有效渠道,快收好

做自媒体,粉丝就是收益的基础,也是很多自媒体工作者的绩效考核标准。但是做自媒体,涨粉可谓是头号难题,尤其是在想要不花钱的基础上。别急,今天小编就给大家分享一篇自媒体涨粉攻略,3个免费但有效的渠道&am…

公众号加粉php源码,微信公众号全自动推广系统PHP源码_快速增加粉丝订阅数吸粉神器...

源码说明 会员推广联盟源码,本推广系统是一套使用PHPMYSQL开发而成的广告链接智能推广程序,可用于 公众号、网店、网站、产品单页等多种类型的网站、单页进行推广! 带安装和使用教程,附送快速吸引大批推广员来帮你推广的方法和宣传用的软件 更新说明 1、…

技术小白教你如何做一个画蛋蛋的H5-涨粉神器-教你如何从1000到1W粉

 DEMO 好了~我们来看看我们要做的效果~上demo~ 扫描公众号 – >> 回复 “蛋” 点击蓝色字就可以进去了,进去试试吧 目录 微信JSSDK接入 canvas 如何让用户关注 函数记录 微信JSSDK接入 关于微信JSSDK接入,…

美食博主如何选厨房家电?这台冰箱可是我的涨粉神器

作为一名美食博主,我体验过不同的美食文化,得出的结论就是,无论哪种美食,美味的秘诀不仅在于烹饪技巧,更在于食材选用的新鲜程度。这也直接影响着我对厨房家电的选择要求,特别是冰箱,我一定要选…

涨粉神器,粉丝零距离交流!CSDN APP迎来更新

是的,CSDN APP又更新了,研发小哥哥辛苦了!CSDN APP基本做到了每周一更,第一时间解决用户反馈,还未下载的小伙伴可以扫描下方二维码直达! 你喜欢的功能都来了!CSDN App更新! 支持分享…