Retour au blog

Comment contourner la détection de Cloudflare en utilisant un proxy

Cloudflare bloque vos requêtes via un proxy ? Nous examinons les méthodes techniques pour contourner la détection : de la configuration correcte de TLS à l'utilisation de navigateurs sans interface avec des exemples concrets.

📅17 décembre 2025
```html

7 méthodes éprouvées pour contourner la détection de Cloudflare lors de l'utilisation de proxies

Cloudflare traite plus de 20 % de tout le trafic web et utilise un système de protection multi-niveaux contre les bots. Lors de l'utilisation de serveurs proxy, la probabilité de recevoir un captcha ou d'être bloqué augmente considérablement. Dans ce guide, nous examinerons les aspects techniques de la détection et les méthodes pratiques de contournement qui fonctionnent en 2024.

Comment Cloudflare identifie les proxies et les bots

Cloudflare utilise un système d'analyse complexe qui vérifie des dizaines de paramètres pour chaque requête. Comprendre les mécanismes de détection est la première étape pour contourner avec succès la protection.

Principales méthodes de détection

Fingerprinting TLS : Cloudflare analyse les paramètres de la poignée de main SSL/TLS (suites de chiffrement, extensions, ordre de leur apparition). Chaque client HTTP a une "empreinte" unique. Par exemple, Python requests utilise OpenSSL avec un ensemble de chiffrements caractéristiques, facilement distinguable de Chrome ou Firefox.

Lors de l'analyse d'une requête, Cloudflare associe le fingerprint TLS au User-Agent déclaré. Si vous spécifiez Chrome 120, mais que les paramètres TLS correspondent à Python requests, cela entraîne une détection instantanée du bot.

Paramètre de vérification Ce qui est analysé Risque de détection
Fingerprint TLS Suites de chiffrement, extensions, version TLS Élevé
Fingerprint HTTP/2 Ordre des en-têtes, frames SETTINGS Élevé
Réputation IP Historique IP, appartenance à des centres de données Moyenne
Défi JavaScript Exécution JS, fingerprint canvas, WebGL Élevé
Analyse comportementale Modèles de requêtes, timing, mouvements de souris Moyenne

Depuis 2023, Cloudflare utilise activement l'apprentissage automatique pour analyser les modèles comportementaux. Le système suit non seulement les paramètres techniques, mais aussi les intervalles de temps entre les requêtes, la séquence des actions de l'utilisateur, les mouvements de la souris et le défilement de la page.

Masquage du fingerprint TLS

Le fingerprinting TLS est la méthode de détection de bots la plus efficace. Les clients HTTP standard (requests, curl, axios) créent un fingerprint qui ne peut pas être confondu avec un véritable navigateur. La solution consiste à utiliser des bibliothèques spécialisées qui imitent le comportement TLS des navigateurs.

Utilisation de curl-impersonate

La bibliothèque curl-impersonate est une version modifiée de curl qui copie exactement les fingerprints TLS et HTTP/2 des navigateurs populaires. Elle prend en charge Chrome, Firefox, Safari et Edge.

# Installation de curl-impersonate
git clone https://github.com/lwthiker/curl-impersonate
cd curl-impersonate
make chrome-build

# Utilisation avec imitation de Chrome 120
curl_chrome120 -x http://username:password@proxy.example.com:8080 \
  -H "Accept-Language: en-US,en;q=0.9" \
  https://example.com

Python : bibliothèque tls-client

Pour Python, il existe un wrapper tls-client qui utilise curl-impersonate en arrière-plan et fournit une interface similaire à requests.

import tls_client

# Création d'une session avec fingerprint Chrome 120
session = tls_client.Session(
    client_identifier="chrome_120",
    random_tls_extension_order=True
)

# Configuration du proxy
proxies = {
    'http': 'http://username:password@proxy.example.com:8080',
    'https': 'http://username:password@proxy.example.com:8080'
}

# Exécution de la requête
response = session.get(
    'https://example.com',
    proxies=proxies,
    headers={
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language': 'en-US,en;q=0.9',
        'Accept-Encoding': 'gzip, deflate, br',
        'DNT': '1',
        'Connection': 'keep-alive',
        'Upgrade-Insecure-Requests': '1'
    }
)

print(response.status_code)

Important : Lors de l'utilisation de tls-client, il est crucial que le User-Agent dans les en-têtes corresponde au client_identifier choisi. Un non-respect entraînera une détection immédiate.

Vérification du fingerprint TLS

Avant de commencer le scraping, il est recommandé de vérifier votre fingerprint TLS. Utilisez les services tls.peet.ws ou ja3er.com pour l'analyse.

# Vérification du fingerprint
response = session.get('https://tls.peet.ws/api/all')
print(response.json()['tls']['ja3'])

# Comparez avec le fingerprint d'un vrai Chrome :
# https://kawayiyi.com/tls-fingerprint-database/

Configuration correcte des en-têtes HTTP

Même avec un fingerprint TLS correct, des en-têtes HTTP incorrects trahiront un bot. Cloudflare analyse non seulement la présence des en-têtes, mais aussi leur ordre, le format des valeurs et la cohérence logique.

En-têtes obligatoires pour Chrome

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.9',
    'Accept-Encoding': 'gzip, deflate, br',
    'DNT': '1',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1',
    'Sec-Fetch-Dest': 'document',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-Site': 'none',
    'Sec-Fetch-User': '?1',
    'Sec-Ch-Ua': '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
    'Sec-Ch-Ua-Mobile': '?0',
    'Sec-Ch-Ua-Platform': '"Windows"',
    'Cache-Control': 'max-age=0'
}

Les en-têtes Sec-Ch-Ua-* sont apparus dans Chrome 89 et font partie de l'API Client Hints. Leur absence lors de l'utilisation d'un User-Agent moderne est un signe évident de bot.

L'ordre des en-têtes compte

Dans HTTP/2, l'ordre des en-têtes est fixe pour chaque navigateur. Python requests et d'autres clients standard envoient les en-têtes dans l'ordre alphabétique, ce qui diffère du comportement des navigateurs. Utilisez des bibliothèques prenant en charge un ordre d'en-têtes personnalisé.

Conseil : Utilisez les DevTools du navigateur (onglet Réseau → clic droit sur la requête → Copier → Copier en tant que cURL) pour obtenir une copie exacte des en-têtes d'un véritable navigateur. Ensuite, adaptez-les à votre code.

Génération dynamique de User-Agent

Utiliser le même User-Agent pour toutes les requêtes augmente le risque de détection. Créez un pool de User-Agents actuels et faites-les tourner.

import random

# Pool de User-Agents actuels (décembre 2024)
USER_AGENTS = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
]

def get_random_headers():
    ua = random.choice(USER_AGENTS)
    
    # Adaptation des autres en-têtes au UA choisi
    if 'Chrome' in ua:
        return {
            'User-Agent': ua,
            'Sec-Ch-Ua': '"Not_A Brand";v="8", "Chromium";v="120"',
            # ... autres en-têtes Chrome
        }
    elif 'Firefox' in ua:
        return {
            'User-Agent': ua,
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            # ... en-têtes Firefox
        }
    # ... traitement d'autres navigateurs

Utilisation de navigateurs headless

Lorsque Cloudflare utilise un défi JavaScript ou une détection avancée, le seul moyen fiable de contournement est un véritable navigateur. Les navigateurs headless traitent automatiquement le JavaScript, les cookies et créent un fingerprint entièrement authentique.

Playwright avec des patchs anti-detect

Playwright est une alternative moderne à Selenium avec de meilleures performances. Cependant, le Playwright standard est facilement détectable via navigator.webdriver et d'autres marqueurs. Utilisez playwright-stealth pour le masquage.

from playwright.sync_api import sync_playwright
from playwright_stealth import stealth_sync

def bypass_cloudflare(url, proxy):
    with sync_playwright() as p:
        browser = p.chromium.launch(
            headless=True,
            proxy={
                "server": f"http://{proxy['host']}:{proxy['port']}",
                "username": proxy['username'],
                "password": proxy['password']
            },
            args=[
                '--disable-blink-features=AutomationControlled',
                '--disable-dev-shm-usage',
                '--no-sandbox'
            ]
        )
        
        context = browser.new_context(
            viewport={'width': 1920, 'height': 1080},
            user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
            locale='en-US',
            timezone_id='America/New_York'
        )
        
        page = context.new_page()
        stealth_sync(page)  # Application des patchs anti-detect
        
        # Accéder à la page
        page.goto(url, wait_until='networkidle', timeout=30000)
        
        # Attendre la réussite du défi Cloudflare (généralement 5-10 secondes)
        page.wait_for_timeout(8000)
        
        # Vérification du contournement réussi
        if 'Just a moment' in page.content():
            print('Défi Cloudflare non réussi')
            return None
        
        # Extraction des cookies pour une utilisation ultérieure
        cookies = context.cookies()
        html = page.content()
        
        browser.close()
        return {'html': html, 'cookies': cookies}

# Utilisation
proxy_config = {
    'host': 'proxy.example.com',
    'port': 8080,
    'username': 'user',
    'password': 'pass'
}

result = bypass_cloudflare('https://example.com', proxy_config)

Puppeteer Extra avec des plugins

Pour l'écosystème Node.js, la meilleure solution est puppeteer-extra avec le plugin puppeteer-extra-plugin-stealth. Ce plugin applique plus de 30 techniques de masquage de l'automatisation.

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');

puppeteer.use(StealthPlugin());

async function bypassCloudflare(url, proxyUrl) {
    const browser = await puppeteer.launch({
        headless: 'new',
        args: [
            `--proxy-server=${proxyUrl}`,
            '--disable-blink-features=AutomationControlled',
            '--window-size=1920,1080'
        ]
    });
    
    const page = await browser.newPage();
    
    // Configuration du viewport et du user-agent
    await page.setViewport({ width: 1920, height: 1080 });
    await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36');
    
    // Redéfinition de navigator.webdriver
    await page.evaluateOnNewDocument(() => {
        delete Object.getPrototypeOf(navigator).webdriver;
    });
    
    // Accéder à la page
    await page.goto(url, { waitUntil: 'networkidle2', timeout: 30000 });
    
    // Attendre le passage du défi
    await page.waitForTimeout(8000);
    
    // Obtention du contenu et des cookies
    const content = await page.content();
    const cookies = await page.cookies();
    
    await browser.close();
    
    return { content, cookies };
}

// Exemple d'utilisation
bypassCloudflare('https://example.com', 'http://user:pass@proxy.example.com:8080')
    .then(result => console.log('Succès'))
    .catch(err => console.error(err));

Performance : Les navigateurs headless consomment beaucoup plus de ressources (200-500 Mo de RAM par instance). Pour des tâches à fort volume, utilisez-les uniquement pour obtenir des cookies, puis passez à des clients HTTP avec ces cookies.

Choix du type de proxy pour le contournement de Cloudflare

Le type de proxy influence de manière critique le succès du contournement. Cloudflare maintient des bases de données d'adresses IP des centres de données et applique des règles de vérification plus strictes.

Type de proxy Probabilité de contournement Vitesse Coût Recommandation
Centre de données 30-40% Élevée Faible Uniquement avec des navigateurs headless
Résidentiel 85-95% Moyenne Élevée Choix optimal
Mobile 90-98% Moyenne Très élevée Pour des tâches critiques
ISP (Résidentiel Statique) 80-90% Élevée Moyenne Équilibre entre prix et qualité

Pourquoi les proxies résidentiels sont plus efficaces

Les proxies résidentiels utilisent des adresses IP de véritables appareils (routeurs domestiques, smartphones). Cloudflare ne peut pas bloquer massivement ces IP, car cela bloquerait les utilisateurs ordinaires. Les statistiques montrent que les IP résidentielles reçoivent un captcha 15 à 20 fois moins souvent que les centres de données.

Lors de l'utilisation de proxies résidentiels, la géolocalisation est cruciale. Si le site cible est orienté vers les États-Unis, l'utilisation de proxies d'Asie augmentera la suspicion. Choisissez des fournisseurs avec une large couverture géographique et la possibilité de cibler par ville.

Proxies mobiles pour une fiabilité maximale

Les proxies mobiles utilisent des adresses IP des opérateurs mobiles (4G/5G). La particularité des réseaux mobiles est le changement dynamique d'IP via le mode avion, ce qui permet d'avoir pratiquement un nombre illimité d'adresses IP propres. La probabilité de blocage d'une IP mobile est proche de zéro.

# Exemple de rotation d'IP mobile via API
import requests
import time

def rotate_mobile_ip(proxy_api_url):
    """Changement d'IP du proxy mobile"""
    response = requests.get(f"{proxy_api_url}/rotate")
    if response.status_code == 200:
        print("IP changée avec succès")
        time.sleep(5)  # Attente de l'application des changements
        return True
    return False

# Utilisation avec un proxy mobile
mobile_proxy = "http://user:pass@mobile.proxy.com:8080"

for i in range(10):
    # Exécution de la requête
    response = requests.get(
        'https://example.com',
        proxies={'http': mobile_proxy, 'https': mobile_proxy}
    )
    
    # Rotation de l'IP après chaque requête
    rotate_mobile_ip('https://api.proxy.com/mobile')

Gestion des cookies et des sessions

Après avoir réussi le défi Cloudflare, le serveur établit des cookies (cf_clearance, __cfduid et autres) qui confirment la légitimité du client. Une gestion correcte de ces cookies permet d'éviter des vérifications répétées.

Extraction et réutilisation de cf_clearance

Le cookie cf_clearance est généralement valide pendant 30 à 60 minutes. Après l'avoir obtenu via un navigateur headless, il peut être utilisé dans des requêtes HTTP ordinaires.

import requests
import pickle
from datetime import datetime, timedelta

class CloudflareCookieManager:
    def __init__(self, cookie_file='cf_cookies.pkl'):
        self.cookie_file = cookie_file
        self.cookies = self.load_cookies()
    
    def load_cookies(self):
        """Chargement des cookies sauvegardés"""
        try:
            with open(self.cookie_file, 'rb') as f:
                data = pickle.load(f)
                # Vérification de la durée de validité
                if data['expires'] > datetime.now():
                    return data['cookies']
        except FileNotFoundError:
            pass
        return None
    
    def save_cookies(self, cookies, ttl_minutes=30):
        """Sauvegarde des cookies avec TTL"""
        data = {
            'cookies': cookies,
            'expires': datetime.now() + timedelta(minutes=ttl_minutes)
        }
        with open(self.cookie_file, 'wb') as f:
            pickle.dump(data, f)
    
    def get_cf_clearance(self, url, proxy):
        """Obtention de cf_clearance via le navigateur"""
        if self.cookies:
            return self.cookies
        
        # Ici, le code pour lancer le navigateur (de la section précédente)
        # ...
        browser_cookies = bypass_cloudflare(url, proxy)['cookies']
        
        # Conversion au format requests
        cookies_dict = {c['name']: c['value'] for c in browser_cookies}
        self.save_cookies(cookies_dict)
        self.cookies = cookies_dict
        
        return cookies_dict
    
    def make_request(self, url, proxy):
        """Requête avec gestion automatique des cookies"""
        cookies = self.get_cf_clearance(url, proxy)
        
        response = requests.get(
            url,
            cookies=cookies,
            proxies={'http': proxy, 'https': proxy},
            headers=get_random_headers()
        )
        
        # Si nous recevons à nouveau un défi — mettons à jour les cookies
        if response.status_code == 403 or 'cf-browser-verification' in response.text:
            print("Cookies obsolètes, obtention de nouveaux...")
            self.cookies = None
            return self.make_request(url, proxy)
        
        return response

# Utilisation
manager = CloudflareCookieManager()
response = manager.make_request(
    'https://example.com/api/data',
    'http://user:pass@proxy.example.com:8080'
)

Liaison des cookies à l'adresse IP

Cloudflare lie cf_clearance à l'adresse IP à partir de laquelle le défi a été réussi. L'utilisation de ce cookie avec une autre IP entraînera un blocage. Lors de l'utilisation de proxies rotatifs, il est nécessaire de conserver un ensemble de cookies distinct pour chaque IP.

import hashlib

class IPBoundCookieManager:
    def __init__(self):
        self.cookies_by_ip = {}
    
    def get_ip_hash(self, proxy_url):
        """Création d'un hash pour identifier le proxy"""
        return hashlib.md5(proxy_url.encode()).hexdigest()
    
    def get_cookies_for_proxy(self, proxy_url, target_url):
        """Obtention des cookies pour un proxy spécifique"""
        ip_hash = self.get_ip_hash(proxy_url)
        
        if ip_hash in self.cookies_by_ip:
            cookies_data = self.cookies_by_ip[ip_hash]
            if cookies_data['expires'] > datetime.now():
                return cookies_data['cookies']
        
        # Obtention de nouveaux cookies via le navigateur
        new_cookies = self.fetch_cookies_with_browser(target_url, proxy_url)
        
        self.cookies_by_ip[ip_hash] = {
            'cookies': new_cookies,
            'expires': datetime.now() + timedelta(minutes=30)
        }
        
        return new_cookies

Rotation des proxies et contrôle de la fréquence des requêtes

Même avec la bonne pile technique, une fréquence de requêtes trop élevée à partir d'une seule IP déclenche le rate limiting. Cloudflare analyse les modèles de trafic et détecte l'activité anormale.

Stratégies de rotation des proxies

Il existe trois approches principales pour la rotation : round-robin (séquentielle), random (aléatoire) et sticky sessions (liaison à la session). Pour contourner Cloudflare, la stratégie optimale est les sticky sessions avec une limitation des requêtes par IP.

import time
import random
from collections import defaultdict
from datetime import datetime, timedelta

class SmartProxyRotator:
    def __init__(self, proxy_list, max_requests_per_ip=20, cooldown_minutes=10):
        self.proxy_list = proxy_list
        self.max_requests_per_ip = max_requests_per_ip
        self.cooldown_minutes = cooldown_minutes
        
        # Compteurs d'utilisation
        self.usage_count = defaultdict(int)
        self.last_used = {}
        self.cooldown_until = {}
    
    def get_proxy(self):
        """Obtention du prochain proxy disponible"""
        available_proxies = []
        
        for proxy in self.proxy_list:
            # Vérification du cooldown
            if proxy in self.cooldown_until:
                if datetime.now() < self.cooldown_until[proxy]:
                    continue
                else:
                    # Réinitialisation du compteur après le cooldown
                    self.usage_count[proxy] = 0
                    del self.cooldown_until[proxy]
            
            # Vérification de la limite de requêtes
            if self.usage_count[proxy] < self.max_requests_per_ip:
                available_proxies.append(proxy)
        
        if not available_proxies:
            # Si tous les proxies sont en cooldown — attendons
            wait_time = min(
                (self.cooldown_until[p] - datetime.now()).total_seconds()
                for p in self.cooldown_until
            )
            print(f"Tous les proxies sont en cooldown. Attente de {wait_time:.0f} secondes...")
            time.sleep(wait_time + 1)
            return self.get_proxy()
        
        # Choix du proxy avec le moins d'utilisation
        proxy = min(available_proxies, key=lambda p: self.usage_count[p])
        
        self.usage_count[proxy] += 1
        self.last_used[proxy] = datetime.now()
        
        # Mise en place du cooldown lors de l'atteinte de la limite
        if self.usage_count[proxy] >= self.max_requests_per_ip:
            self.cooldown_until[proxy] = datetime.now() + timedelta(
                minutes=self.cooldown_minutes
            )
            print(f"Le proxy {proxy} a atteint la limite. Cooldown de {self.cooldown_minutes} minutes.")
        
        return proxy
    
    def add_delay(self):
        """Délai aléatoire entre les requêtes (imitation d'un humain)"""
        delay = random.uniform(2, 5)  # 2-5 secondes
        time.sleep(delay)

# Utilisation
proxy_pool = [
    'http://user:pass@proxy1.example.com:8080',
    'http://user:pass@proxy2.example.com:8080',
    'http://user:pass@proxy3.example.com:8080',
    # ... jusqu'à 50-100 proxies pour un fonctionnement stable
]

rotator = SmartProxyRotator(
    proxy_pool,
    max_requests_per_ip=15,  # Valeur conservatrice
    cooldown_minutes=15
)

# Exécution des requêtes
for i in range(1000):
    proxy = rotator.get_proxy()
    
    response = requests.get(
        'https://example.com/page',
        proxies={'http': proxy, 'https': proxy},
        headers=get_random_headers()
    )
    
    print(f"Requête {i+1}: {response.status_code}")
    rotator.add_delay()

Limitation adaptative des taux

Une approche plus avancée consiste à adapter dynamiquement la fréquence des requêtes en fonction des réponses du serveur. Si des erreurs 429 ou des captchas commencent à apparaître, réduisez automatiquement le rythme.

class AdaptiveRateLimiter:
    def __init__(self, initial_delay=3.0):
        self.delay = initial_delay
        self.min_delay = 1.0
        self.max_delay = 30.0
        self.success_streak = 0
        self.failure_streak = 0
    
    def on_success(self):
        """Requête réussie — on peut accélérer"""
        self.success_streak += 1
        self.failure_streak = 0
        
        if self.success_streak >= 10:
            # Réduction du délai de 10 %
            self.delay = max(self.min_delay, self.delay * 0.9)
            self.success_streak = 0
    
    def on_failure(self, status_code):
        """Erreur — on ralentit"""
        self.failure_streak += 1
        self.success_streak = 0
        
        if status_code == 429:  # Limite de taux
            # Ralentissement agressif
            self.delay = min(self.max_delay, self.delay * 2.0)
        elif status_code == 403:  # Possible blocage
            self.delay = min(self.max_delay, self.delay * 1.5)
        
        print(f"Délai augmenté à {self.delay:.2f}s")
    
    def wait(self):
        """Attente avant la prochaine requête"""
        # Ajout d'aléatoire ±20%
        actual_delay = self.delay * random.uniform(0.8, 1.2)
        time.sleep(actual_delay)

Outils et bibliothèques prêts à l'emploi pour le contournement

Développer sa propre solution depuis zéro demande du temps et de l'expertise. Il existe des outils prêts à l'emploi qui automatisent le processus de contournement de Cloudflare.

cloudscraper (Python)

La bibliothèque cloudscraper est une surcouche de requests qui résout automatiquement les défis JavaScript. Elle fonctionne avec les protections de base, mais peut ne pas réussir face à des vérifications avancées.

import cloudscraper

# Création d'un scraper avec support de proxy
scraper = cloudscraper.create_scraper(
    browser={
        'browser': 'chrome',
        'platform': 'windows',
        'desktop': True
    }
)

# Configuration du proxy
proxies = {
    'http': 'http://user:pass@proxy.example.com:8080',
    'https': 'http://user:pass@proxy.example.com:8080'
}

# Exécution de la requête
response = scraper.get('https://example.com', proxies=proxies)

if response.status_code == 200:
    print("Contournement réussi")
    print(response.text)
else:
    print(f"Erreur : {response.status_code}")

FlareSolverr (universel)

FlareSolverr est un serveur proxy qui exécute un navigateur headless pour résoudre les défis Cloudflare. Il fonctionne via une API HTTP et prend en charge tous les langages de programmation.

# Lancement de FlareSolverr via Docker
docker run -d \
  --name=flaresolverr \
  -p 8191:8191 \
  -e LOG_LEVEL=info \
  ghcr.io/flaresolverr/flaresolverr:latest

# Utilisation depuis Python
import requests

def solve_cloudflare(url, proxy=None):
    flaresolverr_url = "http://localhost:8191/v1"
    
    payload = {
        "cmd": "request.get",
        "url": url,
        "maxTimeout": 60000
    }
    
    if proxy:
        payload["proxy"] = {
            "url": proxy
        }
    
    response = requests.post(flaresolverr_url, json=payload)
    result = response.json()
    
    if result['status'] == 'ok':
        return {
            'html': result['solution']['response'],
            'cookies': result['solution']['cookies'],
            'user_agent': result['solution']['userAgent']
        }
    else:
        raise Exception(f"Erreur FlareSolverr : {result['message']}")

# Exemple d'utilisation
result = solve_cloudflare(
    'https://example.com',
    proxy='http://user:pass@proxy.example.com:8080'
)

print(result['html'])

undetected-chromedriver

Version patchée de Selenium ChromeDriver qui applique automatiquement de nombreuses techniques anti-detect. Plus facile à utiliser que Playwright, mais moins flexible.

import undetected_chromedriver as uc
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def bypass_with_uc(url, proxy):
    options = uc.ChromeOptions()
    options.add_argument(f'--proxy-server={proxy}')
    options.add_argument('--disable-blink-features=AutomationControlled')
    
    driver = uc.Chrome(options=options, version_main=120)
    
    try:
        driver.get(url)
        
        # Attente de la disparition du défi Cloudflare
        WebDriverWait(driver, 20).until_not(
            EC.presence_of_element_located((By.ID, "cf-spinner-please-wait"))
        )
        
        # Attente supplémentaire pour la fiabilité
        time.sleep(3)
        
        # Obtention du résultat
        html = driver.page_source
        cookies = driver.get_cookies()
        
        return {'html': html, 'cookies': cookies}
    
    finally:
        driver.quit()

# Utilisation
result = bypass_with_uc(
    'https://example.com',
    'http://user:pass@proxy.example.com:8080'
)

Approche combinée : La stratégie optimale consiste à utiliser un navigateur headless uniquement pour l'obtention initiale des cookies, puis à passer à des clients HTTP (tls-client, cloudscraper) avec ces cookies. Cela offre un équilibre entre fiabilité et performance.

Conclusion

Contourner Cloudflare lors de l'utilisation de proxies nécessite une approche globale : un fingerprint TLS correct, des en-têtes HTTP authentiques, des proxies de qualité et une gestion adéquate des sessions. Recommandations clés :

  • Utilisez des proxies résidentiels ou mobiles au lieu de centres de données
  • Appliquez des bibliothèques avec un fingerprint TLS correct (tls-client, curl-impersonate)
  • Pour des cas complexes, utilisez des navigateurs headless avec des patchs anti-detect
  • Conservez et réutilisez les cookies cf_clearance
  • Faites tourner les proxies en tenant compte du rate limiting (pas plus de 15-20 requêtes par IP)
  • Ajoutez des délais aléatoires entre les requêtes (2-5 secondes)

La protection Cloudflare évolue constamment, il est donc important de mettre à jour régulièrement les outils et d'adapter les stratégies. Surveillez les changements dans les techniques de fingerprinting et testez les solutions sur les versions actuelles de la protection.

Pour un fonctionnement stable, il est recommandé d'utiliser des services de proxy professionnels avec un large pool d'IP et une rotation automatique.

```