← Tous les articles

Imperva Incapsula : Pourquoi Votre Scraper Reçoit 'Request Unsuccessful' et Comment y Remédier

Votre script demande une page produit et reçoit quelques centaines d’octets de HTML. Pas de produit, pas de prix. Juste une ligne : “Request unsuccessful. Incapsula incident ID: …” suivie d’un long numéro. Parfois avec un 403. Parfois, pire encore, avec un 200. Vous ouvrez la même URL dans votre navigateur et elle se charge instantanément.

Vous venez de rencontrer Imperva. C’est un système de protection anti-bot courant sur les sites de commerce, de voyage, d’immobilier, de finance et d’administration, et il se comporte différemment de Cloudflare ou DataDome sur plusieurs points qui comptent quand vous scrapez. Ce guide vous montre comment le reconnaître, comment il décide que vous êtes un bot et comment obtenir la vraie page avec des outils open source.

Ce Qu’est Vraiment Imperva (Incapsula)

Incapsula était le nom d’origine du service de sécurité cloud d’Imperva : un CDN et un pare-feu applicatif web (WAF) placés devant un site. La marque a presque disparu, mais le nom survit dans les noms de cookies et les pages de blocage, ce qui explique pourquoi les développeurs parlent encore d‘“Incapsula”. En 2019, Imperva a racheté Distil Networks, l’une des premières sociétés spécialisées dans la lutte contre les bots, et cette technologie est devenue Imperva Advanced Bot Protection. Imperva fait aujourd’hui partie de Thales.

Concrètement, un site protégé peut faire tourner deux couches :

  • La couche edge (WAF et CDN). Chaque requête passe par le réseau d’Imperva. Il vérifie la réputation de l’IP, les signatures de la requête et l’empreinte de votre connexion, pose des cookies de suivi et peut servir un défi JavaScript ou un CAPTCHA.
  • Advanced Bot Protection. Une couche supplémentaire par-dessus. Un script capteur s’exécute dans le navigateur, collecte une empreinte de l’appareil, et le résultat devient un jeton signé que les requêtes suivantes doivent transporter. Le comportement et le rythme des requêtes sont notés par appareil, pas seulement par IP.

Certains sites n’utilisent que la couche edge. Ceux-là se règlent souvent avec un bon client HTTP. Les sites avec Advanced Bot Protection exigent presque toujours un vrai navigateur à un moment ou à un autre.

Comment Savoir Si Vous Avez Affaire à Imperva

Avant de modifier quoi que ce soit, confirmez à quoi vous avez affaire. Imperva laisse des traces nettes :

  • En-têtes de réponse. Un en-tête X-Iinfo apparaît sur le trafic Imperva, même sur les réponses réussies. Beaucoup de sites envoient aussi X-CDN: Imperva ou X-CDN: Incapsula.
  • Cookies. visid_incap_<id du site> (un identifiant de visiteur de longue durée), incap_ses_<n>_<id du site> (la session) et nlbi_<id du site> (répartition de charge). Le suffixe avec l’identifiant du site lie chaque cookie à un seul site protégé.
  • Cookies de défi. ___utmvc appartient à l’ancien défi JavaScript. reese84 appartient à Advanced Bot Protection. Les deux sont posés par JavaScript : vous les verrez dans le stockage de cookies du navigateur, pas dans la première réponse HTTP.
  • Marqueurs dans le corps. “Request unsuccessful” avec un “Incapsula incident ID”, un script chargé depuis /_Incapsula_Resource, ou une page “Pardon Our Interruption”, héritée de Distil.

Une petite fonction rend la vérification reproductible :

from curl_cffi import requests

COOKIE_PREFIXES = ("visid_incap_", "incap_ses_", "nlbi_", "reese84", "___utmvc")

def imperva_signals(resp):
    found = []
    if "x-iinfo" in resp.headers:
        found.append("X-Iinfo header")
    cdn = resp.headers.get("x-cdn", "")
    if "imperva" in cdn.lower() or "incapsula" in cdn.lower():
        found.append(f"X-CDN: {cdn}")
    found += [f"cookie {n}" for n in resp.cookies.keys() if n.startswith(COOKIE_PREFIXES)]
    return found

def is_imperva_block(html):
    if "Incapsula incident ID" in html or "Pardon Our Interruption" in html:
        return True
    # Les vraies pages peuvent aussi inclure le script, donc seule une page minuscule compte
    return "_Incapsula_Resource" in html and len(html) < 5_000

resp = requests.get("https://www.example.com/", impersonate="chrome")
print(resp.status_code, imperva_signals(resp), is_imperva_block(resp.text))

