Comment contourner les CAPTCHA avec Selenium en Python

Apprenez à contourner les CAPTCHA dans Selenium grâce à ce tutoriel complet. Découvrez des techniques pratiques pour relever les défis des CAPTCHA dans le Scraping web.
12 min de lecture
How to bypass CAPTCHAs with Selenium blog image

Dans ce tutoriel sur le contournement du CAPTCHA Selenium, vous apprendrez :

  • Ce que sont les CAPTCHA et s’ils peuvent être contournés
  • Comment contourner un CAPTCHA dans Selenium
  • Que faire si un CAPTCHA apparaît toujours

C’est parti !

Que sont les CAPTCHA et est-il possible de les contourner ?

Un CAPTCHA, abréviation de « Completely Automated Public Turing test to tell Computers and Humans Apart » (test public de Turing complètement automatisé pour distinguer les ordinateurs des humains), est un mécanisme conçu pour différencier les utilisateurs humains des robots. Il présente des défis faciles à résoudre pour les humains, mais difficiles pour les machines. Parmi les fournisseurs de CAPTCHA les plus connus, on trouve Google reCAPTCHA, hCaptcha et BotDetect.

Les types de CAPTCHA les plus courants sont les suivants :

  • Défis textuels : les utilisateurs doivent taper une séquence de lettres et de chiffres déformés.
  • Défis basés sur des images : les utilisateurs doivent identifier des objets spécifiques dans une grille d’images.
  • Défis basés sur l’audio : les utilisateurs doivent taper les mots qu’ils entendent.
  • Défis sous forme de puzzles : les utilisateurs doivent résoudre des puzzles simples, tels que naviguer dans un labyrinthe.
Text CAPTCHA example

Les CAPTCHA font souvent partie de flux utilisateur spécifiques, tels que la dernière étape d’un processus de soumission de formulaire :

captcha as a step of a form submission process example

Dans ces cas, les CAPTCHA sont là pour s’assurer que les robots ne terminent pas le flux utilisateur. Pour automatiser ces défis, vous pouvez utiliser des bibliothèques ou des services de Résolution de CAPTCHA qui s’appuient sur des opérateurs humains pour résoudre les défis en temps réel. Cependant, les CAPTCHA codés en dur sont rares en raison de leur impact négatif sur l’expérience utilisateur.

Le plus souvent, les CAPTCHA font partie de solutions anti-bots complètes, telles que les WAF (Web Application Firewall) :

Example-of-a-Web-Application-Firewall

Ces systèmes affichent dynamiquement des CAPTCHA lorsqu’ils soupçonnent une activité de bot. Dans de tels cas, les CAPTCHA peuvent être contournés en faisant en sorte que votre bot imite le comportement humain dans un navigateur réel. Cela nécessite toutefois de mettre à jour en permanence vos scripts afin de garder une longueur d’avance sur les nouvelles méthodes de détection des bots.

Une solution plus efficace pour éviter les CAPTCHA consiste à utiliser un outil de nouvelle génération tel que la fonctionnalité de Résolution de CAPTCHA de Bright Data. Cet outil cloud est toujours à jour et peut gérer pour vous un large éventail de types de CAPTCHA.

Gestion des CAPTCHA Selenium : tutoriel étape par étape

Comme vous venez de l’apprendre, un moyen efficace d’éviter les CAPTCHA consiste à faire en sorte que votre script automatisé imite le comportement humain tout en contrôlant un navigateur avec une empreinte digitale réelle. L’un des meilleurs outils à cet effet est Selenium, une bibliothèque populaire d’automatisation des navigateurs.

Dans cette section du tutoriel, vous apprendrez comment éviter les CAPTCHA dans Selenium à l’aide d’un script Python. C’est parti !

Étape n° 1 : créer un nouveau projet Python

Avant de commencer, assurez-vous que Python 3 et Chrome sont installés localement.

Si vous disposez déjà d’un script Selenium de Scraping web ou de test web, vous pouvez ignorer les trois premières étapes. Sinon, créez un dossier pour votre projet de démonstration de contournement des CAPTCHA Selenium et accédez-y dans le terminal :

