web-dev-qa-db-fra.com

Est-il sûr d'exécuter plusieurs instances de Puppeteer en même temps?

Est-il sûr/pris en charge d'exécuter plusieurs instances de Puppeteer en même temps, soit à

  1. le niveau du processus (plusieurs node screenshot.js en même temps) ou
  2. au niveau du script (plusieurs puppeteer.launch() en même temps)?

Quels sont les paramètres/limites recommandés pour les processus parallèles?

(Dans mes tests, (1) semble fonctionner correctement, mais je m'interroge sur la fiabilité des interactions de Puppeteer avec l'instance unique (?) De Chrome. Je n'ai pas essayé (2) mais cela semble moins susceptible de fonctionner.)

11
mjs

C'est bien d'exécuter plusieurs navigateurs, contextes ou même pages en parallèle. Les limites dépendent de votre réseau/disque/mémoire et de la configuration des tâches.

J'ai exploré quelques millions de pages et de temps en temps (dans ma configuration, chaque ~ 10 000 pages ) marionnettiste se bloque. Par conséquent, vous devez avoir un moyen de redémarrer automatiquement le navigateur et de réessayer le travail.

Vous voudrez peut-être vérifier puppteer-cluster , qui s'occupe du regroupement des instances du navigateur, du redémarrage et de la détection/redémarrage des plantages. (Avertissement: je suis l'auteur)

Un exemple de création d'un cluster est ci-dessous:

// 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'});
});

Ceci est juste un exemple minimal. Il existe de nombreuses autres façons d'utiliser le cluster.

7
Thomas Dondorf

Chaque puppeteer.launch() démarre un nouveau navigateur pour piloter votre script, il est donc préférable qu'un script interagisse avec plusieurs puppeteer.launch appels versus exécution de plusieurs instances de votre script. Même si le nœud est monothread, les événements sont envoyés via WebSockets au navigateur, ce qui signifie que vous bénéficiez du comportement asynchrone du nœud. Autrement dit: aucun de ces processus ne s'exécute en série et ne s'exécute en parallèle, même compte tenu de la nature monothread.

Pour certains antécédents, je lance un service appelé sans navigateur ( https://browserless.io ) qui vise à produire un travail sur le Web. Je maintiens également quelques images sur docker ici: https://hub.docker.com/r/browserless/chrome/

5
browserless

Les deux fonctionneront mais le second n'a pas vraiment de sens. La raison en est que nodeJS i single threaded. Ainsi, même si le processus fonctionne, il ne sera pas plus rapide ou plus facile d'utiliser plusieurs instances de navigateur dans un processus plutôt que dans plusieurs processus. La meilleure option est d'exécuter (1) comme vous l'avez fait auparavant, la seule chose dont vous devez vous souvenir est de garder les tests autonomes.

0
piro