Évitez de vous retrouver bloqué avec Puppeteer Stealth

Apprenez à intégrer Puppeteer Stealth dans un script de scraping Puppeteer pour éviter de vous faire bloquer.
9 min read
Avoid Getting Blocked With Puppeteer Stealth

Ce tutoriel Puppeteer Stealth couvrira les points suivants :

  • Qu’est-ce que la détection de bots et pourquoi cela constitue-t-il un problème pour Puppeteer ?
  • Qu’est-ce que Puppeteer Extra ?
  • Comment utiliser le plugin Puppeteer Extra Stealth pour éviter les blocages ?

La détection de bots : le plus grand ennemi de Puppeteer

Puppeteer est l’une des bibliothèques JavaScript les plus utilisées pour l’automatisation des navigateurs. Il est particulièrement populaire parce qu’il bénéficie du soutien de l’équipe Chrome de Google. Son API de haut niveau vous permet de contrôler les navigateurs avec ou sans tête sur le protocole DevTools, ce qui en fait un excellent outil pour le web scraping, les tests automatisés et le développement de bots.

Cependant, Puppeteer peut facilement être mis en défaut par les technologies de détection de bots. Cela est particulièrement vrai en cas d’utilisation de Chrome/Chromium en mode sans tête. Pourquoi ? Parce que Puppeteer définit automatiquement des en-têtes et des propriétés et par défaut qui montrent que le navigateur utilisé est une instance sans tête. Par exemple, il définit le paramètre Chrome suivant : navigator.webdriver: true<.code>.

Les solutions anti-bot savent cela et analysent ces paramètres pour déterminer si l’utilisateur actuel est un humain ou un bot. Lorsqu’ils identifient des configurations suspectes, ils marquent l’utilisateur comme un bot.

Par exemple, considérons ce test de détection de bot en mode sans tête. Si vous ouvrez la page de test dans votre navigateur, vous verrez ceci :

 Si vous ouvrez la page de test dans votre navigateur, vous verrez que vous n’êtes pas reconnu comme utilisant Chrome sans tête

Maintenant, essayez de visiter ce site avec la version ordinaire de Puppeteer et d’en tirer le résultat du test :

import puppeteer from "puppeteer"

(async () => {
    // set up the browser and launch it
    const browser = await puppeteer.launch()

    // open a new blank page
    const page = await browser.newPage()

    // navigate the page to the target page
    await page.goto("https://arh.antoinevastel.com/bots/areyouheadless")

    // extract the message of the test result
    const resultElement = await page.$("#res")
    const message = await resultElement.evaluate(e => e.textContent)

    // print the resulting message
    console.log(`The result of the test is "%s"`, message);

    // close the current browser session
    await browser.close()
})()

Lancez le script ci-dessus, et vous verrez ceci :

The result of the test is "You are Chrome headless"

Cela signifie que le test a échoué, car la page a pu détecter que la requête automatique provenait d’un navigateur sans tête.

Par défaut, Puppeteer est un outil limité. Pour éviter la détection de bots avec Puppeteer, vous devrez faire des modifications manuelles de manière à outrepasser les configurations par défaut. Pour éviter tout cela, utilisez Puppeteer Extra.

Puppeteer Extra : une version extensible de Puppeteer

Puppeteer Extra est un wrapper léger construit autour de Puppeteer et qui en constitue un prolongement en permettant la prise en charge de plugins. En d’autres termes, puppeteer-extra est une solution de rechange prête à l’emploi pour Puppeteer. Puppeteer Extra fonctionne non seulement comme la bibliothèque bien connue d’automatisation de navigateur, mais bénéficie également de la méthode use() pour enregistrer des plugins.