mkdir selenium_demo

cd selenium_demo

Ensuite, ajoutez-y un nouvel environnement virtuel Python:

python -m venv venv

Ouvrez le dossier du projet dans votre IDE Python préféré et créez un nouveau fichier nommé script.py.

Parfait ! Le dossier de votre projet contient désormais une application Python.

Étape n° 2 : installer Selenium

Activez l’environnement virtuel Python à l’aide de la commande ci-dessous :

venvScriptsactivate

Ou, de manière équivalente, si vous êtes un utilisateur Linux ou macOS :

source venv/bin/activate

Ensuite, installez Selenium via le package pip vers selenium à l’aide de cette commande :

pip install selenium

Le processus d’installation peut prendre un certain temps, alors soyez patient.

Super ! Vous êtes prêt à initialiser votre script Selenium.

Étape n° 3 : configurez votre script Selenium

Importez Selenium en ajoutant la ligne suivante à script.py:

from selenium import webdriver

Créez maintenant un objet ChromeOptions pour configurer Chrome afin qu’il démarre en mode headless :

options = webdriver.ChromeOptions()

options.add_argument("--headless")

Si vous n’êtes pas familier avec cette option, consultez notre guide sur les navigateurs sans interface graphique pour en savoir plus.

Initialisez une instance Chrome WebDriver avec ces options, puis fermez-la avec quit(). Voici à quoi devrait ressembler votre fichier script.py actuel :

from selenium import webdriver

# configure Chrome pour démarrer en mode headless

options = webdriver.ChromeOptions()

options.add_argument("--headless")

# démarrer une instance Chrome

driver = webdriver.Chrome(options=options)

# logique d'automatisation du navigateur...

# fermer le navigateur et libérer ses ressources

driver.quit()

Le script ci-dessus lance une nouvelle instance Chrome en mode headless avant de fermer le navigateur. Génial ! Il est temps de mettre en œuvre la logique d’automatisation du navigateur.

Étape n° 4 : ajouter la logique d’automatisation du navigateur

Pour évaluer la logique de contournement du CAPTCHA Selenium, le script automatisé se connectera à bot.sannysoft.com et prendra une capture d’écran. Cette page Web spéciale exécute plusieurs tests dans le navigateur afin de déterminer si l’utilisateur est un humain ou un bot. Si vous visitez la page sur votre navigateur préféré, vous verrez que tous les tests sont réussis.

Demandez à l’instance Chrome de visiter la page cible à l’aide de la méthode get():

driver.get("https://bot.sannysoft.com/")

Ensuite, vous devez prendre une capture d’écran de la page entière. Malheureusement, Selenium ne fournit pas de fonction permettant d’y parvenir directement. Pour contourner ce problème, vous pouvez définir la fenêtre du navigateur sur la largeur et la hauteur du nœud <body>, puis prendre une capture d’écran :

# obtenir la largeur et la hauteur du corps

full_width = driver.execute_script("return document.body.parentNode.scrollWidth")

full_height = driver.execute_script("return document.body.parentNode.scrollHeight")

# définir la fenêtre du navigateur à la largeur et à la hauteur du corps

driver.set_window_size(full_width, full_height)

# prendre une capture d'écran de la page entière

driver.save_screenshot("screenshot.png")

# restaurer la taille d'origine de la fenêtre

driver.set_window_size(original_size["width"], original_size["height"])

L’astuce ci-dessus fera l’affaire, et screenshot.png contiendra la capture d’écran de la page entière.

Assemblez le tout et vous obtiendrez la logique suivante :

from selenium import webdriver

# configure Chrome pour démarrer en mode headless

options = webdriver.ChromeOptions()

options.add_argument("--headless")

# démarrer une instance Chrome

driver = webdriver.Chrome(options=options)

# se connecter à la page cible

driver.get("https://bot.sannysoft.com/")

# obtenir la taille actuelle de la fenêtre

original_size = driver.get_window_size()

