开始试用
返回

Puppeteer 网页抓取实用指南

用你偏好的 AI 总结本文
试用我们的高级代理

无限量测试我们的优质代理,畅享卓越质量。

  • 移动代理和住宅代理
  • ZIP 级别定位
  • 静态 IP 和轮换 IP
  • 内置质量过滤器
立即试用

Puppeteer 是 JavaScript 中使用最广泛的浏览器自动化工具之一。开发者用它通过代码控制真实浏览器,无需手动点击页面。

同样的能力也让 Puppeteer 非常适合 网络爬虫。许多现代网站使用 JavaScript 加载内容,抓取工具需要像浏览器那样看到页面,而不仅仅是服务器最初返回的原始 HTML。

本指南介绍 Puppeteer 是什么、它如何工作,以及如何用它搭建一个简单的抓取工具。同时还会讲解当抓取项目规模超出单个测试页面后会出现的实际问题。

要做大规模抓取?试试 NodeMaven 代理,低至 $3.50,并获得 750MB 流量

立即试用

Puppeteer 是什么?

Puppeteer 是一个 由 Chrome 团队维护的 JavaScript 库。它为开发者提供了一套高级 API,可通过代码控制浏览器。

Puppeteer 通常与 Node.js 搭配使用。用 Puppeteer 编写的脚本可以打开浏览器、访问页面、与之交互并读取其内容,全程无需人工操作鼠标或键盘。

默认情况下, Puppeteer 以无头模式运行。所谓 无头浏览器 是一个在没有可见窗口的情况下运行的真实浏览器。由于无需渲染界面,这使其在自动化方面非常高效。

Puppeteer 可以控制 Chrome 和 Chromium,同时也支持 Firefox。它通过 Chrome DevTools Protocol 或 WebDriver BiDi与浏览器通信,具体取决于配置。

Puppeteer 并非只为抓取而生。 它还常用于:

  • Web 应用的自动化测试
  • 对页面进行截图
  • 从网页生成 PDF
  • 监控页面性能
  • 各类浏览器自动化任务

网页抓取只是开发者应用 Puppeteer 浏览器控制能力的实用方式之一。

为什么使用 Puppeteer 进行网页抓取?

要理解 Puppeteer 为何有用,不妨对比两种不同的抓取方式。

传统 HTTP 抓取:

请求 → HTML → 提取数据

基础抓取工具向某个 URL 发送 HTTP 请求,并读取返回的 HTML。这对简单的静态页面效果很好。

基于浏览器的 Puppeteer 抓取:

打开浏览器 → 加载页面 → 执行 JavaScript → 渲染内容 → 提取数据

Puppeteer 会打开一个真实浏览器,加载页面,并在提取任何数据之前让页面的 JavaScript 先运行。这一点很重要,因为越来越多的网站在页面初次加载之后才动态构建内容。

当页面依赖 JavaScript 来呈现内容时,Puppeteer 网页抓取就会派上用场 。常见的例子包括:

  • 通过 API 调用之后才加载的商品列表
  • 无需整页重新加载即可更新的筛选条件和搜索结果
  • 用 JavaScript 构建的分页控件
  • 无限滚动的信息流
  • 交互式仪表板或应用
  • 只有在用户操作触发后才出现的内容

普通的 HTTP 请求只能看到页面最初的 HTML,会遗漏浏览器之后生成的所有内容。这正是抓取由 JavaScript 渲染的页面 通常需要一个真实浏览器环境的根本原因,也是 Puppeteer 成为在 Node.js 中进行此类抓取的常见选择的原因。

需要可靠的 IP 轮换?试试 NodeMaven 住宅代理,$3.50 起,含 750MB 流量

立即试用

如何安装 Puppeteer

Puppeteer 通过 npm 安装,npm 是随 Node.js 一同发布的包管理器。如果你的机器上已经配置好 Node.js,只需一条命令即可安装 Puppeteer。

该命令会将 Puppeteer 添加到你的项目中,并下载一个与之兼容、可供其控制的 Chrome 版本。这个内置浏览器就是 Puppeteer 默认启动的浏览器,因此 在典型的配置中无需单独安装浏览器。

如果你只需要 API 而不需要内置浏览器, puppeteer-core 是更轻量的选择。它要求你连接到自行管理的浏览器,这更偏向高级用法。

对于日常抓取项目而言,常规的 puppeteer 包是更简单的入门选择。

如何使用 Puppeteer 抓取网站

理解 Puppeteer 抓取的最佳方式 是看一个小而完整的示例。这段代码会打开一个页面,等待其加载完成,从中读取一些文本,然后打印结果。