Chaque plugin ajoute des fonctionnalités supplémentaires à Puppeteer. Certains des plugins disponibles les plus utiles sont :

  • puppeteer-extra-plugin-stealth : pour rendre plus difficile la détection d’instances de navigateur sans tête par la technologie de détection de bots.
  • puppeteer-extra-plugin-recaptcha : pour résoudre les reCAPTCHA et les hCaptcha automatiquement.
  • puppeteer-extra-plugin-adblocker : pour supprimer les publicités et les trackers, afin de réduire la bande passante et les temps de chargement.
  • puppeteer-extra-plugin-devtools : pour rendre le débogage de navigateur possible de n’importe quel emplacement en créant un tunnel sécurisé vers DevTools.
  • puppeteer-extra-plugin-repl : pour améliorer l’expérience de débogage grâce à une interface REPL (Read-Eval-Print-Loop) interactive.
  • puppeteer-extra-plugin-block-resources : pour bloquer dynamiquement les ressources de pages telles que les images, les médias, les fichiers CSS et JS.
  • puppeteer-extra-plugin-anonymize-ua : pour anonymiser l’en-tête d’agent utilisateur lors de la navigation. Découvrez pourquoi cela est important dans notre guide Agent utilisateur pour le web scraping.
  • puppeteer-extra-plugin-user-preferences : pour définir des préférences utilisateur Chrome/Chromium personnalisées.

Parlons maintenant plus en détail du plugin Puppeteer Stealth.

Qu’est-ce que le plugin Puppeteer Extra Stealth et que fait-il ?

puppeteer-extra-plugin-Stealth est un plugin pour Puppeteer Extra ; il inclut un ensemble de configurations permettant d’éviter la détection de bots. Plus précisément, Puppeteer Stealth s’appuie sur des modules d’évasion intégrés qui outrepassent les fuites de Puppeteer et les propriétés qui l’exposent en tant que bot. Par exemple, il supprime “HeadlessChrome” de l’en-tête d’agent utilisateur et supprime la propriété navigator.webdriver définie par défaut par Puppeteer.

Le but du plugin Puppeteer Extra Stealth est de permettre à une instance Chromium sans tête contrôlée par Puppeteer de passer tous les tests de détection de bots sur sannysoft.com. À l’heure où nous écrivons ces lignes, cela fonctionne. Cependant, comme l’indique sa documentation officielle, il existe encore des moyens de détecter Chromium sans tête. Cela signifie qu’il est impossible de contourner tous les mécanismes de détection des bots ; mais l’idée du projet est de rendre ce processus aussi difficile que possible.

Comment utiliser Puppeteer Stealth pour éviter la détection de bot lors de vos activités de web scraping

Il est maintenant temps de découvrir comment intégrer Puppeteer Stealth dans un script de scraping puppeteer de manière à éviter de vous faire bloquer.

Suivez les étapes ci-dessous !

Étape 1 : Installez Puppeteer Extra et le plugin Stealth

Lancez la commande ci-dessous pour ajouter Puppeteer Extra et le plugin Puppeteer Stealth aux dépendances de votre projet :

npm install puppeteer-extra puppeteer-extra-plugin-stealth

Bien ! Vous venez de réaliser la première étape nécessaire pour intégrer le plugin Stealth dans votre script automatisé Puppeteer.

Étape 2 : Configurez Puppeteer Extra et enregistrez le plugin Stealth

Tout d’abord, remplacez l’instruction d’importation puppeteer par cette instruction :

import puppeteer from "puppeteer-extra"

En d’autres termes, assurez-vous d’importer l’objet puppeteer à partir de "puppeteer-extra``" et non de "puppeteer``".

Ensuite, importez StealthPlugin depuis puppeteer-extra-plugin-stealth :

import StealthPlugin from "puppeteer-extra-plugin-stealth"

Si vous utilisez plutôt CommonJS, voici ce qu’il vous faut :

const puppeteer = require("puppeteer-extra")
const StealthPlugin = require("puppeteer-extra-plugin-stealth")

Ensuite, enregistrez le plugin Stealth en le passant à l’objet puppeteer via la méthode use() :

