Pourquoi la détection arrive
La détection du grattage sur le Web est un processus à plusieurs niveaux. Les systèmes anti-bot ne comptent pas sur un seul signal — ils combinent la réputation IP, les en-têtes HTTP, Empreintes TLS, empreintes du navigateur, et l'analyse comportementale pour calculer un score de risque. Lorsque ce score dépasse un seuil, vous obtenez bloqué, servi un CAPTCHA, ou alimenté des données trompeuses.
Ce guide offre une approche globale pour réduire la détection à tous les niveaux. Pour un aperçu du fonctionnement de ces systèmes, voir notre article pilier sur comment les systèmes anti-bot détectent les proxies.
Couche 1: Réputation IP et sélection par procuration
Votre adresse IP est la première chose qu'un serveur voit. Les systèmes anti-bot maintiennent des bases de données qui notent les adresses IP par type, historique et comportement.
Sélection du type mandataire
| Type de procuration | Risque de détection | Meilleur pour |
|---|---|---|
| Résidentiel | Faible | La plupart des travaux de démolition, sites protégés |
| FAI (Résidence statique) | Faible-moyenne | Longues sessions, comptes |
| Centre de données | Élevé | Sites non protégés, tâches à volume élevé |
| Mobile | Très faible | Sites de protection les plus élevés, réseaux sociaux |
Pour la plupart des projets de démolition, Proxies résidentielles de ProxyHat offrir le meilleur équilibre entre le faible risque de détection et l'efficacité des coûts. Voir notre détail Comparaison du type de proxy pour des conseils.
Stratégie de rotation de la propriété intellectuelle
# Python: Rotating proxy per request using ProxyHat
import requests
proxy_url = "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
proxies = {
"http": proxy_url,
"https": proxy_url
}
# Each request through the gateway gets a different IP
for url in urls_to_scrape:
response = requests.get(url, proxies=proxies, timeout=30)
process(response)
- Rotation par demande pour lister les pages et les résultats de recherche.
- Utiliser des sessions collantes pour les flux multipages (pagination, séquences de connexion).
- Géo-ciblez vos IP pour correspondre à l'auditoire prévu du site en utilisant Le ciblage de l'emplacement de ProxyHat.
Couche 2: En-têtes HTTP
Les en-têtes HTTP incorrects ou manquants sont l'un des signaux les plus faciles à détecter pour les systèmes anti-bot. Un vrai navigateur envoie 15-20 en-têtes dans un ordre spécifique; un script Python par défaut envoie 3-4.
En-têtes essentiels
# Python: Realistic header set
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.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, zstd",
"Cache-Control": "max-age=0",
"Sec-Ch-Ua": '"Chromium";v="131", "Not_A Brand";v="24"',
"Sec-Ch-Ua-Mobile": "?0",
"Sec-Ch-Ua-Platform": '"Windows"',
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Upgrade-Insecure-Requests": "1",
"Connection": "keep-alive"
}
response = requests.get(url, headers=headers, proxies=proxies)
En-tête Règles de cohérence
- Match Sec-Ch-Ua avec l'agent utilisateur : Si vous demandez Chrome 131, votre
Sec-Ch-Uadoit faire référence à la version 131. - Inclure tous les en-têtes Sec-Fetch : Chrome moderne envoie ces sur chaque navigation. Les rater est un signal fort.
- Définir Accept-Language pour correspondre à votre proxy geo: Un proxy américain avec
Accept-Language: ja-JPest suspect. - Maintenez l'ordre d'en-tête & #160;: Certains systèmes anti-bot vérifient la commande d'en-tête. Utilisez des bibliothèques qui préservent l'ordre d'insertion.
Calque 3: TLS et HTTP/2 Empreintes digitales
Votre bibliothèque client HTTP produit un unique Empreinte TLS que les systèmes anti-bot vérifient contre votre agent utilisateur revendiqué. Un user-agent Chrome avec une empreinte Python TLS est immédiatement signalé.
Atténuation par langue
| Langue | Bibliothèque par défaut | Risque de détection | Variante de la valeur du navigateur |
|---|---|---|---|
| Python | demandes/urllib3 | Très élevé | cffi avec imitation |
| Node.js | axios/got | Élevé | s'est effondré |
| Allez | net/http | Très élevé | uTLS + transport sur mesure |
# Python: Browser-grade TLS with curl_cffi
from curl_cffi import requests as curl_requests
response = curl_requests.get(
"https://example.com",
impersonate="chrome",
proxies={
"http": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080",
"https": "http://USERNAME:PASSWORD@gate.proxyhat.com:8080"
}
)
Couche 4: Empreinte du doigt du navigateur
Si vous utilisez un navigateur sans tête, anti-bot JavaScript sonde votre empreinte du navigateur — Toile, WebGL, AudioContext, propriétés navigateur. Le principe clé est la cohérence interne:
- Tous les signaux d'empreintes digitales doivent être d'accord entre eux
- L'empreinte doit correspondre à vos revendications utilisateur-agent
- L'empreinte digitale doit changer quand vous faites tourner les proxies
Configuration de vol
// Node.js: Puppeteer with stealth and proxy
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());
const browser = await puppeteer.launch({
headless: 'new',
args: [
'--proxy-server=http://gate.proxyhat.com:8080',
'--disable-blink-features=AutomationControlled',
'--window-size=1920,1080'
]
});
const page = await browser.newPage();
await page.authenticate({
username: 'USERNAME',
password: 'PASSWORD'
});
await page.setViewport({ width: 1920, height: 1080 });
Couche 5 : Modèles comportementaux
Même avec l'imitation technique parfaite, les modèles de comportement de type bot déclencheront la détection. Les systèmes anti-bot analysent le calendrier, les modèles de navigation et les signatures d'interaction.
Demande de calendrier
- Ajouter des retards aléatoires : Les humains ne font pas de demandes à intervalles exacts. Ajouter 1-5 secondes de retard aléatoire entre les requêtes.
- Varier les retards par type de page : Les pages de contenu méritent des pauses de « lecture » plus longues que les pages d'inscription.
- Éviter les éclatements : Ne faites pas 50 demandes rapides puis arrêtez. Distribuez les demandes uniformément avec la variance naturelle.
# Python: Natural request timing
import time
import random
def scrape_with_natural_timing(urls, proxies):
for url in urls:
response = requests.get(url, proxies=proxies, headers=headers)
process(response)
# Random delay: 1-4 seconds with normal distribution
delay = max(0.5, random.gauss(2.5, 0.8))
time.sleep(delay)
Modèles de navigation
- Suivez les chemins naturels : Visitez la page d'accueil d'abord, puis les pages de catégorie, puis les pages de détail — ne sautez pas directement aux URLs profondes.
- Définir les en-têtes de référence appropriés : Chaque page doit faire référence à la page précédente.
- Redirections de la poignée : Suivez les redirections HTTP naturellement plutôt que de réessayer l'URL originale.
Gestion des séances
- Maintenir les pots à cookies : Accepter et renvoyer les cookies au cours d'une session — le rejet de tous les cookies est un signal bot.
- Limiter la durée de la session : Après 50-100 requêtes, commencez une nouvelle session avec une nouvelle IP et des cookies.
- Respecter les limites de taux : Si vous recevez 429 réponses, reculez exponentiellement plutôt que de recommencer immédiatement.
Couche 6 : Validation de la réponse
La détection n'entraîne pas toujours un blocage. Les sites peuvent servir différents contenus, injecter des données trompeuses ou retourner des blocs mous. Validez toujours vos réponses :
- Vérifier les codes d'état & #160;: 200 ne signifie pas toujours le succès — certains sites retournent 200 avec des pages CAPTCHA ou du contenu vide.
- Valider la structure du contenu : S'assurer que la réponse contient les éléments attendus (prix des produits, texte de l'article, etc.).
- Surveillance des pots de miel: Liens cachés ou champs de formation conçus pour attraper des rampeurs automatisés.
- Taux de réussite du suivi : Si votre taux de réussite est inférieur à 90 %, quelque chose a changé et nécessite une enquête.
Liste de contrôle complète anti-détection
| Calque | Décision | Priorité |
|---|---|---|
| IP | Utiliser des procurations résidentielles avec géo-cible | Critique |
| IP | Rotation des IP par requête ou session | Critique |
| En-têtes | Envoyer des ensembles d'en-tête complets et réalistes | Critique |
| En-têtes | Corriger la langue acceptée à l'emplacement du mandataire | Élevé |
| TLS | Utiliser la bibliothèque TLS de niveau navigateur | Critique |
| TLS | Correspond à l'empreinte TLS du navigateur revendiqué | Critique |
| Navigateur | Utilisez des plugins furtifs pour les navigateurs sans tête | Élevé |
| Navigateur | Maintenir des profils d'empreintes digitales cohérents | Élevé |
| Comportement | Ajouter des retards aléatoires entre les demandes | Élevé |
| Comportement | Suivre les chemins de navigation naturels | Moyenne |
| Comportement | Maintenir les cookies pendant les sessions | Moyenne |
| Validation | Vérifiez le contenu de la réponse, pas seulement les codes d'état | Élevé |
Exemple : Grattoir anti-détection complet
# Python: Complete anti-detection scraper setup
from curl_cffi import requests as curl_requests
import time
import random
class StealthScraper:
def __init__(self, proxy_user, proxy_pass):
self.proxy = f"http://{proxy_user}:{proxy_pass}@gate.proxyhat.com:8080"
self.session = curl_requests.Session(impersonate="chrome")
self.session.proxies = {
"http": self.proxy,
"https": self.proxy
}
self.request_count = 0
def get(self, url, referer=None):
headers = {}
if referer:
headers["Referer"] = referer
response = self.session.get(url, headers=headers, timeout=30)
self.request_count += 1
# Rotate session every 50-80 requests
if self.request_count >= random.randint(50, 80):
self._rotate_session()
# Natural delay
time.sleep(max(0.5, random.gauss(2.0, 0.6)))
return response
def _rotate_session(self):
self.session = curl_requests.Session(impersonate="chrome")
self.session.proxies = {
"http": self.proxy,
"https": self.proxy
}
self.request_count = 0
# Usage
scraper = StealthScraper("USERNAME", "PASSWORD")
home = scraper.get("https://example.com")
listing = scraper.get("https://example.com/products", referer="https://example.com")
detail = scraper.get("https://example.com/products/123", referer="https://example.com/products")
Quand escalader votre approche
Commencez par l'approche la plus simple et augmentez seulement au besoin:
- Niveau 1 — Client HTTP + en-têtes + proxy: Fonctionne pour la plupart des sites. Utilisation
curl_cffiougot-scrapingavec ProxyHat proxies. - Niveau 2 — Ajouter TLS de qualité navigateur: Requis lorsque le site vérifie les empreintes JA3/JA4.
- Niveau 3 — Navigateur sans tête + furtivité: Nécessaire pour le contenu rendu par JavaScript et les systèmes anti-bot sophistiqués.
- Niveau 4 — Automatisation complète du navigateur avec imitation comportementale: Réservé pour les sites les plus protégés (Cloudflare Enterprise, PerimeterX, etc.).
Pour les modèles d'implémentation dans des langues spécifiques, consultez nos guides : Python, Node.jset Allez.
Lignes directrices éthiques
Les techniques antidétection sont des outils — leur utilisation éthique dépend du contexte. Toujours :
- Respecter robots.txt et conditions de service
- Grape uniquement les données accessibles au public
- Limiter les taux de requête pour éviter l'impact du serveur
- Respecter la réglementation en matière de protection des données (RGPD, CCPA)
- Utilisation pratiques éthiques de grattage comme base de référence
L'objectif de la lutte contre la détection n'est pas de contourner la sécurité légitime. Il est de s'assurer que votre accès automatisé aux données publiques n'est pas incorrectement signalé comme malveillant.






