Puppeteer 安装与配置 #

系统要求 #

基本要求 #

text
┌─────────────────────────────────────────────────────────────┐
│                    Puppeteer 系统要求                         │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   Node.js:  >= 18.0.0 (推荐 20.x LTS)                        │
│   npm:      >= 8.0.0                                         │
│   操作系统:  Windows, macOS, Linux                           │
│   内存:     至少 512MB 可用内存                               │
│   磁盘:     约 300MB (包含 Chromium)                          │
│                                                             │
└─────────────────────────────────────────────────────────────┘

各系统依赖 #

Linux #

bash
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y \
  ca-certificates \
  fonts-liberation \
  libasound2 \
  libatk-bridge2.0-0 \
  libatk1.0-0 \
  libc6 \
  libcairo2 \
  libcups2 \
  libdbus-1-3 \
  libexpat1 \
  libfontconfig1 \
  libgbm1 \
  libgcc1 \
  libglib2.0-0 \
  libgtk-3-0 \
  libnspr4 \
  libnss3 \
  libpango-1.0-0 \
  libpangocairo-1.0-0 \
  libstdc++6 \
  libx11-6 \
  libx11-xcb1 \
  libxcb1 \
  libxcomposite1 \
  libxcursor1 \
  libxdamage1 \
  libxext6 \
  libxfixes3 \
  libxi6 \
  libxrandr2 \
  libxrender1 \
  libxss1 \
  libxtst6 \
  lsb-release \
  wget \
  xdg-utils

macOS #

macOS 通常无需额外依赖,确保 Xcode Command Line Tools 已安装:

bash
xcode-select --install

Windows #

Windows 通常无需额外依赖,但需要确保已安装 Visual C++ Redistributable。

安装方式 #

方式一:完整安装(推荐) #

安装 Puppeteer 并自动下载 Chromium:

bash
npm install puppeteer

安装完成后:

  • Puppeteer 库安装在 node_modules/puppeteer
  • Chromium 浏览器下载到 ~/.cache/puppeteer

方式二:核心库安装 #

只安装核心库,不下载 Chromium:

bash
npm install puppeteer-core

这种方式适合:

  • 使用系统已安装的 Chrome/Chromium
  • 使用远程浏览器
  • 减小项目体积

方式三:使用 Yarn #

bash
yarn add puppeteer

方式四:使用 pnpm #

bash
pnpm add puppeteer

版本选择 #

版本对照表 #

Puppeteer 版本 Chromium 版本 Node.js 要求
22.x Chrome 122+ Node.js 18+
21.x Chrome 120+ Node.js 18+
20.x Chrome 118+ Node.js 18+
19.x Chrome 112+ Node.js 14+

安装特定版本 #

bash
# 安装最新版本
npm install puppeteer@latest

# 安装特定版本
npm install puppeteer@21.0.0

# 安装下一个版本(测试版)
npm install puppeteer@next

配置选项 #

环境变量配置 #

bash
# .env 文件
PUPPETEER_CACHE_DIR=/path/to/cache
PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
PUPPETEER_EXECUTABLE_PATH=/usr/bin/google-chrome

npm 配置 #

bash
# 跳过 Chromium 下载
npm install puppeteer --save --puppeteer_skip_download=true

# 指定下载目录
npm install puppeteer --save --puppeteer_download_path=/custom/path

package.json 配置 #

json
{
  "name": "my-project",
  "dependencies": {
    "puppeteer": "^22.0.0"
  },
  "puppeteer": {
    "cacheDirectory": "./chrome-cache",
    "skipDownload": false
  }
}

基本使用 #

第一个脚本 #

创建 index.js 文件:

javascript
const puppeteer = require('puppeteer');

(async () => {
  // 启动浏览器
  const browser = await puppeteer.launch();
  
  // 创建新页面
  const page = await browser.newPage();
  
  // 访问网页
  await page.goto('https://example.com');
  
  // 截图
  await page.screenshot({ path: 'example.png' });
  
  // 关闭浏览器
  await browser.close();
})();

运行脚本:

bash
node index.js

TypeScript 支持 #

Puppeteer 内置 TypeScript 类型定义:

typescript
import puppeteer, { Browser, Page } from 'puppeteer';