puppeteer.use(StealthPlugin())

Parfait ! Vous venez d’ajouter à Puppeteer les capacités d’évasion par défaut prises en charge par le plugin.

Notez que le constructeur StealthPlugin() accepte un objet optionnel avec l’ensemble de chaînes correspondant aux évasions à activer :

// enable only a few evasion techniques
puppeteer.use(StealthPlugin({
    enabledEvasions: new Set(["chrome.app", "chrome.csi", "defaultArgs", "navigator.plugins"])
}))

Vous pouvez également utiliser la logique ci-dessous pour supprimer dynamiquement une stratégie d’évasion spécifique du plugin Stealth :

const stealthPlugin = StealthPlugin()
puppeteer.use(stealthPlugin)

// ...

// remove the "user-agent-override" evasion method
pluginStealth.enabledEvasions.delete("user-agent-override")

Étape 3 : Au final

Intégrez Puppeteer Extra et son plugin Stealth dans le script que vous avez vu au début de l’article :

import puppeteer from "puppeteer-extra"
import StealthPlugin from "puppeteer-extra-plugin-stealth"

(async () => {
    // configure the stealth plugin
    puppeteer.use(StealthPlugin())
    // set up the browser and launch it
    const browser = await puppeteer.launch()

    // open a new blank page
    const page = await browser.newPage()

    // navigate the page to the target page
    await page.goto("https://arh.antoinevastel.com/bots/areyouheadless")

    // extract the message of the test result
    const resultElement = await page.$("#res")
    const message = await resultElement.evaluate(e => e.textContent)

    // print the resulting message
    console.log(`The result of the test is "%s"`, message);

    // close the current browser session
    await browser.close()
})()

Exécutez ce code, et vous verrez alors s’afficher :

The result of the test is "You are not Chrome headless"

Et voilà ! La page, malgré ses capacités de détection de bot, ne peut plus identifier votre script automatisé Puppeteer comme un bot.

Bravo ! Vous êtes maintenant un expert en Puppeteer Stealth, et aucune technologie de détection de bot ne vous effraiera plus.

Conclusion

Dans cet article, vous avez compris pourquoi la détection des bots constitue un problème pour Puppeteer, et vous avez appris à surmonter cette difficulté. Grâce à Puppeteer Extra, vous pouvez étendre les fonctionnalités de Puppeteer grâce à des plugins. En particulier, le plugin Stealth est un excellent outil pour éviter la détection de bots, et vous avez appris à l’utiliser ici.

Quelle que soit la sophistication de votre Puppeteer Extra, les technologies anti-bot avancées comme CloudFlare resteront capables de repérer et de bloquer vos scripts. Vous pouvez opter pour un autre package d’automatisation de navigateur, mais la raison pour laquelle vous vous faites détecter tient au navigateur lui-même, pas à une bibliothèque. La solution est un navigateur évolutif, avec une fonctionnalité de contournement des algorithmes anti-bot pouvant être intégrée à n’importe quelle bibliothèque d’automatisation de navigateur. Ce navigateur existe et s’appelle Scraping Browser !

Le Scraping Browser de Bright Data est un navigateur cloud hautement évolutif, compatible avec Puppeteer, Playwright et Selenium, pour ne citer qu’eux. Il assure la rotation automatique des adresses IP en sortie à chaque requête et permet de gérer pour vous les empreintes de navigateur, la résolution de CAPTCHA et l’itération automatique de nouvelles tentatives. Cela est rendu possible par les fonctionnalités de déblocage basées sur proxys auxquelles il recourt.

Les proxys de Bright Data sont utilisés par des sociétés figurant dans le classement Fortune 500, ainsi que par plus de 20 millions d’autres clients. Vous pouvez compter sur ce réseau mondial de proxys, qui comprend :

Adressez-vous à l’un de nos représentants commerciaux pour découvrir lequel des produits Bright Data répond le mieux à vos besoins.