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

mjs*_*mjs 7 google-chrome-devtools puppeteer

同时运行多个Puppeteer实例是否安全/受支持?

  1. 流程级别(同时多个node screenshot.js)或
  2. 在脚本级别(同时多个puppeteer.launch())?

并行处理的建议设置/限制是什么?

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

Tho*_*orf 7

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

我爬了几百万页,并且有时(在我的设置中,每10,000页左右)操纵p的人会崩溃。因此,您应该有一种自动重启浏览器并重试作业的方法。

您可能想签出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'});
});
Run Code Online (Sandbox Code Playgroud)

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

  • @Thomas 曾经遇到过“.type("text")”会在不同实例之间混淆的情况吗?我打开了几个窗口(不使用 puppeteer-cluster),当我发送 .type 命令时,它出现了,窗口之间的字符会混合在一起(用于窗口 1 的字符串部分将被输入到窗口 2 中,等等。 )。知道这一点吗?有什么技巧可以避免这个问题吗?你们的图书馆处理这种情况吗? (2认同)

bro*_*ess 5

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

在某些背景下,我运行了一个名为无浏览器的服务(https://browserless.io),旨在将基于Web的工作进行生产化。我还在这里在docker上维护了一些图像:https : //hub.docker.com/r/browserless/chrome/


小智 -2

两者都会起作用,但第二个并没有真正意义。原因是nodeJS是单线程的。因此,即使进程可以工作,在一个进程中使用多个浏览器实例也不会比在多个进程中更快或更容易。最好的选择是像以前一样运行 (1),唯一需要记住的是保持测试独立。