Apprendre à contourner la détection de Cloudflare avec le meilleur navigateur Selenium

Mihnea-Octavian Manolache le 02 mai 2023

blog-image

De nos jours, le web scraping est devenu un véritable défi. Si vous avez déjà construit un scraper web avec un navigateur sans tête, vous avez certainement rencontré des systèmes anti-bots. Contourner cloudflare, datadome ou tout autre fournisseur d'anti-bots n'est pas une tâche facile. Il faut d'abord réfléchir à des stratégies d'évasion, puis les mettre en œuvre en production. Et même dans ce cas, il peut y avoir des scénarios que vous n'avez pas pris en compte.

Pourtant, sans une mise en œuvre minimale de ces techniques d'évasion, vos chances de vous faire prendre et bloquer sont très élevées. C'est pourquoi le sujet de l'article d'aujourd'hui est de savoir comment contourner la détection de Cloudflare. La plupart des techniques dont nous allons parler s'appliquent également à d'autres fournisseurs de détection. À titre de référence, nous nous concentrerons sur Selenium pour voir si nous pouvons le rendre furtif. Tout au long de l'article, je discuterai, entre autres, de ce qui suit :

  • Méthodes de détection des robots
  • Techniques générales de contournement des robots
  • Evasions avancées pour Selenium

Comment Cloudflare détecte-t-il les navigateurs sans tête ?

Cloudflare est une entreprise technologique dotée d'un réseau gigantesque. Elle se concentre sur des services tels que CDN, DNS et divers systèmes de sécurité en ligne. Son Web Application Firewall est généralement conçu pour protéger contre les attaques telles que le DDoS ou le cross site scripting. Ces dernières années, Cloudflare et d'autres fournisseurs dans ce domaine ont introduit des systèmes d'empreintes digitales, capables de détecter les navigateurs sans tête. Comme on peut s'en douter, Selenium est l'un des premiers à être touché par ces techniques. Et comme l'industrie du web scraping s'appuie fortement sur cette technologie, les scrapers sont eux aussi directement touchés.

Avant de passer aux techniques anti-bot, je pense qu'il est important de discuter de la façon dont cloudflare détecte Selenium. Le système peut être très complexe. Par exemple, il y a des propriétés dans un navigateur qui manquent à un pilote web. L'interface `navigator` d'un navigateur a même une propriété appelée `webdriver` qui indique si un navigateur est contrôlé par une automatisation. C'est un signe qui ne trompe pas. Si vous voulez l'expérimenter :

  • Ouvrez les outils de développement de votre navigateur
  • Accéder à la console
  • Tapez la commande suivante : `navigator.webdriver`

Dans votre cas, il devrait retourner `false`. Mais si vous essayez avec Puppeteer ou Selenium, vous obtiendrez `true`. Si vous vous demandez comment Cloudflare s'y prend pour détecter les bots, c'est assez simple. Tout ce qu'ils ont à faire est d'injecter un script comme celui ci-dessous sur le site web de leur partenaire :

// detection-script.js

const webdriver = navigator.webdriver

// If webdriver returns true, display a reCaptcha

// In this example, I am transferring the user to a Cloudflare challenge page.

// But you get the idea

if ( webdriver ) location.replace('https://cloudflarechallenge.com')

Bien entendu, dans la réalité, ces fournisseurs utilisent bien d'autres niveaux de détection. Même la taille de l'écran, la disposition du clavier ou les plugins utilisés par les navigateurs sont utilisés pour identifier spécifiquement un navigateur. Si vous souhaitez savoir comment fonctionne la détection sans navigateur, jetez un coup d'œil à mon test simple de travailleur de service. Et ce n'est que si vous vous en tenez au navigateur. Vous pouvez également détecter l'activité d'un robot en examinant l'adresse IP d'où provient la requête. Par exemple, si vous utilisez des adresses IP de centres de données, vos chances d'être bloqué augmentent à chaque requête. C'est pourquoi il est recommandé d'utiliser des proxys résidentiels ou des proxys de fournisseurs d'accès à Internet lorsque vous créez un scraper web.