async function main(): Promise<void> {
  const browser: Browser = await puppeteer.launch();
  const page: Page = await browser.newPage();
  
  await page.goto('https://example.com');
  
  const title: string = await page.title();
  console.log('Page title:', title);
  
  await browser.close();
}

main();

启动配置详解 #

puppeteer.launch() 选项 #

javascript
const browser = await puppeteer.launch({
  // 是否无头模式
  headless: true,  // 'new' | true | false
  
  // 可执行文件路径
  executablePath: '/path/to/chrome',
  
  // 是否忽略 HTTPS 错误
  ignoreHTTPSErrors: true,
  
  // 启动超时时间
  timeout: 30000,
  
  // 视口默认设置
  defaultViewport: {
    width: 1920,
    height: 1080,
    deviceScaleFactor: 1,
    isMobile: false,
    hasTouch: false,
    isLandscape: false
  },
  
  // 浏览器启动参数
  args: [
    '--no-sandbox',
    '--disable-setuid-sandbox',
    '--disable-dev-shm-usage',
    '--disable-gpu'
  ],
  
  // 用户数据目录
  userDataDir: './user-data',
  
  // 是否忽略默认参数
  ignoreDefaultArgs: false,
  
  // 慢动作模式(毫秒)
  slowMo: 100
});

常用启动参数 #

javascript
const browser = await puppeteer.launch({
  args: [
    // 安全相关
    '--no-sandbox',                    // 禁用沙箱(Docker 必需)
    '--disable-setuid-sandbox',        // 禁用 setuid 沙箱
    
    // 性能相关
    '--disable-gpu',                   // 禁用 GPU 加速
    '--disable-dev-shm-usage',         // 避免共享内存问题
    '--disable-software-rasterizer',   // 禁用软件光栅化
    
    // 窗口相关
    '--window-size=1920,1080',         // 设置窗口大小
    '--start-maximized',               // 最大化启动
    
    // 隐身模式
    '--incognito',                     // 隐身模式
    
    // 语言
    '--lang=zh-CN',                    // 设置语言
    
    // 禁用功能
    '--disable-extensions',            // 禁用扩展
    '--disable-plugins',               // 禁用插件
    '--disable-images',                // 禁用图片加载
    '--disable-javascript',            // 禁用 JavaScript
    
    // 自动化检测
    '--disable-blink-features=AutomationControlled'  // 隐藏自动化特征
  ]
});

有头模式调试 #

javascript
const browser = await puppeteer.launch({
  headless: false,  // 显示浏览器窗口
  slowMo: 100,      // 放慢操作速度
  devtools: true    // 自动打开开发者工具
});

使用系统 Chrome #

查找 Chrome 路径 #

javascript
const puppeteer = require('puppeteer-core');

// macOS
const browser = await puppeteer.launch({
  executablePath: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'
});

// Windows
const browser = await puppeteer.launch({
  executablePath: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe'
});

// Linux
const browser = await puppeteer.launch({
  executablePath: '/usr/bin/google-chrome'
});

自动检测 Chrome 路径 #

javascript
const { execSync } = require('child_process');

function findChrome() {
  const platforms = {
    darwin: [
      '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
      '/Applications/Chromium.app/Contents/MacOS/Chromium'
    ],
    linux: [
      '/usr/bin/google-chrome',
      '/usr/bin/chromium',
      '/usr/bin/chromium-browser'
    ],
    win32: [
      'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
      'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe'
    ]
  };
  
  const paths = platforms[process.platform] || [];
  
  for (const path of paths) {
    try {
      if (require('fs').existsSync(path)) {
        return path;
      }
    } catch (e) {}
  }
  
  return null;
}

const browser = await puppeteer.launch({
  executablePath: findChrome()
});

Docker 环境配置 #

Dockerfile 示例 #

dockerfile
FROM node:20-slim

