Web scraping sans détection: couverture illustrée de l'article Clawbrowser

Web scraping sans détection: les techniques fiables

Clawbrowser Teamweb-scrapinganti-botfingerprintingproxyguide

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 level

Clawbrowser 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:
            break

Gé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 data

Extraire 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 appears

Rotation 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

  1. TLS fingerprint (JA3/JA4): un ClientHello incohérent déclenche un challenge avant le HTML.
  2. JavaScript execution: Turnstile exige un vrai environnement de rendu.
  3. IP reputation: la réputation d'IP est évaluée sur des millions de sites.
  4. 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

Voir tous les articles →