Comment contourner Cloudflare avec Selenium

Heureusement, la communauté du web scraping est très active. Et parce qu'il y a une telle demande pour contourner Cloudflare et d'autres fournisseurs anti-bots, il existe des solutions open source dans ce domaine. De grandes choses peuvent être réalisées lorsque les communautés de programmation travaillent ensemble ! Pour aller de l'avant, je suggère de suivre les étapes suivantes :

  1. Exécutez quelques tests pour voir si Selenium par défaut peut contourner Cloudflare.
  2. Ajouter quelques évasions supplémentaires pour rendre nos scripts plus furtifs

Commençons donc par la première étape :

#1 : Selenium par défaut peut-il contourner Cloudflare ?

Je ne suis pas du genre à faire des suppositions. D'autant plus que nous ne savons pas exactement comment fonctionnent les systèmes de Cloudflare. Ils utilisent toutes sortes d'obscurcissements dans leur code, ce qui rend plus difficile la rétro-ingénierie. C'est pourquoi, tout au long de mon expérience de développeur, j'ai appris que les tests sont le meilleur moyen de comprendre le fonctionnement d'un système. Construisons donc un scraper basique et voyons comment il se comporte sur une cible réelle, protégée par Cloudflare.

1.1. Mise en place de l'environnement

Avec Python, il est préférable d'isoler nos projets dans un seul répertoire. Créons donc un nouveau dossier, ouvrons une fenêtre de terminal et naviguons-y :

# Créer un nouvel environnement virtuel et l'activer

~ " python3 -m venv env && source env/bin/activate

# Installer les dépendances

~ " python3 -m pip install selenium

# Créer un nouveau fichier .py et ouvrir le projet dans votre IDE

~ " touch app.py && code .

1.2. Construire un scraper web simple avec Selenium

Maintenant que vous avez réussi à mettre en place votre projet, il est temps d'ajouter du code. Nous n'allons pas construire quelque chose de sophistiqué ici. Nous avons juste besoin de ce script à des fins de test. Si vous voulez en savoir plus sur le scraping avancé, consultez ce tutoriel [LIEN] sur Pyppeteer.

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

# Configurer Chrome pour qu'il s'ouvre en mode headless

options = Options()

options.headless = True

# Créer une nouvelle instance de Chrome et naviguer vers la cible

driver = webdriver.Chrome(options=options)

driver.get('https://www.snipesusa.com/')

# Laissez-lui le temps de se charger

time.sleep(10)

# Faites une capture d'écran de la page

driver.get_screenshot_as_file('screenshot.png')

# Fermez le navigateur

driver.quit()

Maintenant, regardez la capture d'écran. Voici ce que j'ai obtenu :

blog-image

Je pense que nous pouvons conclure que le test a échoué. Le site web ciblé est protégé par Cloudflare et comme vous pouvez le voir, nous sommes bloqués. Par défaut, Selenium n'est donc pas en mesure de contourner Cloudflare. Je ne vais pas aller en profondeur et vérifier avec d'autres fournisseurs de détection de bots. Si vous voulez tester plus avant, voici quelques cibles et leurs fournisseurs :

blog-image

#2 : Le selenium furtif peut-il contourner Cloudflare ?

Tout d'abord, permettez-moi de clarifier les termes. Par "Selenium furtif", j'entends une version de Selenium qui peut passer inaperçue et contourner Cloudflare. Je ne fais pas référence à une technique de furtivité spécifique. Il y a plusieurs façons d'implémenter des techniques d'évasion dans Selenium. Il existe des paquets qui s'en chargent, ou vous pouvez utiliser `execute_cdp_cmd` pour interagir directement avec l'API de Chrome. Cette dernière solution vous donne plus de contrôle mais nécessite plus de travail. Voici un exemple de la façon dont vous pourriez l'utiliser pour changer la valeur de l'agent utilisateur :

driver.execute_cdp_cmd('Emulation.setUserAgentOverride', {

"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36",

"platform": "Win32",

"acceptLanguage":"ro-RO"

})