Remarquez que is_imperva_block examine le corps de la réponse, pas le code de statut. C’est voulu. Imperva peut renvoyer sa page de blocage avec un 200, et un scraper qui ne vérifie que les erreurs enregistrera tranquillement des pages vides. Nous détaillons ce piège dans notre article sur la détection des blocages silencieux.

Comment Imperva Décide Que Vous Êtes un Bot

Voyez cela comme une série de portes. Il suffit d’échouer à une seule pour être bloqué.

1. La Connexion

Avant le moindre octet de HTML, l’edge voit votre IP et votre handshake TLS. Les plages d’IP de datacenters et les IP ayant un historique d’abus partent avec un score faible. Le handshake de requests en Python ne ressemble en rien à celui de Chrome, et c’est souvent pour cela que la toute première requête échoue. Les détails sont dans notre guide sur l’empreinte TLS.

2. La Chaîne de Cookies

Lors de votre première visite, Imperva pose les cookies de visiteur et de session. Les requêtes suivantes doivent les renvoyer de manière cohérente. Les cookies sont liés entre eux et au site : un cookie de session appartient à un identifiant de visiteur, et un cookie d’un site Imperva ne signifie rien sur un autre. Un client qui perd des cookies, envoie un jeu périmé ou mélange des cookies de sessions différentes reçoit un nouveau défi.

3. Le Défi JavaScript

Si l’edge n’est pas convaincu, il retient le contenu et sert une page qui charge un script. L’ancienne version, servie depuis /_Incapsula_Resource, collecte des propriétés du navigateur et stocke un résultat chiffré dans le cookie ___utmvc. Le capteur plus récent d’Advanced Bot Protection collecte une empreinte bien plus large, l’envoie vers un chemin propre à chaque site et reçoit un jeton reese84 avec une date d’expiration intégrée. Ce jeton doit être renouvelé pendant la navigation. Un client HTTP simple n’exécute aucun des deux scripts, il ne franchit donc jamais cette porte.

4. Le Comportement dans la Durée

Passer une fois ne suffit pas. Advanced Bot Protection continue de noter la session : à quelle vitesse vous demandez des pages, si vous ne visitez que des URL profondes, si la même empreinte d’appareil apparaît depuis de nombreuses IP. Imperva décrit des limites de débit basées sur l’empreinte de l’appareil plutôt que sur l’IP : faire tourner les IP ne suffit donc pas à les réinitialiser.

Les règles sont aussi définies par chemin. Il est courant que la page d’accueil se charge sans problème alors que les résultats de recherche, les API internes ou les pages de compte sont bloqués. Si votre URL de test fonctionne mais pas votre vraie cible, c’est généralement la raison.

Pourquoi Votre Scraper Échoue

Voici comment les portes correspondent aux symptômes que vous observez :

  • La première requête est toujours bloquée : la porte de la connexion. Le problème vient de votre empreinte TLS ou de votre IP.
  • Page minuscule avec un script et sans contenu : le défi JavaScript. Votre client n’exécute pas JavaScript.
  • Ça marche quelques minutes, puis blocage : le jeton a expiré sans être renouvelé, ou votre rythme de requêtes a déclenché le contrôle comportemental.
  • La page d’accueil passe, la recherche est bloquée : une règle plus stricte sur ce chemin.
  • Bloqué dans Playwright, aucun souci dans votre Chrome : c’est le navigateur d’automatisation lui-même qui est noté. Voir pourquoi votre navigateur Playwright reçoit des défis.

Comment Passer avec des Outils Open Source

Commencez par l’option la moins coûteuse et arrêtez-vous à la première qui fonctionne.

Étape 1 : Utilisez un Client HTTP avec une Empreinte de Navigateur

Si le site n’utilise que la couche edge, un client qui envoie une empreinte TLS et HTTP/2 de vrai navigateur suffit souvent. curl_cffi avec impersonate="chrome" est le choix habituel en Python. Utilisez une session pour que les cookies Imperva de la première réponse soient renvoyés dans les suivantes, et visitez la page d’accueil avant l’URL profonde :

from curl_cffi import requests

s = requests.Session(impersonate="chrome")
s.get("https://www.example.com/")  # récupère les cookies visid_incap_ et incap_ses_
resp = s.get(
    "https://www.example.com/c/toys",
    headers={"Referer": "https://www.example.com/"},
)
print(resp.status_code, is_imperva_block(resp.text))

Si vous recevez toujours une page de défi, le site effectue une vérification JavaScript, et aucun client HTTP ne la passera seul.

Étape 2 : Laissez un Vrai Navigateur Passer le Défi

Pour les défis JavaScript et reese84, lancez un vrai Chrome. Avec Playwright, utilisez le Chrome installé sur votre machine (channel="chrome"), en mode visible, et gardez un profil persistant pour que le cookie de visiteur survive d’une exécution à l’autre. Un visiteur qui revient avec un peu d’historique paraît plus normal qu’un profil neuf à chaque exécution.

