Le proxy renvoie des données incorrectes : causes et solutions
Vous avez configuré votre parseur, lancé la collecte de données, et le résultat est des prix d'une autre région, du contenu obsolète, ou une page complètement différente. Nous allons examiner pourquoi votre proxy peut renvoyer des données erronées et comment y remédier.
1. Mise en cache côté proxy
La cause la plus fréquente de données obsolètes est la mise en cache. Certains serveurs proxy sauvegardent les réponses des sites pour réduire la charge et accélérer le traitement. En conséquence, vous obtenez des données vieilles d'une semaine au lieu des données actuelles.
Comment identifier le problème
- Les données ne changent pas lors de requêtes répétées
- Les prix ou la disponibilité des produits ne correspondent pas à la réalité
- L'en-tête
Agedans la réponse affiche une valeur élevée
Solution
Ajoutez des en-têtes interdisant la mise en cache :
import requests
headers = {
'Cache-Control': 'no-cache, no-store, must-revalidate',
'Pragma': 'no-cache',
'Expires': '0'
}
response = requests.get(
'https://example.com/prices',
proxies={'http': proxy, 'https': proxy},
headers=headers
)
Si le fournisseur met toujours en cache, ajoutez un paramètre aléatoire à l'URL :
import time
url = f'https://example.com/prices?_nocache={int(time.time())}'
2. Incohérence de la géolocalisation
Vous demandez un proxy depuis l'Allemagne, mais vous recevez des prix en roubles. Ou inversement : vous avez besoin de données russes, mais le site affiche le contenu pour les États-Unis. Cela se produit pour plusieurs raisons.
Pourquoi la géolocalisation ne correspond pas
| Cause | Description |
|---|---|
| Bases GeoIP obsolètes | L'IP a récemment changé de région, mais les bases n'ont pas encore été mises à jour |
| Le site utilise sa propre base | Le site cible détermine la géolocalisation différemment du fournisseur de proxy |
| Cookies de session précédente | Le site a mémorisé votre région lors d'une visite antérieure |
| Accept-Language | L'en-tête de langue ne correspond pas à la géolocalisation du proxy |
Solution
Synchronisez tous les paramètres de la requête avec la géolocalisation souhaitée :
# Pour le scraping d'un site allemand
headers = {
'Accept-Language': 'de-DE,de;q=0.9,en;q=0.8',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)...'
}
# Session propre sans cookies
session = requests.Session()
session.cookies.clear()
response = session.get(
'https://example.de/preise',
proxies={'http': german_proxy, 'https': german_proxy},
headers=headers
)
Vérifiez la géolocalisation réelle de l'IP avant le scraping :
def check_proxy_geo(proxy):
response = requests.get(
'http://ip-api.com/json/',
proxies={'http': proxy, 'https': proxy},
timeout=10
)
data = response.json()
return data.get('country'), data.get('city')
3. Problèmes de rotation d'IP
Lors de l'utilisation de proxies résidentiels avec rotation automatique, l'IP change entre les requêtes. C'est utile pour contourner les limites, mais cela pose problème lorsqu'une cohérence des données est nécessaire.
Symptômes typiques
- La pagination renvoie des doublons ou saute des éléments
- Le panier se vide entre les requêtes
- L'authentification échoue au milieu d'une session
- Les tests A/B du site affichent des versions de page différentes
Solution : sessions persistantes (sticky sessions)
La plupart des fournisseurs de proxy prennent en charge les « sessions collantes » — l'IP est conservée pendant une certaine durée. Ceci est généralement configuré via un paramètre dans la chaîne de connexion :
# Exemple de format avec ID de session (la syntaxe dépend du fournisseur)
proxy = 'http://user-session-abc123:pass@gate.provider.com:7777'
# Toutes les requêtes avec le même ID de session passent par la même IP
for page in range(1, 10):
response = requests.get(
f'https://example.com/catalog?page={page}',
proxies={'http': proxy, 'https': proxy}
)
Important : Une session persistante dure généralement de 1 à 30 minutes. Planifiez votre collecte de données de manière à ce que les requêtes liées tiennent dans cette fenêtre.
4. Rupture des sessions et des cookies
Les sites modernes utilisent activement les cookies pour la personnalisation. Si votre parseur ne les gère pas correctement, vous obtiendrez des données erronées — ou vous serez bloqué.
Erreurs fréquentes
- Ignorer Set-Cookie — le site ne peut pas suivre la session
- Réutiliser des cookies avec une autre IP — comportement suspect
- Absence de requête initiale — accès direct à une page interne sans « connexion » via la page d'accueil
Approche correcte
import requests
def create_browser_session(proxy):
session = requests.Session()
session.proxies = {'http': proxy, 'https': proxy}
# Simuler une première visite — obtenir les cookies
session.get('https://example.com/', headers={
'User-Agent': 'Mozilla/5.0...',
'Accept': 'text/html,application/xhtml+xml...',
'Accept-Language': 'en-US,en;q=0.9'
})
# Maintenant, vous pouvez scraper avec une session valide
return session
session = create_browser_session(proxy)
data = session.get('https://example.com/api/prices').json()
5. Erreurs d'encodage et de compression
Parfois, les données arrivent correctement, mais s'affichent de manière incorrecte en raison de problèmes d'encodage ou de compression. Ceci est particulièrement pertinent lors du travail avec des caractères cyrilliques et asiatiques.
Symptômes
- Caractères incompréhensibles au lieu du texte :
Ценаau lieu de « Цена » - Réponse vide lorsque gzip est activé
- Déchets binaires au lieu de HTML
Solution
import requests
response = requests.get(url, proxies=proxies)
# Méthode 1 : Détection automatique de l'encodage
response.encoding = response.apparent_encoding
text = response.text
# Méthode 2 : Encodage forcé
text = response.content.decode('utf-8')
# Méthode 3 : Désactiver la compression (si le proxy casse gzip)
headers = {'Accept-Encoding': 'identity'}
response = requests.get(url, proxies=proxies, headers=headers)
6. Blocages masqués et CAPTCHAs
Tous les blocages ne sont pas évidents. Le site peut renvoyer un HTTP 200, mais insérer une fausse page, un cache obsolète ou une page de CAPTCHA à l'intérieur du HTML normal.
Signes de blocage masqué
- La taille de la réponse est suspectement petite ou identique pour différentes pages
- Présence des mots : captcha, challenge, blocked, access denied dans le HTML
- Absence des éléments attendus (prix, descriptions, boutons)
- Redirection JavaScript vers une autre page
Validation de la réponse
def is_valid_response(response, expected_markers):
"""Vérifie que la réponse contient de vraies données"""
text = response.text.lower()
# Vérification du blocage
block_signals = ['captcha', 'blocked', 'access denied',
'rate limit', 'try again later']
for signal in block_signals:
if signal in text:
return False, f'Bloqué : {signal}'
# Vérification de la présence des marqueurs attendus
for marker in expected_markers:
if marker.lower() not in text:
return False, f'Manquant : {marker}'
# Vérification de la taille (trop petite = fausse page)
if len(response.content) < 5000:
return False, 'Réponse trop courte'
return True, 'OK'
# Utilisation
valid, reason = is_valid_response(response, ['price', 'add to cart'])
if not valid:
print(f'Réponse invalide : {reason}')
# Changer de proxy, attendre, réessayer
Pour les sites avec une protection anti-bot sérieuse, les proxies mobiles offrent un meilleur niveau de confiance que les proxies datacenter.
7. Diagnostic étape par étape
Lorsqu'un proxy renvoie des données erronées, utilisez cet algorithme pour trouver la cause :
Étape 1 : Isoler le problème
# Comparer les réponses : sans proxy vs avec proxy
def compare_responses(url, proxy):
direct = requests.get(url)
proxied = requests.get(url, proxies={'http': proxy, 'https': proxy})
print(f'Direct : {len(direct.content)} octets, statut {direct.status_code}')
print(f'Proxied: {len(proxied.content)} octets, statut {proxied.status_code}')
# Sauvegarder les deux réponses pour comparaison
with open('direct.html', 'w') as f:
f.write(direct.text)
with open('proxied.html', 'w') as f:
f.write(proxied.text)
Étape 2 : Vérifier les en-têtes de réponse
response = requests.get(url, proxies=proxies)
# En-têtes clés pour le diagnostic
important_headers = ['content-type', 'content-encoding',
'cache-control', 'age', 'x-cache',
'cf-ray', 'server']
for header in important_headers:
value = response.headers.get(header, 'non défini')
print(f'{header}: {value}')
Étape 3 : Liste de contrôle des vérifications
| Vérification | Commande/méthode |
|---|---|
| IP réelle du proxy | curl -x proxy:port ifconfig.me |
| Géolocalisation de l'IP | ip-api.com/json |
| Mise en cache | En-têtes Age, X-Cache |
| Blocage | Recherche de « captcha », « blocked » dans le HTML |
| Encodage | Content-Type charset |
Étape 4 : Script de diagnostic complet
import requests
import json
def diagnose_proxy(proxy, target_url):
report = {}
# 1. Vérification de la fonctionnalité
try:
r = requests.get('http://httpbin.org/ip',
proxies={'http': proxy, 'https': proxy},
timeout=15)
report['proxy_ip'] = r.json().get('origin')
report['proxy_works'] = True
except Exception as e:
report['proxy_works'] = False
report['error'] = str(e)
return report
# 2. Géolocalisation
r = requests.get('http://ip-api.com/json/',
proxies={'http': proxy, 'https': proxy})
geo = r.json()
report['country'] = geo.get('country')
report['city'] = geo.get('city')
# 3. Requête vers le site cible
r = requests.get(target_url,
proxies={'http': proxy, 'https': proxy},
timeout=30)
report['status_code'] = r.status_code
report['content_length'] = len(r.content)
report['cached'] = 'age' in r.headers or 'x-cache' in r.headers
# 4. Vérification du blocage
block_words = ['captcha', 'blocked', 'denied', 'cloudflare']
report['possibly_blocked'] = any(w in r.text.lower() for w in block_words)
return report
# Utilisation
result = diagnose_proxy('http://user:pass@proxy:port', 'https://target-site.com')
print(json.dumps(result, indent=2))
Conclusion
Des données incorrectes provenant d'un proxy sont presque toujours un problème résoluble. Dans la majorité des cas, la cause réside dans la mise en cache, l'incohérence de la géolocalisation ou une mauvaise gestion des sessions. Utilisez le script de diagnostic de cet article pour identifier rapidement la source du problème.
Pour les tâches où la précision de la géolocalisation et un faible taux de blocage sont critiques, les proxies résidentiels prenant en charge les sessions persistantes sont optimaux — plus de détails sur proxycove.com.