下面是各部分的作用:

  • puppeteer.launch() 会启动一个新的浏览器实例。这就是 浏览器 由你的脚本控制。
  • browser.newPage() 会在该浏览器中打开一个新标签页。这就是 页面 你的脚本将要操作的对象。
  • page.goto() 会导航到某个 URL。其中的 waitUntil 选项用于告诉 Puppeteer 依据什么来判断页面已准备就绪,然后再继续执行。
  • page.$$eval() 使用 CSS 选择器选中页面上的一组元素,然后在浏览器内对它们运行一个函数。在这个示例中,它会抓取页面上的每一个书名。
  • browser.close() 会在脚本执行完毕后关闭浏览器。在长时间运行的项目中省略这一步,可能会让浏览器进程一直在后台运行。

启动、打开页面、等待、选择、提取、关闭,这同一套流程是大多数 Puppeteer 抓取器的基础。 更复杂的项目会在此基础上增加额外步骤 用于导航、等待和错误处理。

使用 Puppeteer 抓取动态网站

当网站依赖 JavaScript 来生成内容时,静态 HTML 抓取就失效了。服务器返回的大多是一个空页面,真正的内容随后由浏览器中运行的脚本添加。

这正是 Puppeteer 所针对的场景。由于它控制的是一个完整的浏览器,因此可以让这些 JavaScript 正常运行,等内容真正出现后再读取页面。

在抓取动态页面时,有几种常见情形会经常出现。

等待内容加载

有时脚本首次查找某个元素时,该元素尚未出现在页面上。Puppeteer 可以先等待特定选择器出现,然后再继续执行。

这会让 Puppeteer 暂停,直到匹配 .product-price 的元素出现在页面中,而不是因为它尚不存在就立即失败。

点击元素

有些内容只有在用户执行操作后才会出现,例如打开某个标签页或展开某个板块。Puppeteer 可以在读取页面之前模拟这样的点击。

有些信息流会在用户向下滚动时加载更多条目。 Puppeteer 抓取工具可以通过在页面内执行滚动操作来模拟滚动, 然后等待新条目出现后再进行采集。

分页

许多网站使用“下一页”按钮或页码把结果分散到多个页面上。Puppeteer 可以在循环中逐页点击,在每一页提取数据后再进入下一页。

这些技巧通常是组合使用的,而不是单独使用。一个真实的抓取脚本可能会先等待页面加载,点击某个筛选条件,再次等待,然后提取数据,全部都在同一个脚本中完成。

使用 Puppeteer 抓取时的常见问题

即使是编写良好的 Puppeteer 抓取脚本,一旦用于单个测试页面之外的场景,也会遇到一系列可以预见的问题。

页面加载缓慢

有些页面的加载时间比预期更长,在网络较慢或网站较重时尤其如此。没有考虑到这一点的脚本 可能会超时或抓取到不完整的页面。

设置合理的超时时间并等待正确的元素有助于避免这种情况。

动态内容

异步加载的内容并不总是在 page.goto() 完成的那一刻就已可用。因此,等待特定的选择器,而不是使用固定的延时, 是更可靠的做法.

速率限制

发送请求过快会触发网站的速率限制,导致后续请求变慢或被拦截。当抓取工具从少量测试请求转向更大规模的任务时,这种情况很常见。

CAPTCHA 与机器人检测

许多网站使用各种系统来识别自动化流量,并 显示 CAPTCHA 或拦截请求。它们的存在是因为网站希望限制自动化访问,因此任何抓取项目都应考虑网站的使用条款。

IP 封锁

当短时间内有大量请求来自同一个 IP 地址时,一些网站会标记或封锁该 IP。对于小规模的抓取任务,这通常不是问题。

一旦项目涉及频繁请求、更大的数据量或长时间运行的任务,这就会成为真正的限制,因为单一 IP 在目标网站看来会显得异常。

需要大规模抓取动态网站?立即获取 NodeMaven 住宅代理,$3.50 起,含 750MB 流量

立即试用

Puppeteer 需要代理吗?

并非每个 Puppeteer 项目都需要代理。对于小型抓取任务,直接连接通常就足够了。

当项目朝以下某个方向发展时,代理才变得有意义:

  • 进行更大规模的抓取,并且长期发出大量请求
  • 需要以特定国家或城市的用户视角 来查看某个网站 it
  • 将流量分散到多个 IP 地址上 而不是依赖单一 IP
  • 绕过基于 IP 的速率限制 或封锁
  • 运行需要 长时间持续的抓取任务

