如何使用 Puppeteer Cluster 扩展网络抓取?
在本文中,我们将向您介绍如何使用 傀儡廻集群这样,您就可以同时处理更多任务,加快整个流程。让我们深入了解一下!
什么是 Puppeteer 集群?
Puppeteer 集群有助于加快 网络抓取 通过同时运行多个浏览器实例,也就是多个 worker。不同于用单个浏览器按顺序逐个抓取每个 URL,Puppeteer Cluster 会把工作负载分配给多个 worker,让它们并发处理任务。每个 worker 接手一个任务,抓取数据,然后从共享队列中继续处理下一个任务。这种方式可以同时抓取多个页面,减少抓取大型数据集所需的时间。当你需要快速抓取大量数据时,Puppeteer Cluster 尤其有用。
为什么使用 Puppeteer 集群?
以下是使用 Puppeteer 集群的主要优势:
- 提高速度和效率:刮擦大型网站或多个 URL 时,运行一个浏览器实例可能需要很长时间。Puppeteer 集群可以让你同时运行多个浏览器实例,从而加快进程。这就减少了刮擦所有网页所需的总时间。
- 资源优化:同时运行多个浏览器实例可确保您充分利用可用资源。每个任务运行一个实例的效率可能会很低,而群集则可让您在多个工作员之间分担工作量,从而以最佳方式使用资源。
- 更好的负载分配:在网站运行缓慢或资源繁重的情况下,集群可以帮助将工作量平均分配给多个工作员。这样就能确保没有一个工作者超负荷工作,并尽快完成任务。
- 避免被发现:当从同一网站刮擦多个页面时,集群可帮助您将任务分配到不同的浏览器实例中,从而使网站更难检测到刮擦行为。每个 Worker 可以使用自己的 cookies、用户代理和会话集,从而降低被标记为僵尸的可能性。
设置 Puppeteer 集群
要开始使用 Puppeteer Cluster,你需要安装必要的依赖。这包括 Puppeteer 和 Puppeteer Cluster 库。
安装 Puppeteer 和 Puppeteer-Cluster:首先,运行以下命令安装所需的库:
npm install puppeteer puppeteer-cluster
导入图书馆:安装后,将必要的库导入脚本。你需要 puppeteer-cluster 库来处理集群功能:
const { 群组 } = require(傀儡簇);
启动群集:导入库后,即可启动群集。通过 Cluster.launch 函数,您可以配置多个参数,如并发模型( Worker 的运行方式)、并发运行的最大 Worker 数量以及其他集群设置。例如,要创建一个包含三个浏览器实例的群集,可以使用以下代码:
const 集群 = await 群组.launch({
并发性: 群组.并发浏览器, // 使用单独的浏览器实例
maxConcurrency: 3, // 限制并发浏览器实例的数量
});
傀儡廻集群如何工作?
puppeteer-cluster 库提供了一种简便的方法来管理并发刮擦网站的工人池。每个 Worker 负责执行一项任务,其中可能包括导航到 URL、从页面上刮取数据或与页面交互。下面是该过程的工作原理:
任务队列:启动群集时,您需要定义每个 Worker 将执行的任务。任务可能包括导航到一个特定的 URL 并搜索一些数据。任务会被添加到群集的任务队列中,每个工作者都会在空闲时执行任务。
并发模型:Puppeteer Cluster 中有三种并发模型,各自适用于不同的使用场景:
- 并发浏览器:这种模式在单独的浏览器实例中运行每个 Worker。当你需要任务之间完全隔离时,比如当每个任务都需要自己的 cookie、用户代理或代理时,它是理想的选择。
- 并发上下文:这种模式在同一浏览器实例中的单独浏览器上下文中运行每个 Worker。它允许您共享用户代理或 cookie 等浏览器资源,但任务之间仍有一定的隔离性。
- 并发页:这种模式在同一浏览器实例和上下文中运行每个 Worker,共享 Cookie、会话数据和本地存储等资源。它最节省内存,但应在刮擦不同域时使用。
同时运行任务:集群建立后,可以使用 cluster.queue(url) 将任务添加到队列中。每个 Worker 都会从队列中挑选一个任务,处理后再转到下一个任务。这样,任务就能同时运行,从而大大缩短了刮擦数据所需的时间。
关闭群组:处理完所有任务后,可以调用 cluster.close() 关闭群集,并释放工作者使用的所有资源。
示例:同时搜索多个 URL
下面是一个简单的示例,说明如何使用 Puppeteer Cluster 同时抓取多个页面。在本例中,我们将抓取不同页面的标题:
const { 群组 } = require(傀儡簇);
(async () => {
// 使用三个浏览器实例启动群集
const 集群 = await 群组.launch({
并发性: 群组.并发浏览器,
maxConcurrency: 3,
});
// 定义搜索页面标题的任务
await 群集。工作(async ({ page、 data: url }) => {
await page.goto(url);
console.log(await page.title());
});
// 为多个 URL 排好队,以便进行刮擦
const 网址 = [
'https://example.com/page1',
'https://example.com/page2',
'https://example.com/page3',
];
网址.forEach((url) => 群集。queue(网址));
// 等待所有任务完成
await 群集。空转();
// 关闭群集
await 群集。close();
})();
在上面的代码中,同时启动了三个浏览器实例。每个 Worker 执行导航到 URL 并记录页面标题的任务。每个 URL 都会被添加到队列中,然后工作程序会接收任务并同时进行处理,从而大大缩短了扫描所有三个页面所需的时间。
高级群集功能
Puppeteer Cluster 还提供若干高级功能,使其更加强大和灵活。这些选项可帮助你更有效地管理大规模网络搜索任务:
1.重试限制和延迟:如果任务失败(例如,由于网络错误或页面加载失败),您可以设置重试限制和延迟,以便再给任务一次成功的机会。
const 集群 = await 群组.launch({
重试限制: 3, // 每个任务的最大重试次数
重试延迟: 2000, // 重试之间的延迟(毫秒)
});
2.超时:您可以为任务设置全局超时,确保耗时过长的任务自动停止。
const 集群 = await 群组.launch({
超时: 6000, // 每个任务的超时(毫秒)
});
3.跳过重复的 URL:为了避免同一个 URL 被多次处理,你可以启用 `skipDuplicateUrls` 选项。
const 集群 = await 群组.launch({
skipDuplicateUrls: true, // 防止处理重复的 URL
});
4.工人创建延迟:如果需要控制工人的创建速度,可以在每个工人的创建之间引入延迟。
const 集群 = await 群组.launch({
工人创建延迟: 100, // 创建 Worker 之间的延迟(毫秒)
});
利用云解决方案扩展网络抓取
虽然 Puppeteer Cluster 可以帮助您在本地机器上扩展您的 scraper,但同时运行太多浏览器实例可能会导致内存消耗问题。为了克服这些挑战,您可以使用 Bright Data 这样基于云的代理和浏览器管理解决方案。Bright Data 提供强大的基础架构,使您能够毫不费力地扩展网络刮擦操作。
通过将 Puppeteer scraper 连接到 Bright Data 等基于云的解决方案,您可以处理数千个并发请求,而不必担心系统限制。光明数据 提供旋转代理此外,它还具有地理定位、在多个云节点上轻松扩展刮擦操作的能力,使其成为大规模刮擦项目的理想选择。
下面是一个整合的例子 Bright Data 的代理管理器 使用你的 Puppeteer Cluster 抓取器:
const puppeteer = require(puppeteer-core);
const { 群组 } = require(傀儡簇);
(async () => {
// 设置 Bright Data 的代理管理器
const browser = await puppeteer.接通({
浏览器端点: wss://your-proxy-manager-endpoint,
});
// 使用 Bright Data 连接启动群集
const 集群 = await 群组.launch({
并发性: 群组.并发浏览器,
maxConcurrency: 3,
浏览器、
});
// 定义刮擦任务
await 群集。queue('https://example.com', async ({ page, data }) => {
await page.goto(data);
console.log(await page.title());
});
// 关闭群集
await 群集。空转();
await 群集。close();
await browser.close();
})();
结论
Puppeteer Cluster 是一款功能强大的工具,可通过同时运行多个浏览器实例来扩展网络刮擦任务。通过使用集群,你可以显著提高刮擦速度和效率,处理大量数据,并降低被网站检测到的风险。无论你是为研究、分析还是商业智能而刮擦数据,Puppeteer Cluster 都能为你提供一种简单有效的方法来扩展你的网络刮擦操作。
对于大规模刮擦任务,可考虑使用 Bright Data 或 Firecrawl 等基于云的解决方案来管理大量请求并扩展刮擦程序,而不会遇到系统限制。

