Retour au blog

Données incorrectes renvoyées par le proxy : causes et solutions

Causes fréquentes des données erronées des proxys : du cache aux problèmes de géolocalisation. Solutions pratiques pour chaque cas.

📅12 décembre 2025
```html

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 Age dans 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

  1. Ignorer Set-Cookie — le site ne peut pas suivre la session
  2. Réutiliser des cookies avec une autre IP — comportement suspect
  3. 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.

```