同时运行多个Puppeteer实例是否安全?

时间:2018-01-18 09:23:35

标签: google-chrome-devtools puppeteer

是否安全/支持在

处同时运行多个Puppeteer实例
  1. 流程级别(同时多个node screenshot.js)或
  2. 在脚本级别(同时多个puppeteer.launch())?
  3. 并行流程的建议设置/限制是什么?

    (在我的测试中,(1)似乎工作正常,但我想知道Puppeteer与Chrome的单个(?)实例的互动的可靠性。我没有尝试过< em>(2)但似乎不太可能解决。)

3 个答案:

答案 0 :(得分:5)

可以并行运行多个浏览器,上下文甚至页面。限制取决于您的网络/磁盘/内存和任务设置。

我抓取了几百万个页面,并且有时(在我的设置中,每个~10,000 pages)的伪操纵者都会崩溃。因此,您应该有一种自动重启浏览器并重试作业的方法。

您可能要签出puppteer-cluster,该任务负责合并浏览器实例,重新启动以及崩溃检测/重新启动。 (免责声明:我是作者)

创建集群的示例如下:

// create a cluster that handles 10 parallel browsers
const cluster = await Cluster.launch({
    concurrency: Cluster.CONCURRENCY_BROWSER,
    maxConcurrency: 10,
});

// Queue your jobs (one example)
cluster.queue(async ({ page }) => {
    await page.goto('http://www.wikipedia.org');
    await page.screenshot({path: 'wikipedia.png'});
});

这只是一个最小的例子。还有更多使用群集的方法。

答案 1 :(得分:4)

每个puppeteer.launch()都会为您的脚本启动一个新浏览器,因此让脚本与多个puppeteer.launch调用进行交互,而不是运行多个脚本实例。即使节点是单线程的,事件也会通过WebSockets发送到浏览器,这意味着您将从节点的异步行为中受益。换句话说:即使给定单线程特性,这些进程也不会串行运行,而是并行运行。

对于某些背景,我运行了一个名为browserless(https://browserless.io)的服务,旨在生成基于Web的工作。我还在这里的docker上保留了一些图像:https://hub.docker.com/r/browserless/chrome/

答案 2 :(得分:0)

两者都有效但第二部分确实没有意义。原因是因为nodeJS我是单线程的。因此,即使流程工作,在一个流程中而不是在多个流程中更容易使用多个浏览器实例也会更快。最好的选择是像以前一样运行(1),只需要记住的是保持测试自包含。