Votre scraper marche au premier lancement. Au troisième, il reçoit des 403, des réponses vides ou des boucles CAPTCHA. Le code n'a pas changé. Le site non plus. Le système anti-bot a simplement appris à reconnaître votre session. En 2026, Cloudflare, Akamai et DataDome croisent beaucoup plus de signaux qu'un User-Agent et un délai aléatoire.
TL;DR: les blocages viennent surtout de quatre couches: réseau, identité navigateur, comportement et état de session. Utilisez d'abord un anti-detect browser qui gère fingerprints et proxy routing au niveau engine; gardez le code pour la reconnaissance, l'extraction, la pagination et la montée en charge.
Pour le modèle complet des quatre couches, lisez Automatisation de navigateur sans blocage: les 4 couches de défense.
Reconnaissance avant le code
Écrire le scraper tout de suite mène souvent à le réécrire. Dix minutes de reconnaissance suffisent à choisir le bon chemin.
Identifier le système anti-bot
Ouvrez DevTools et regardez les response headers.
| Header | Système anti-bot |
|---|---|
cf-ray, server: cloudflare |
Cloudflare Bot Management |
x-akamai-transformed |
Akamai Bot Manager |
x-datadome |
DataDome |
x-px-* headers |
PerimeterX (now HUMAN) |
| Aucun de ceux-ci | Probablement pas d'anti-bot commercial, ou solution maison |
Une page simple se scrape avec curl_cffi; une page Cloudflare demande un vrai navigateur avec fingerprints cohérents.
Vérifier s'il existe une API
Avant de lancer un navigateur, inspectez Network et filtrez XHR/Fetch. Beaucoup de pages chargent les données depuis un endpoint JSON.
# If the site loads product data from an API endpoint
from curl_cffi import requests
response = requests.get(
"https://target-site.com/api/v2/products?category=electronics&page=1",Les endpoints sont rapides, mais certains serveurs attendent une vraie session navigateur avant l'appel API. Sur un site protégé, chargez la page dans le navigateur et interceptez la réponse.
Évaluer le rendu
Désactivez JavaScript dans DevTools. Si le contenu reste visible, HTTP suffit. Si la page est vide, il faut un engine navigateur.
| Contenu visible sans JS? | Outil |
|---|---|
| Oui, tout est rendu | curl_cffi or requests with TLS impersonation |
| Partiel | curl_cffi for static parts, browser for dynamic |
| Non, page vide | Full browser (Clawbrowser + Playwright/Puppeteer) |
Choisir le stack de scraping
Le bon outil dépend de la protection et du rendu. Un navigateur complet coûte trop cher quand HTTP suffit; HTTP échoue vite sur une SPA protégée.
Arbre de décision
Pas d'anti-bot + HTML serveur: utilisez curl_cffi avec TLS impersonation.
from curl_cffi import requests
response = requests.get(
"https://unprotected-site.com/products",
impersonate="chrome136"Pas d'anti-bot + rendu JavaScript: utilisez un headless browser standard.
Anti-bot + HTML serveur: utilisez curl_cffi avec residential proxy.
Anti-bot + rendu JavaScript: utilisez Clawbrowser avec fingerprints gérés et residential proxy.
from playwright.async_api import async_playwright
async def scrape_protected_site():
async with async_playwright() as p:
# Clawbrowser handles fingerprints, TLS and proxy at the engine levelClawbrowser est un anti-detect browser local, gratuit, basé sur Chromium, avec fingerprints gérés, proxy routing, CDP natif et serveur MCP intégré.
Patterns d'extraction de données
Une fois la détection passée, le vrai travail est d'extraire des données structurées de façon stable.
Pagination
La pagination se présente surtout sous trois formes.
Pagination par URL
async def scrape_paginated(page, base_url, max_pages=50):
all_items = []
for page_num in range(1, max_pages + 1):
await page.goto(f"{base_url}?page={page_num}")
await human_delay(2000, 4000)Infinite scroll (chargement au scroll):
async def scrape_infinite_scroll(page, max_scrolls=30):
all_items = []
previous_count = 0
for _ in range(max_scrolls):"Load more" button:
async def scrape_load_more(page):
while True:
load_more = await page.query_selector('[data-testid="load-more"]')
if not load_more:
breakGérer le contenu dynamique
Certaines données apparaissent après un clic, un accordéon ouvert ou un hover.
async def extract_product_details(page, product_url):
await page.goto(product_url)
await human_delay(1000, 2000)
# Click "Specifications" tab to reveal hidden dataExtraire depuis le shadow DOM
Les composants encapsulés dans le shadow DOM demandent une extraction depuis la racine shadow.
# Pierce through shadow DOM to extract data
data = await page.evaluate("""
() => {
const host = document.querySelector('product-card');
const shadow = host.shadowRoot;Gestion des sessions pour le scraping
Un scraper visite beaucoup plus de pages qu'un humain. La session doit donc paraître cohérente dans la durée.
Session warming
Ne commencez pas par la page cible: ouvrez la home, une catégorie, acceptez les cookies, puis scrapez. Les briques comportementales sont détaillées dans Automatisation de navigateur sans blocage: les 4 couches de défense.
async def warm_session(page, site_url):
await page.goto(site_url)
await human_delay(2000, 4000)
# Accept cookies if banner appearsRotation de profils à l'échelle
Répartissez les gros volumes sur plusieurs profils Clawbrowser, chacun avec son fingerprint, ses cookies, son storage et son proxy.
import asyncio
from playwright.async_api import async_playwright
async def scrape_batch(profile_name, urls):
async with async_playwright() as p:| Échelle | Approche |
|---|---|
| < 100 pages/day | Single profile, residential proxy, 3-5s delays |
| 100-1,000 pages/day | 3-5 rotating profiles, sticky residential sessions |
| 1,000-10,000 pages/day | 10+ profiles, proxy pool, session warming |
| 10,000+ pages/day | Distributed setup, multiple Clawbrowser instances, backoff logic |
Diagnostiquer les blocages
Le symptôme indique souvent la couche qui échoue.
| Symptôme | Cause probable | Correctif |
|---|---|---|
| Bloqué au premier request | Réputation IP ou browser fingerprint | Passer sur residential proxy et anti-detect browser |
| Bloque après 5-10 pages | Comportement ou limite de session | Ralentir, ajouter des délais, chauffer les sessions |
| CAPTCHA on every page | Fingerprint leak | Browser is leaking automation signals, switch to managed fingerprints |
| 403 after proxy rotation | Browser fingerprint unchanged | New IP but same broken fingerprint, fix the browser layer |
| Fonctionne localement, échoue en production | Datacenter IP | Ajouter un residential proxy en production |
| Page vide / spinner infini | JavaScript challenge failed | Browser can't pass Cloudflare/Akamai JS check, needs real engine |
| Données différentes d'une visite manuelle | Geo or locale mismatch | Proxy location doesn't match fingerprint timezone/language |
Script de diagnostic rapide
import asyncio
from playwright.async_api import async_playwright
async def diagnose_blocking(target_url):
async with async_playwright() as p:Scraper des sites protégés par Cloudflare
Cloudflare combine TLS, JavaScript, comportement et réputation IP.
Ce que Cloudflare vérifie
- TLS fingerprint (JA3/JA4): un ClientHello incohérent déclenche un challenge avant le HTML.
- JavaScript execution: Turnstile exige un vrai environnement de rendu.
- IP reputation: la réputation d'IP est évaluée sur des millions de sites.
- Request patterns: les requêtes répétées depuis la même session sont signalées.
Le workflow
Gardez toutes les couches propres: navigateur anti-detect pour TLS/JS, residential proxy pour l'IP, timing dans votre code.
async def scrape_cloudflare_site(target_url, profile="cf-scraper"):
async with async_playwright() as p:
browser = await p.chromium.connect_over_cdp(
f"http://127.0.0.1:9222?profile={profile}"
)Pour le détail Cloudflare, lisez pourquoi vos scripts Playwright sont bloqués par Cloudflare.
Scraping avec agents IA
Le serveur MCP de Clawbrowser permet à un agent IA de contrôler de vraies sessions navigateur via CDP, avec les mêmes fingerprints et proxies que votre code.
L'intégration complète est dans Navigateur CDP pour agents IA: guide développeur.
FAQ
Pourquoi mon scraper marche en local mais échoue en production?
Votre machine locale a souvent une IP résidentielle; la production utilise une IP de datacenter. Ajoutez un residential proxy et vérifiez le mode headed avec fingerprints gérés.
Faut-il utiliser un client HTTP ou un navigateur?
HTTP suffit pour HTML serveur sans anti-bot. Pour JavaScript rendering ou challenges anti-bot, utilisez un navigateur complet.
Comment savoir si un site utilise Cloudflare?
Cherchez cf-ray ou server: cloudflare dans les headers Network de DevTools.
Peut-on scraper sans proxies?
Oui sur des sites non protégés. À l'échelle ou derrière Cloudflare/Akamai, il faut généralement des residential proxies.
Commencer le web scraping sans détection
Le scraping fiable commence par la reconnaissance, le bon outil et une infrastructure navigateur propre.
Install Clawbrowser pour gérer l'identité navigateur et le réseau: copiez le prompt depuis clawbrowser.ai et collez-le dans votre agent IA. Le setup prend moins de deux minutes.
Pour le modèle de détection, voir Automatisation de navigateur sans blocage: les 4 couches de défense. Pour les détails de fingerprinting, voir Browser fingerprinting: les 20+ signaux utilisés par les systèmes anti-bot.
Continue exploring
Ask AI how Clawbrowser helps
Poursuivre la lecture
Articles associés

Automatisation de navigateur sans se faire bloquer : la défense en 4 couches
Pourquoi l'automatisation de navigateur se fait bloquer et comment y remédier couche par couche : identité du navigateur, réseau, comportement et gestion de sessions. Un guide structurel pour développeurs.
Lire l’article →
Puppeteer-Extra-Stealth est obsolète : ce que utilise l'automatisation moderne
puppeteer-extra-plugin-stealth n'a pas été mis à jour depuis 2023. Découvrez pourquoi il échoue face aux systèmes anti-bot modernes et quelles alternatives utiliser.
Lire l’article →