Mais il faut passer par la CDP et identifier les API qui permettent d'effectuer tous les changements nécessaires. Pour l'instant, testons quelques paquets.

1.1. Sélénium furtif

Il existe au moins deux paquets que vous pouvez utiliser pour rendre Selenium furtif. Jusqu'à présent, aucun d'entre eux n'est garanti pour contourner Cloudflare. Encore une fois, nous devons tester et voir si l'un d'entre eux fonctionne. Tout d'abord, regardons `selenium-stealth`. Ce paquet est une enveloppe autour de `puppeteer-extra-plugin-stealth`, rendant possible l'utilisation des évasions de Puppeteer avec Selenium de Python. Pour l'utiliser, vous devez d'abord l'installer. Ouvrez une fenêtre de terminal et entrez cette commande :

# Installer selenium-stealth

~ " python3 -m pip install selenium-stealth

Tout est prêt. Nous pouvons l'utiliser pour rendre notre précédent scraper plus furtif :

from selenium import webdriver

from selenium.webdriver.chrome.options import Options

from selenium_stealth import stealth

import time

# Configurer Chrome pour qu'il s'ouvre en mode headless

options = Options()

options.headless = True

# Créer une nouvelle instance de Chrome

driver = webdriver.Chrome(options=options)

# Appliquer la furtivité à votre webdriver

stealth(driver,

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

vendor="Google Inc.",

platform="Win32",

webgl_vendor="Intel Inc.",

renderer="Intel Iris OpenGL Engine",

fix_hairline=True,

)

# Naviguer vers la cible

driver.get('https://www.snipesusa.com/')

# Laissez-lui le temps de se charger

time.sleep(10)

# Faites une capture d'écran de la page

driver.get_screenshot_as_file('stealth.png')

# Fermez le navigateur

driver.quit()

L'exécution du script m'a permis d'obtenir des résultats différents de ceux obtenus avec les paramètres par défaut de Selenium :

blog-image

La seconde option que vous pouvez utiliser est `undetected_chromedriver`. Celle-ci est décrite comme un "pilote chromé Selenium optimisé". Testons-le :

# Installer undetected_chromedriver

~ " python3 -m pip install undetected_chromedriver

Le code est très similaire à notre script par défaut. La principale différence réside dans le nom du paquet. Voici un scraper basique avec `undetected_chromedriver` et voyons s'il peut contourner Cloudflare :

import undetected_chromedriver as uc

import time

# Configurer Chrome pour qu'il s'ouvre en mode headless

options = uc.ChromeOptions()

options.headless = True

# Créer une nouvelle instance de Chrome et maximiser la fenêtre

driver = uc.Chrome(options=options, executable_path='/Applications/Google Chrome.app/Contents/MacOS/Google Chrome')

driver.maximize_window()

# Naviguer vers la cible

driver.get('https://www.snipesusa.com/')

# Laisser du temps pour le chargement

time.sleep(10)

# Faire une capture d'écran de la page

driver.get_screenshot_as_file('stealth-uc.png')

# Fermer le navigateur

driver.quit()

Une fois de plus, l'exécution du script s'est avérée positive pour moi. Il semble qu'au moins ces deux paquets puissent contourner avec succès la protection de Cloudflare. Du moins à court terme. À vrai dire, il y a de fortes chances que si vous utilisez ces scripts de manière intensive, Cloudflare s'apercevra de votre adresse IP et la bloquera. Laissez-moi donc vous présenter une troisième option : L'API de récupération de données sur le web.

1.2. Selenium avec l'API Web Scraping

L'API Web Scraping dispose d'une fonctionnalité étonnante appelée Proxy Mode. Vous pouvez en savoir plus ici. Mais ce que je veux noter ici, c'est que notre Proxy Mode peut être intégré avec succès à Selenium. De cette façon, vous avez accès à toutes les fonctionnalités d'évasion que nous avons mises en œuvre. Et laissez-moi vous dire que nous avons une équipe dédiée qui travaille sur des techniques d'évasion personnalisées. En termes techniques, nous gérons des rotations d'IP, nous utilisons divers proxys, nous résolvons des captchas et nous utilisons l'API de Chrome pour changer continuellement notre empreinte digitale. En termes non techniques, cela se traduit par moins de tracas pour vous et un taux de réussite plus élevé. En fait, vous obtenez la version la plus furtive de Selenium qui soit. Voici comment procéder :

