Puppeteer 是 Google Chrome 团队维护的 JavaScript 库,通过 DevTools 协议控制 Chrome/Chromium。支持截图、PDF、爬虫和自动化测试,Apache-2.0 开源,GitHub 94.9k Stars,是前端和爬虫工程师的必备工具。
🎤 引言
做前端开发或爬虫的同学,肯定遇到过这种场景:需要自动操作浏览器——截图、填表、点击按钮、等待动态内容加载……用手工操作简直要命,用 Selenium 又觉得太重。
今天要安利的 Puppeteer(木偶师)就是来解决这个痛点的。这玩意儿是 Google Chrome 官方团队在维护,通过 DevTools 协议直接控制 Chrome,功能强大到离谱。GitHub 94.9k Stars,足以说明它的江湖地位。
⭐ 核心功能
1. 浏览器无头/有头模式
Puppeteer 默认以无头模式(headless)运行 Chrome,悄无声息地执行任务。当然,你也可以改成有头模式,实时观察浏览器在干啥。
2. 截图与 PDF 生成
一句话:给网页截图、生成 PDF 文档。不仅是全页面截图,还能自定义视口尺寸、设备模拟(比如 iPhone)、隐藏某些元素。做的好的爬虫工具基本都有这功能。
3. 网页爬虫(尤其适合 SPA)
这是 Puppeteer 的强项!对于 React/Vue/Angular 这类动态渲染的 SPA 应用,传统爬虫根本拿不到数据。但 Puppeteer 直接运行 JavaScript,等页面完全渲染后再提取内容,真香。
4. 表单自动化
自动填写表单、点击按钮、模拟键盘输入。比如自动登录、自动发帖、自动抢票……你懂的。
5. 性能分析
内置 Performance API,可以分析网页加载性能、绘制时间、JS 执行效率。前端优化必备。
6. 自动化测试
配合 Jest 或 Mocha,可以写自动化测试用例,直接在真实 Chrome 环境中跑。
📥 安装与使用
环境要求
- Node.js 18+
- Chrome/Chromium(会自动下载)
安装
npm install puppeteer
# 或
yarn add puppeteer基础用法
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
headless: 'new', // 无头模式
defaultViewport: { width: 1280, height: 720 }
});
const page = await browser.newPage();
// 访问网页
await page.goto('https://example.com');
// 截图
await page.screenshot({ path: 'example.png', fullPage: true });
// 获取页面内容(支持 SPA)
const content = await page.content();
console.log('页面内容:', content);
// 执行 JavaScript
const title = await page.evaluate(() => document.title);
console.log('标题:', title);
await browser.close();
console.log('搞定!');
})();Docker 注意事项
在 Docker 中运行 Chrome 需要特殊参数,否则容易崩溃:
const browser = await puppeteer.launch({
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage' // 重要!防止共享内存不足
]
});🎯 适用场景
谁适合用 Puppeteer?
| 场景 | 推荐指数 | 说明 |
|---|---|---|
| 爬取 SPA/伪动态网页 | ⭐⭐⭐⭐⭐ | 天然优势,竞品很少能打 |
| 网页截图/长图 | ⭐⭐⭐⭐⭐ | 全页面、自定义设备 |
| 自动化测试 | ⭐⭐⭐⭐ | 配合测试框架很好用 |
| 生成 PDF 报告 | ⭐⭐⭐⭐ | 比 PhantomJS 简单太多 |
| 表单自动填写 | ⭐⭐⭐ | 适合简单场景 |
| 性能分析 | ⭐⭐⭐⭐ | 内置工具够用 |
🔍 对比与替代方案
vs Playwright
| 维度 | Puppeteer | Playwright |
|---|---|---|
| 浏览器支持 | 仅 Chromium | Chromium/Firefox/Safari/Edge |
| 语言绑定 | 仅 Node.js | Node.js/Python/Java/C# |
| 社区成熟度 | ⭐⭐⭐⭐⭐(更成熟) | ⭐⭐⭐⭐(后起之秀) |
| 性能 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
结论:如果只做 Chrome 相关自动化,Puppeteer 够用且更成熟;如果需要跨浏览器,Playwright 更合适。
vs Selenium
Selenium 支持多语言、多浏览器,但设置复杂、性能差、Puppeteer 能做的 Selenium 基本也能做但更麻烦。
⚠️ 注意事项
- 内存占用:Chrome 本身就比较吃内存,如果要并发多个实例,做好资源规划
- 版本同步:Puppeteer 版本和 Chrome 版本需要对应,新版 Puppeteer 会自动下载匹配版本
- Docker 部署:必须加
--disable-dev-shm-usage参数,否则大概率崩溃 - 反爬对抗:Puppeteer 会被部分网站检测到(可以通过
page.evaluateOnNewDocument注入脚本绕过) - 仅支持 Node.js:如果你用 Python/Go,只能选 Playwright 或 Selenium
✅ 总结
优点:
- Google Chrome 团队维护,质量有保证
- 通过 DevTools 协议控制 Chrome,性能强、稳定性好
- API 设计简洁,上手快
- 社区庞大,资料多
- 94.9k Stars,成熟度高
缺点:
- 仅支持 Node.js(其他语言别想了)
- 仅支持 Chromium 内核(Chrome/Edge)
- 内存占用不低
推荐指数:⭐⭐⭐⭐⭐
如果你是前端开发者、爬虫工程师、或者需要自动化操作浏览器的场景,Puppeteer 绝对值得一试。尤其是爬取 SPA 这种场景,目前能打的竞品真不多。
官网:https://pptr.dev | GitHub:https://github.com/puppeteer/puppeteer