Puppeteer 的作用
Puppeteer 是一个 Node.js API,用于自动控制 Chrome 和 Firefox。既能让浏览器在不显示窗口的情况下运行,也能在调试时显示窗口。与基础 HTTP 客户端不同,Puppeteer 会执行页面脚本,并可访问渲染后的 DOM。
常见用途包括:
- 采集经过 JavaScript 渲染后才出现的内容。
- 点击按钮、在表单中输入内容和跟随重定向。
- 运行浏览器测试,以及截取屏幕截图或生成 PDF。
- 读取网络响应、Cookie 和性能计时数据。
Puppeteer 的工作原理
脚本会启动浏览器或连接到浏览器,打开页面,再发送导航或输入指令。所需内容出现后,脚本便可通过 CSS 选择器读取元素。
import puppeteer from 'puppeteer';
const browser = await puppeteer.launch({
args: ['--proxy-server=http://HOST:PORT']
});
const page = await browser.newPage();
await page.authenticate({ username: 'USERNAME', password: 'PASSWORD' });
await page.goto('https://example.com', { waitUntil: 'domcontentloaded' });
console.log(await page.$eval('h1', el => el.textContent));
await browser.close();
这段脚本会打开 example.com 并输出页面的主标题。如果数据由客户端渲染,应等待特定选择器或网络响应,而不是依赖固定的等待时间。
在 Puppeteer 中使用代理
需要认证的代理通常写作 http://USERNAME:PASSWORD@HOST:PORT。Chromium 的启动参数接收 http://HOST:PORT,代理发起认证质询时,page.authenticate() 会提供用户名和密码。必须在 page.goto() 之前调用该方法,否则代理可能返回 407 Proxy Authentication Required。
在启动浏览器时设置的代理通常适用于该浏览器进程中的所有页面。因此,更换代理可能需要单独启动浏览器进程,具体取决于 Puppeteer 版本和配置。
限制与替代工具
| 工具 | 最适合 | 主要取舍 |
|---|---|---|
| Puppeteer | Chrome 和 Firefox 自动化 | CPU 和内存占用更高 |
| Playwright | Chromium、Firefox 和 WebKit 测试 | API 和工具体系不同 |
| HTTP 采集工具 | 静态页面和 API | 不执行浏览器 JavaScript |
代理会改变网站看到的 IP 地址,但不能隐藏自动化行为,也不能修正异常的浏览器指纹。请求速率应控制在网站限制以内,同时遵守网站的 robots.txt 和使用条款;收到 429 响应后,应降低请求速率。
常见问题
Puppeteer 是无头浏览器吗?
不是。Puppeteer 是用于控制浏览器的库。“无头”是指浏览器运行时不显示界面。
Puppeteer 可以使用需要认证的代理吗?
可以。启动浏览器时设置代理的主机和端口,再在导航前通过 page.authenticate() 提供用户名和密码。
Puppeteer 适合网页采集吗?
适合,特别是页面需要 JavaScript、滚动或点击操作时。对于静态 HTML 或已有可用 API 的情况,直接使用 HTTP 客户端通常占用的资源更少。