# Installer selenium-wire

~ " python3 -m pip install selenium-wire

Nous utilisons `selenium-wire` afin d'utiliser Selenium avec un proxy. Voici maintenant le script :

from seleniumwire import webdriver

import time

# Method to encode parameters

def get_params(object):

params = ''

for key,value in object.items():

if list(object).index(key) < len(object) - 1:

params += f"{key}={value}."

else:

params += f"{key}={value}"

return params

# Your WSA API key

API_KEY = '<YOUR_API_KEY>'

# Default proxy mode parameters

PARAMETERS = {

"proxy_type":"datacenter",

"device":"desktop",

"render_js":1

}

# Set Selenium to use a proxy

options = {

'proxy': {

"http": f"http://webscrapingapi.{ get_params(PARAMETERS) }:{ API_KEY }@proxy.webscrapingapi.com:80",

}

}

# Create a new Chrome instance

driver = webdriver.Chrome(seleniumwire_options=options)

# Navigate to target

driver.get('https://www.httpbin.org/get')

# Retrieve the HTML documeent from the page

html = driver.page_source

print(html)

# Close browser

driver.quit()

Si vous exécutez ce script plusieurs fois, vous verrez que l'adresse IP change à chaque fois. C'est notre système de rotation des adresses IP. En arrière-plan, il ajoute également des techniques d'évasion. Vous n'avez même pas à vous en préoccuper. Nous nous occupons du contournement de Cloudflare pour que vous puissiez vous concentrer sur l'analyse des données.

Conclusions

Si vous souhaitez créer un scraper capable de contourner Cloudflare, vous devez prendre en compte un grand nombre de facteurs. Une équipe spécialisée peut travailler 24 heures sur 24, 7 jours sur 7, mais il n'y a toujours aucune garantie que les contournements fonctionneront à chaque fois. En effet, à chaque version du navigateur, il est possible que de nouvelles fonctionnalités soient ajoutées à l'API. Et certaines de ces fonctionnalités peuvent être utilisées pour prendre les empreintes digitales et détecter les robots.

Je dirais même que le meilleur navigateur pour contourner Cloudflare et d'autres fournisseurs est celui que vous construisez vous-même. Et nous en avons construit un chez Web Scraping API. Nous le partageons maintenant avec vous. Alors, bon raclage !

Nouvelles et mises à jour

Restez au courant des derniers guides et nouvelles sur le web scraping en vous inscrivant à notre lettre d'information.

We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Articles connexes

vignette
GuidesSERP Scraping API - Guide de démarrage

Collectez sans effort des données en temps réel à partir des moteurs de recherche à l'aide de l'API SERP Scraping. Améliorez vos analyses de marché, votre référencement et vos recherches thématiques en toute simplicité. Commencez dès aujourd'hui !

WebscrapingAPI
avatar de l'auteur
WebscrapingAPI
7 minutes de lecture
vignette
GuidesComment récupérer les données des produits Amazon : Un guide complet des meilleures pratiques et des outils

Explorez les complexités du scraping des données de produits Amazon avec notre guide approfondi. Des meilleures pratiques aux outils tels que l'API Amazon Scraper, en passant par les considérations juridiques, apprenez à relever les défis, à contourner les CAPTCHA et à extraire efficacement des informations précieuses.

Suciu Dan
avatar de l'auteur
Suciu Dan
15 minutes de lecture
vignette
GuidesDébloquez les sites web et protégez votre identité avec les proxies et Axios Node.js

Apprenez à utiliser les proxys avec Axios et Node.js pour un web scraping efficace. Conseils, exemples de code et avantages de l'utilisation de WebScrapingAPI inclus.

Suciu Dan
avatar de l'auteur
Suciu Dan
7 minutes de lecture