from playwright.sync_api import sync_playwright

URLS = [
    "https://www.example.com/c/toys?page=1",
    "https://www.example.com/c/toys?page=2",
]

with sync_playwright() as p:
    ctx = p.chromium.launch_persistent_context(
        "./imperva-profile", channel="chrome", headless=False, no_viewport=True
    )
    page = ctx.new_page()

    # Entrer comme un visiteur et laisser le script capteur terminer
    page.goto("https://www.example.com/", wait_until="networkidle")
    page.wait_for_timeout(3000)

    for url in URLS:
        page.goto(url, wait_until="domcontentloaded")
        html = page.content()
        if is_imperva_block(html):
            print("Blocked on", url)
            break
        # parser le html ici
        page.wait_for_timeout(2000)  # rythme humain

    ctx.close()

Comme la page continue d’exécuter le script d’Imperva, le navigateur renouvelle le jeton tout seul. C’est le grand avantage par rapport à une récupération unique des cookies que l’on rejoue ensuite. Si vous voulez quand même transmettre les cookies à un client HTTP plus rapide, gardez la même IP et le même user agent, et prévoyez de les renouveler souvent. Notre guide sur la persistance de session détaille cette approche.

Si un profil se fait bloquer sur toutes les pages, supprimez le dossier du profil et repartez de zéro. Un identifiant de visiteur grillé vous suit partout.

Étape 3 : Réglez la Question de l’IP

Si un vrai navigateur est encore bloqué dès la première page, regardez votre IP. Utilisez des IP résidentielles ou mobiles d’un fournisseur sérieux, avec des sessions persistantes : une seule IP pendant toute la durée de vie d’une session de navigateur. Changer d’IP en pleine session tout en envoyant les mêmes cookies est un signal de bot très fort. Playwright reçoit le proxy au lancement :

ctx = p.chromium.launch_persistent_context(
    "./imperva-profile",
    channel="chrome",
    headless=False,
    proxy={"server": "http://proxy.example.net:8000", "username": "user", "password": "pass"},
)

Étape 4 : Ralentissez et Répartissez

Advanced Bot Protection surveille toute la session, donc le rythme compte. Ajoutez des pauses aléatoires, limitez le nombre de pages par session et lancez plusieurs sessions séparées plutôt qu’une seule qui martèle le site. Chaque session a son propre profil, sa propre IP et son propre stockage de cookies. Ne partagez jamais de cookies entre sessions.

Gardez un rythme de requêtes raisonnable et respectez les conditions d’utilisation du site. La politesse est aussi le moyen le moins coûteux de ne pas être bloqué.

FAQ

Imperva et Incapsula, c’est la même chose ?

Pour le scraping, oui. Incapsula était le nom d’origine du service WAF et CDN cloud d’Imperva. Le nom apparaît toujours dans les cookies (visid_incap_, incap_ses_) et dans le message de blocage “Incapsula incident ID”.

Il contient un jeton d’Imperva Advanced Bot Protection. Un script de la page collecte des signaux du navigateur et de l’appareil, les envoie au site et reçoit en retour un jeton signé avec une date d’expiration. Les requêtes sans jeton valide et récent reçoivent un défi.

Puis-je réutiliser des cookies Imperva sur un autre site ?

Non. Chaque cookie porte l’identifiant du site protégé, et le cookie de session est lié au cookie de visiteur. Les cookies d’un site sont inutiles sur un autre, et des cookies périmés sur le même site déclenchent un nouveau défi.

Pourquoi la page d’accueil fonctionne-t-elle alors que les résultats de recherche sont bloqués ?

Les règles Imperva se configurent par chemin. Les propriétaires de sites protègent souvent la recherche, les prix et les endpoints d’API plus strictement que les pages statiques. Testez toujours votre scraper sur les URL dont vous avez réellement besoin.

Si Vous Préférez Ne Pas Maintenir Tout Cela

Tout ce qui précède fonctionne, mais c’est un travail permanent : les versions des navigateurs évoluent, les jetons expirent, les IP se grillent et chaque site protégé est réglé un peu différemment. Si vous préférez consacrer ce temps aux données, ScrapeUnblocker prend une URL et renvoie la page rendue en un seul appel d’API, y compris pour les sites protégés par Imperva. Notre benchmark public inclut une cible protégée par Incapsula, et la documentation vous montre comment envoyer votre première requête en quelques minutes.

Essayez ScrapeUnblocker gratuitement

Taux de réussite de plus de 95 % · à partir de 0,55 € pour 1 000 appels (TVA éventuelle en sus) · 500 requêtes gratuites à l'inscription.

Essayer gratuitement → Voir les tarifs