# 安装 Chrome 依赖
RUN apt-get update && apt-get install -y \
    wget \
    gnupg \
    ca-certificates \
    fonts-liberation \
    libasound2 \
    libatk-bridge2.0-0 \
    libatk1.0-0 \
    libatspi2.0-0 \
    libcups2 \
    libdbus-1-3 \
    libdrm2 \
    libgbm1 \
    libgtk-3-0 \
    libnspr4 \
    libnss3 \
    libwayland-client0 \
    libxcomposite1 \
    libxdamage1 \
    libxfixes3 \
    libxkbcommon0 \
    libxrandr2 \
    xdg-utils \
    && rm -rf /var/lib/apt/lists/*

# 设置工作目录
WORKDIR /app

# 复制 package.json
COPY package*.json ./

# 安装依赖
RUN npm install

# 复制代码
COPY . .

# 运行脚本
CMD ["node", "index.js"]

Docker Compose 示例 #

yaml
version: '3.8'

services:
  puppeteer:
    build: .
    environment:
      - PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
    volumes:
      - ./:/app
    command: node index.js

Docker 中运行配置 #

javascript
const browser = await puppeteer.launch({
  headless: 'new',
  args: [
    '--no-sandbox',
    '--disable-setuid-sandbox',
    '--disable-dev-shm-usage',
    '--disable-gpu'
  ]
});

常见问题解决 #

问题 1:Chromium 下载失败 #

bash
# 使用国内镜像
export PUPPETEER_DOWNLOAD_HOST=https://registry.npmmirror.com/mirrors

# 或使用淘宝镜像
export PUPPETEER_DOWNLOAD_HOST=https://cdn.npmmirror.com/binaries/chrome-for-testing

npm install puppeteer

问题 2:权限不足 #

bash
# Linux 权限问题
sudo chmod -R 755 node_modules/puppeteer/.local-chromium

问题 3:内存不足 #

javascript
// 限制内存使用
const browser = await puppeteer.launch({
  args: [
    '--max-old-space-size=4096',
    '--disable-dev-shm-usage'
  ]
});

// 及时关闭页面
const page = await browser.newPage();
// ... 操作
await page.close();

问题 4:超时问题 #

javascript
// 增加超时时间
const browser = await puppeteer.launch({
  timeout: 60000  // 60 秒
});

// 页面操作超时
await page.goto('https://example.com', {
  timeout: 60000,
  waitUntil: 'networkidle0'
});

问题 5:中文乱码 #

javascript
// 安装中文字体(Linux)
// sudo apt-get install fonts-wqy-zenhei fonts-wqy-microhei

// 或在启动时指定字体
const browser = await puppeteer.launch({
  args: ['--font-render-hinting=none']
});

配置最佳实践 #

开发环境配置 #

javascript
const browser = await puppeteer.launch({
  headless: false,
  devtools: true,
  slowMo: 50,
  defaultViewport: {
    width: 1920,
    height: 1080
  }
});

生产环境配置 #

javascript
const browser = await puppeteer.launch({
  headless: 'new',
  args: [
    '--no-sandbox',
    '--disable-setuid-sandbox',
    '--disable-dev-shm-usage',
    '--disable-gpu',
    '--disable-software-rasterizer',
    '--disable-extensions',
    '--disable-plugins'
  ]
});

爬虫配置 #

javascript
const browser = await puppeteer.launch({
  headless: 'new',
  args: [
    '--no-sandbox',
    '--disable-setuid-sandbox',
    '--disable-blink-features=AutomationControlled'
  ]
});

// 隐藏 webdriver 特征
await page.evaluateOnNewDocument(() => {
  Object.defineProperty(navigator, 'webdriver', {
    get: () => false
  });
  
  window.chrome = {
    runtime: {}
  };
  
  Object.defineProperty(navigator, 'plugins', {
    get: () => [1, 2, 3, 4, 5]
  });
});

验证安装 #

检查版本 #

javascript
const puppeteer = require('puppeteer');

console.log('Puppeteer version:', puppeteer.version());

(async () => {
  const browser = await puppeteer.launch();
  console.log('Chromium version:', await browser.version());
  await browser.close();
})();

完整测试脚本 #

javascript
const puppeteer = require('puppeteer');

async function test() {
  console.log('🚀 启动浏览器...');
  const browser = await puppeteer.launch();
  
  console.log('📄 创建页面...');
  const page = await browser.newPage();
  
  console.log('🌐 访问网页...');
  await page.goto('https://example.com');
  
  console.log('📸 截图...');
  await page.screenshot({ path: 'test-screenshot.png' });
  
  console.log('📝 获取标题...');
  const title = await page.title();
  console.log('标题:', title);
  
  console.log('✅ 测试完成!');
  await browser.close();
}

test().catch(console.error);

下一步 #

现在你已经完成了 Puppeteer 的安装和配置,接下来学习 基础用法 开始编写自动化脚本!

最后更新:2026-03-28