如果不使用代理,Puppeteer 脚本发出的每一个请求都来自同一个 IP 地址。代理会将这些流量通过另一个 IP 或一组 IP 池进行转发,从而使请求看起来不再全部来自同一个来源。

在 Puppeteer 中设置代理需要完成若干配置步骤,包括启动参数和身份验证。由于该设置已在别处详细介绍,本指南不再重复。完整的配置演练请参见 Puppeteer 代理集成指南.

哪种代理类型最适合 Puppeteer 抓取?

不同类型的代理适用于不同的采集需求。

住宅代理 使用与真实互联网服务提供商关联的 IP。它们适合广泛的地理覆盖和规模较大的采集任务。轮换住宅代理可以在不同请求之间更换 IP。

移动代理 使用来自移动运营商网络的 IP。当移动网络 IP 更适合目标网站时,它们会非常有用。

ISP 代理 提供注册在互联网服务提供商名下的稳定 IP。当采集程序需要固定 IP 和更长的会话时,它们表现出色。

最佳选择取决于目标网站、采集规模,以及你需要的是轮换 IP 还是稳定 IP。

在 Puppeteer 中使用 NodeMaven 代理

一旦 Puppeteer 采集程序开始发送大量请求,仅依赖单个 IP 地址就会成为一个实实在在的限制。

NodeMaven 提供轮换住宅代理 基于庞大的 IP 池构建,支持国家、城市和 ZIP 级别的定位,并提供会话控制,让脚本可以自动轮换 IP,或在设定的时间内保持粘性会话。

同时还提供移动代理 适用于更适合使用移动网络 IP 的工作流,例如采集以移动端为主的平台,或者移动 IP 表现比广泛覆盖更为重要的工作流。

完整的设置流程(包括启动参数和身份验证)请参见 Puppeteer 代理集成指南.

Puppeteer 网页抓取最佳实践

在实际使用中,一些习惯能让 Puppeteer 采集程序明显更加稳定可靠。

  • 使用符合真实情况的请求频率。 以最快速度发送请求会增加触发速率限制或被封锁的可能性。拉开请求间隔会更像正常流量。
  • 等待内容加载,而不是靠猜测时间。 使用 waitForSelector 或类似方法,而不是使用固定延时,因为加载时间会有所不同。
  • 处理超时和错误。 页面偶尔会加载失败。将导航操作包裹在 try 和 catch 块中,可以避免单个页面失败导致整个脚本中断。
  • 高效复用浏览器资源。 为每个页面都开启并关闭一个新浏览器,比在可能的情况下用同一个浏览器处理多个页面要慢得多。
  • 避免不必要的页面加载。 只访问采集数据时确实需要的页面。
  • 使用与工作流相匹配的代理会话类型。 轮换会话适合大批量抓取,而粘性会话适合需要在一段时间内保持同一 IP 的任务。
  • 保持抓取数据结构化。 以 JSON 或 CSV 等统一格式保存结果,可以让采集完成后的数据更易于使用。

准备好扩展你的 Puppeteer 抓取器了吗?立即体验 NodeMaven 住宅代理,低至 $3.50,并获得 750MB 流量

立即试用

Puppeteer 网页抓取常见问题

Puppeteer 用于通过代码控制浏览器。常见用途包括网页抓取、自动化测试、截屏、生成 PDF 以及各类浏览器自动化。

可以。Puppeteer 常用于网页抓取,因为它能够先完整加载页面(包括由 JavaScript 渲染的内容),然后再从中提取数据。

适合。由于 Puppeteer 控制的是真实浏览器,它可以等待 JavaScript 渲染的内容加载完成后再读取页面,而静态 HTTP 请求无法做到这一点。

Puppeteer 本身并不是浏览器。它默认控制的是无头浏览器,也就是在没有可见界面的情况下运行的真实浏览器。需要调试时,它也可以在可见模式下运行。

可以。Puppeteer 脚本能够按顺序浏览多个页面,包括跟随分页链接或循环遍历一组 URL。

这取决于目标网站。对于简单的静态页面,基础的 HTTP 请求通常更快、更轻量。对于依赖 JavaScript 显示内容的页面,Puppeteer 基于浏览器的方式通常更可靠。

可以。Puppeteer 支持配置为将其浏览器流量通过代理转发。完整的设置流程请参见 Puppeteer 代理集成指南.

Puppeteer 可用于较大规模的抓取项目,但运行大量浏览器实例比简单的 HTTP 请求占用更多系统资源。较大的项目通常还需要 代理轮换 以避免基于 IP 的限制。

您可能还喜欢 这些文章

本网站使用 Cookie 文件 来提升您的使用体验。继续访问即表示您同意我们使用 Cookie。