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

维度PuppeteerPlaywright
浏览器支持仅 ChromiumChromium/Firefox/Safari/Edge
语言绑定仅 Node.jsNode.js/Python/Java/C#
社区成熟度⭐⭐⭐⭐⭐(更成熟)⭐⭐⭐⭐(后起之秀)
性能⭐⭐⭐⭐⭐⭐⭐⭐⭐

结论:如果只做 Chrome 相关自动化,Puppeteer 够用且更成熟;如果需要跨浏览器,Playwright 更合适。

vs Selenium
Selenium 支持多语言、多浏览器,但设置复杂、性能差、Puppeteer 能做的 Selenium 基本也能做但更麻烦。


⚠️ 注意事项

  1. 内存占用:Chrome 本身就比较吃内存,如果要并发多个实例,做好资源规划
  2. 版本同步:Puppeteer 版本和 Chrome 版本需要对应,新版 Puppeteer 会自动下载匹配版本
  3. Docker 部署:必须加 --disable-dev-shm-usage 参数,否则大概率崩溃
  4. 反爬对抗:Puppeteer 会被部分网站检测到(可以通过 page.evaluateOnNewDocument 注入脚本绕过)
  5. 仅支持 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