# obtenir la largeur et la hauteur du corps

full_width = driver.execute_script("return document.body.parentNode.scrollWidth")

full_height = driver.execute_script("return document.body.parentNode.scrollHeight")

# définir la fenêtre du navigateur sur la largeur et la hauteur du corps

driver.set_window_size(full_width, full_height)

# prendre une capture d'écran de la page entière

driver.save_screenshot("screenshot.png")

# restaurer la taille d'origine de la fenêtre

driver.set_window_size(original_size["width"], original_size["height"])

# fermer le navigateur et libérer ses ressources

driver.quit()

Lancez le fichier script.py ci-dessus à l’aide de cette commande :

python script.py

Le script lancera une instance Chromium en mode headless, se connectera à la page souhaitée, prendra une capture d’écran et fermera le navigateur. À la fin de l’exécution du script, un fichier screenshot.png apparaîtra dans le dossier racine du projet. Ouvrez-le et vous verrez :

screenshot.png file example

Comme vous pouvez le constater grâce aux encadrés rouges, Chrome en mode headless contrôlé via Selenium vanilla ne passe pas divers tests. Cela signifie que votre script est susceptible d’être détecté comme un bot. La conséquence est qu’un site protégé par une technologie anti-bot peut afficher un CAPTCHA lorsque vous interagissez avec lui. La solution pour éviter un CAPTCHA dans Selenium ? Le plugin Stealth !

Étape n° 5 : Installez le plugin Selenium Stealth

Selenium Stealth est un package Python conçu pour rendre l’instance Chrome/Chromium contrôlée par Selenium moins détectable en tant que bot. L’objectif de ce projet est de configurer le navigateur pour contourner presque toutes les stratégies de détection de bots connues.

Plus précisément, Selenium Stealth modifie les propriétés du navigateur afin d’empêcher toute fuite qui exposerait le navigateur comme étant automatisé. Si vous êtes familier avec les solutions de contournement anti-bot, ce package peut être considéré comme une réimplémentation de Puppeteer Stealth.

Installez Selenium Stealth via le package pip selenium-stealth:

pip install selenium-stealth

Ensuite, importez la bibliothèque en ajoutant cette ligne au fichier script.py:

from selenium_stealth import stealth

Et voilà ! Il ne reste plus qu’à configurer les paramètres de furtivité.

Étape n° 6 : configurer les paramètres Stealth pour éviter les CAPTCHA

Pour enregistrer Selenium Stealth et configurer Chrome WebDriver afin d’éviter les CAPTCHA, appelez la fonction stealth() comme suit :

stealth(

driver,

user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",

languages=["en-US", "en"],

vendor="Google Inc.",

platform="Win32",

webgl_vendor="Intel Inc.",

renderer="Intel Iris OpenGL Engine",

fix_hairline=True,

)

Configurez les arguments de la fonction comme vous le souhaitez, mais gardez à l’esprit que les valeurs ci-dessus sont suffisantes pour contourner la plupart des mesures anti-bot.

Bravo ! Le navigateur contrôlé par Selenium apparaîtra désormais comme un navigateur réel utilisé par un utilisateur humain.

Étape n° 7 : répétez le test de détection des bots

Voici le fichier script.js final :

from selenium import webdriver

from selenium_stealth import stealth

# configure Chrome pour démarrer en mode headless

options = webdriver.ChromeOptions()

options.add_argument("--headless")

# démarrer une instance Chrome

driver = webdriver.Chrome(options=options)

# configurer le WebDriver pour éviter la détection des bots

# avec Selenium Stealth

stealth(

driver,

user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",

languages=["en-US", "en"],

vendor="Google Inc.",

platform="Win32",

webgl_vendor="Intel Inc.",

renderer="Intel Iris OpenGL Engine",

fix_hairline=True,

)

# connexion à la page cible

driver.get("https://bot.sannysoft.com/")

# obtention de la taille actuelle de la fenêtre

original_size = driver.get_window_size()

# obtenir la largeur et la hauteur du corps

full_width = driver.execute_script("return document.body.parentNode.scrollWidth")

full_height = driver.execute_script("return document.body.parentNode.scrollHeight")

# définir la fenêtre du navigateur sur la largeur et la hauteur du corps

driver.set_window_size(full_width, full_height)

# prendre une capture d'écran de la page entière

driver.save_screenshot("screenshot.png")

# restaurer la taille d'origine de la fenêtre

driver.set_window_size(original_size["width"], original_size["height"])

# fermer le navigateur et libérer ses ressources

driver.quit()

Exécutez à nouveau le script Python Selenium pour contourner le CAPTCHA :

python script.py

Jetez un œil à screenshot.png, et vous remarquerez que tous les tests de détection de bot ont été réussis :

All bot detection tests passed on the new screenshot.png

Et voilà ! Vous connaissez désormais l’astuce pour contourner les CAPTCHA anti-bots dans Selenium.

Que faire si la solution Selenium pour contourner le CAPTCHA ci-dessus ne fonctionne pas

Malheureusement, les paramètres du navigateur ne sont pas le seul aspect sur lequel se concentrent les solutions anti-bots. La réputation IP est un autre aspect clé, et vous ne pouvez pas simplement changer votre IP pour une autre plus fiable à l’aide d’une bibliothèque gratuite. Cela nécessite l’intégration d’un Proxy Selenium!

En d’autres termes, même si vous configurez votre navigateur de manière optimale, les CAPTCHA peuvent toujours apparaître. Pour les CAPTCHA simples qui ne nécessitent qu’un seul clic, vous pouvez essayer d’utiliser des paquets tels que selenium-recaptcha-solver ou selenium-recptcha. Cependant, ces bibliothèques ne fonctionnent qu’avec reCAPTCHA v2 et ne sont plus maintenues.

Le principal problème avec l’approche du chapitre précédent et ces paquets est qu’ils ne fonctionnent qu’avec les CAPTCHAs de base. Lorsque vous avez affaire à des systèmes anti-bot plus complexes comme Cloudflare, vous avez besoin d’une solution beaucoup plus puissante.

Vous recherchez une véritable solution CAPTCHA Selenium ? Essayez les solutions de Scraping web de Bright Data !

Celles-ci offrent des capacités de déverrouillage supérieures avec une fonctionnalité dédiée à la Résolution de CAPTCHA pour gérer automatiquement reCAPTCHA, hCaptcha, px_captcha, SimpleCaptcha, GeeTest CAPTCHA, FunCaptcha, Cloudflare Turnstile, AWS WAF Captcha, KeyCAPTCHA et bien d’autres.

L’intégration du CAPTCHA Solver de Bright Data dans votre script est facile, car il fonctionne avec n’importe quel client HTTP ou outil d’automatisation de navigateur, y compris Selenium.

Découvrez comment utiliser le CAPTCHA Solver de Bright Data et consultez la documentation pour obtenir tous les détails de configuration.

Conclusion

Dans cet article, vous avez vu pourquoi les CAPTCHA constituent un défi pour les logiciels automatisés et comment les contourner dans Selenium. Grâce à la bibliothèque Selenium Stealth, vous pouvez remplacer les configurations par défaut de Chrome afin de limiter la détection des bots. Cependant, cette approche n’est pas une solution définitive.

Quelle que soit la sophistication de votre logique de contournement des CAPTCHA Selenium, les outils avancés de détection des bots pourront toujours vous bloquer. La véritable solution consiste à se connecter au site cible via une API de déblocage capable de renvoyer le code HTML sans CAPTCHA de n’importe quelle page web.

Cette API n’est pas un rêve. Elle existe et s’appelle Web Unlocker, une API de scraping qui fait automatiquement tourner votre IP de sortie à chaque requête via l’intégration d’un Proxy et gère pour vous l’empreinte digitale du navigateur, les réessais automatiques et la résolution des CAPTCHA. Gérer les CAPTCHA n’a jamais été aussi facile !

Inscrivez-vous dès maintenant et commencez votre essai gratuit.