Comment les Proxies Aident à Scraper les Avis : Guide Pratique Multi-Sites

Guide pratique pour scraper les avis publics sur Trustpilot, G2 et Google Business avec des proxies résidentiels. Inclut des exemples Python et Node.js avec rotation d'IP et sessions persistantes.

How Proxies Help You Scrape Reviews Data: Trustpilot, G2 & Google Business
Dans cet article

Les avis clients sont une mine d'or pour la recherche marché, le suivi de marque et l'analyse concurrentielle. Mais récupérer ces données à grande échelle se heurte rapidement aux limites de débit, aux blocages anti-bot et à la personnalisation géographique. Comment les proxies aident à scraper les avis ? En distribuant vos requêtes sur un pool d'adresses IP résidentielles, vous évitez les blocages et accédez à des données cohérentes par locale. Ce guide pratique couvre Trustpilot, G2 et Google Business avec du code exécutable.

Avertissement : Cet article ne traite que de la collecte de données publiques et accessibles sans connexion. Respectez les Conditions d'Utilisation de chaque plateforme, le fichier robots.txt, les lois applicables (CFAA aux États-Unis, RGPD dans l'UE) et ne collectez jamais de données personnelles identifiables au-delà de ce qui est publiquement visible.

Comment les proxies aident à scraper les avis : comprendre le problème

Les plateformes d'avis appliquent des stratégies anti-scraping agressives. Trois mécanismes principaux bloquent les collecteurs naïfs :

  • Limites de débit (rate limiting) : Trustpilot, G2 et Google plafonnent le nombre de requêtes par IP et par fenêtre temporaire. Un seul IP effectuant 50 requêtes par minute déclenche un HTTP 429 ou un challenge CAPTCHA.
  • Personnalisation géographique : Google Business et G2 adaptent les avis affichés selon la géolocalisation de l'IP. Un serveur français verra un sous-ensemble d'avis différent d'un serveur américain, ce qui fausse les comparaisons.
  • Détection d'empreinte (fingerprinting) : Au-delà de l'IP, les plateformes analysent les en-têtes HTTP, l'ordre des TLS fingerprints et le comportement de navigation. Une requête sans en-tête Accept-Language cohérent avec l'IP est immédiatement suspecte.

Un proxy résidentiel rotatif résout ces trois problèmes : chaque requête provient d'une IP domestique réelle dans le pays ciblé, avec une rotation automatique qui empêche tout déclenchement de limite de débit. Pour un volume de 100 sessions simultanées, un pool résidentiel maintient un taux de succès supérieur à 95%, là où un datacenter proxy tombe sous 40% après les 20 premières requêtes sur G2.

Pour comprendre pourquoi la géolocalisation compte, consultez la documentation Google sur la localisation : les paramètres hl (langue d'interface) et gl (pays) contrôlent explicitement quel contenu est renvoyé.

Scraper les avis Trustpilot : pagination et JSON embarqué

Trustpilot est la plateforme la plus accessible des trois. Les profils d'entreprise publics exposent une pagination simple via ?page=N et, surtout, embarquent les données dans un objet JSON __NEXT_DATA__ directement dans le HTML. Parser ce JSON est infiniment plus robuste que d'extraire des divs CSS sujets à changement.

La stratégie : une session résidentielle par page (rotation), avec un pays cible fixe (par exemple DE pour des avis allemands cohérents).

import requests
import json
from bs4 import BeautifulSoup
import time

def get_proxy(session_id):
    return {
        'http': f'http://user-country-DE-session-{session_id}:pass@gate.proxyhat.com:8080',
        'https': f'http://user-country-DE-session-{session_id}:pass@gate.proxyhat.com:8080',
    }

def scrape_trustpilot(domain, max_pages=10):
    all_reviews = []
    for page in range(1, max_pages + 1):
        url = f'https://www.trustpilot.com/review/{domain}?page={page}'
        proxies = get_proxy(f'tp{page}')
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
            'Accept-Language': 'en-US,en;q=0.9',
        }
        resp = requests.get(url, proxies=proxies, headers=headers, timeout=30)

        soup = BeautifulSoup(resp.text, 'html.parser')
        next_data = soup.find('script', id='__NEXT_DATA__')
        if not next_data:
            print(f'Page {page}: pas de __NEXT_DATA__, arrêt.')
            break

        data = json.loads(next_data.string)
        reviews = data['props']['pageProps'].get('reviews', [])
        if not reviews:
            break

        for r in reviews:
            all_reviews.append({
                'author': r.get('consumer', {}).get('displayName'),
                'rating': r.get('rating'),
                'title': r.get('title'),
                'text': r.get('text'),
                'date': r.get('dates', {}).get('publishedDate'),
            })

        time.sleep(2)
        print(f'Page {page}: {len(reviews)} avis extraits')

    return all_reviews

reviews = scrape_trustpilot('example.com', max_pages=5)
print(f'Total: {len(reviews)} avis')

Points clés de cette approche :

  • Chaque page utilise un identifiant de session différent (tp1, tp2...), ce qui force la rotation d'IP via ProxyHat.
  • Le paramètre country-DE garantit que toutes les requêtes proviennent d'IPs allemandes, pour un ensemble d'avis cohérent.
  • Le parsing du JSON __NEXT_DATA__ évite la fragilité des sélecteurs CSS. La structure JSON est stable même si le design change.
  • Un délai de 2 secondes entre les pages reste respectueux et réduit le risque de blocage.

Pour des volumes plus importants, consultez la tarification ProxyHat et ajustez la concurrence selon votre plan.

Scraper les avis G2 avec un proxy : gérer l'anti-bot

G2 applique une posture anti-bot nettement plus agressive que Trustpilot. Outre les limites de débit, G2 utilise des challenges JavaScript, une détection de TLS fingerprint et un filtrage basé sur la réputation de l'IP. Les proxies datacenter sont presque immédiatement bloqués — un proxy résidentiel est indispensable.

La stratégie pour G2 : IPs résidentielles américaines (la majorité du contenu G2 est US-centric), en-têtes HTTP réalistes et complets, et un délai aléatoire entre les requêtes.

import requests
import time
import random

PROXY = 'http://user-country-US:pass@gate.proxyhat.com:8080'
proxies = {'http': PROXY, 'https': PROXY}

headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) '
                  'AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/120.0.0.0 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.9',
    'Accept-Encoding': 'gzip, deflate, br',
    'DNT': '1',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1',
}

def scrape_g2_product(slug, max_pages=5):
    all_reviews = []
    for page in range(1, max_pages + 1):
        url = f'https://www.g2.com/products/{slug}/reviews?page={page}'
        resp = requests.get(url, proxies=proxies, headers=headers, timeout=30)

        if resp.status_code == 403:
            print(f'Blocage page {page}, pause prolongee...')
            time.sleep(random.uniform(15, 30))
            continue
        if resp.status_code == 429:
            print(f'Rate limite page {page}, arret.')
            break

        print(f'Page {page}: status {resp.status_code}, '
              f'longueur {len(resp.text)}')
        # Parser le HTML avec BeautifulSoup pour extraire
        # les avis, notes et distributions d'etoiles.
        # G2 structure les avis dans des divs avec des
        # attributs data-specificaux.

        time.sleep(random.uniform(3, 6))

    return all_reviews

scrape_g2_product('slack', max_pages=3)

Conseils spécifiques à G2 :

  • Le délai aléatoire de 3 à 6 secondes simule un comportement humain. Un délai fixe est un signal de bot.
  • Si vous recevez un 403, ne réessayez pas immédiatement. Une pause de 15 à 30 secondes avec une nouvelle IP (ProxyHat rotationne automatiquement) est plus efficace.
  • G2 peut renvoyer une page challenge Cloudflare. Dans ce cas, un proxy résidentiel avec une session persistante et des en-têtes cohérents est la meilleure défense.

Découvrez plus de cas d'usage sur notre page web scraping.

Scraping des avis Google Business : géolocalisation et cohérence

Google Business/Maps présente un défi unique : les avis affichés dépendent fortement de la locale de l'utilisateur. Les paramètres hl (langue) et gl (pays) dans l'URL contrôlent quelles reviews apparaissent et dans quelle langue. Sans un pays cible fixe, vous obtenez des résultats incohérents d'une page à l'autre.

La stratégie : utiliser une session résidentielle sticky avec country-US pour garantir que toutes les requêtes d'un profil proviennent de la même région américaine, combinée avec les paramètres hl et gl dans l'URL.

import requests

# Session sticky : meme IP pour toutes les pages d'un profil
PROXY = 'http://user-country-US-session-abc123:pass@gate.proxyhat.com:8080'
proxies = {'http': PROXY, 'https': PROXY}

params = {
    'hl': 'en',
    'gl': 'US',
}

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
                  'AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/120.0.0.0 Safari/537.36',
    'Accept-Language': 'en-US,en;q=0.9',
}

def scrape_google_business(place_id, max_pages=5):
    base_url = 'https://www.google.com/maps/place/'
    all_reviews = []

    for page in range(1, max_pages + 1):
        # Construire l'URL avec les parametres de locale
        url = f'{base_id}?hl={params["hl"]}&gl={params["gl"]}'
        resp = requests.get(url, proxies=proxies, headers=headers,
                            timeout=30)

        if resp.status_code != 200:
            print(f'Page {page}: erreur {resp.status_code}')
            break

        # Google Maps embarque les donnees dans des scripts JSON.
        # Extraire les reviews via parsing du contenu embarque.
        print(f'Page {page}: status {resp.status_code}, '
              f'longueur {len(resp.text)}')

        # Pour un scraping robuste de Google Business, envisagez
        # l'API officielle Places ou parsing des donnees embarquees.
        time.sleep(3)

    return all_reviews

# Exemple: scraper un etablissement
scrape_google_business('ChIJN1tTDeegx0RQRJaKnlLNCmQ')

Pourquoi la session sticky (session-abc123) est cruciale ici :

  • Google peut afficher différents avis selon la région de l'IP. Une session persistante garantit que toutes les pages d'un même profil proviennent de la même zone géographique.
  • Si vous scrapez plusieurs établissements, changez l'identifiant de session (session-def456, session-ghi789...) pour obtenir une nouvelle IP par établissement.
  • Le paramètre country-US combiné à gl=US et hl=en assure une cohérence totale de la locale.

Consultez la liste des localisations ProxyHat pour cibler d'autres pays.

Comparaison des plateformes d'avis

Plateforme Difficulté anti-bot Format des données Proxy recommandé Stratégie de session
Trustpilot Modérée JSON __NEXT_DATA__ embarqué Résidentiel rotatif Rotation par page
G2 Élevée (Cloudflare) HTML structuré Résidentiel US Rotation + délais aléatoires
Google Business Élevée (JS + geo) Scripts JSON embarqués Résidentiel sticky par profil Session persistante par établissement

Exemple Node.js : scraping multi-sites avec ProxyHat

Pour les équipes JavaScript, voici un exemple Node.js utilisant axios avec le proxy ProxyHat. Cet exemple montre la rotation d'IP pour Trustpilot, adaptable à d'autres plateformes.

const axios = require('axios');

async function scrapeReviews(baseUrl, maxPages) {
    const allReviews = [];

    for (let page = 1; page <= maxPages; page++) {
        const url = baseUrl + '?page=' + page;
        const sessionId = 'tp' + page;
        try {
            const resp = await axios.get(url, {
                proxy: {
                    protocol: 'http',
                    host: 'gate.proxyhat.com',
                    port: 8080,
                    auth: {
                        username: 'user-country-DE-session-' + sessionId,
                        password: 'pass'
                    }
                },
                timeout: 30000,
                headers: {
                    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
                    'Accept-Language': 'en-US,en;q=0.9'
                }
            });

            // Extraire le JSON __NEXT_DATA__ du HTML
            const html = resp.data;
            const marker = '__NEXT_DATA__';
            const markerIdx = html.indexOf(marker);
            if (markerIdx === -1) {
                console.log('Page ' + page + ': donnees introuvables');
                continue;
            }

            const jsonStart = html.indexOf('{', markerIdx);
            const jsonEnd = html.lastIndexOf('}') + 1;
            const jsonStr = html.slice(jsonStart, jsonEnd);
            const data = JSON.parse(jsonStr);

            const reviews = (data.props && data.props.pageProps)
                ? data.props.pageProps.reviews || []
                : [];
            allReviews.push(...reviews);
            console.log('Page ' + page + ': ' + reviews.length + ' avis');

            await new Promise(function(r) { setTimeout(r, 2000); });
        } catch (err) {
            console.error('Page ' + page + ' echouee: ' + err.message);
        }
    }

    return allReviews;
}

scrapeReviews('https://www.trustpilot.com/review/example.com', 5)
    .then(function(r) {
        console.log('Total: ' + r.length + ' avis');
    });

Notez l'utilisation de user-country-DE-session-tp1, user-country-DE-session-tp2, etc. Chaque page obtient une IP résidentielle différente tout en restant dans la même zone géographique. La documentation ProxyHat détaille tous les paramètres de session disponibles.

Erreurs courantes et cas limites

  • Parser du HTML fragile au lieu du JSON embarqué : Sur Trustpilot, extraire des sélecteurs CSS comme div.review-card est fragile. Le JSON __NEXT_DATA__ contient toutes les données structurées et est stable entre les refontes visuelles.
  • Utiliser un proxy datacenter pour G2 : G2 bloque la plupart des plages d'IP datacenter connues. Un proxy résidentiel est obligatoire. Les proxies datacenter fonctionnent peut-être pour les 5 premières requêtes, mais le taux de succès chute rapidement sous 20%.
  • Ignorer la cohérence de locale : Si vous scrapez des avis Google Business sans paramètres hl et gl cohérents avec l'IP du proxy, vous obtenez un mélange de langues et de régions qui rend l'analyse inutilisable.
  • Délais fixes entre les requêtes : Un délai exact de 2.0 secondes à chaque fois est un signal de bot. Utilisez des délais aléatoires (par exemple random.uniform(2, 5)).
  • Ne pas gérer les codes 429 et 403 : Implémentez un backoff exponentiel : 5 secondes au premier 429, 15 au second, 60 au troisième. Puis changez d'IP via une nouvelle session.
  • Connexion requise vs données publiques : Certaines reviews ne sont visibles qu'après connexion. Ne tentez pas de contourner l'authentification — cela viole les ToS et expose à des risques juridiques. Limitez-vous aux données publiquement accessibles.

Scraping éthique et alternatives API

Le scraping d'avis doit respecter un cadre éthique strict :

  • Respectez le robots.txt de chaque plateforme. Si robots.txt interdit le chemin /reviews/, n'y accédez pas.
  • Limitez le volume et la fréquence. 200ms entre les requêtes est un minimum ; 2 à 5 secondes est préférable pour les sites d'avis.
  • Ne collectez pas de PII au-delà du pseudo public. Le nom affiché sur un avis est public, mais l'email, le téléphone ou l'adresse de l'auteur ne le sont pas — ne les cherchez pas.
  • Considérez les API officielles d'abord. Google propose l'API Places pour les avis d'établissements. Trustpilot propose une API pour les partenaires. Si une API officielle couvre votre besoin, utilisez-la — c'est plus fiable et légalement plus sûr.
  • Le RGPD s'applique aux avis. Un avis contient des données personnelles (nom, opinion). Stocker et traiter ces données en UE nécessite une base légale et une politique de confidentialité. Consultez les guidelines CNIL sur le RGPD.

Quand utiliser les API officielles plutôt que le scraping :

  • Google Places API : fiable, documentée, avec quotas généreux pour les avis. Coût : environ 17 USD pour 1000 requêtes Place Details.
  • Trustpilot Business API : disponible pour les entreprises vérifiées, avec accès aux avis de leur propre profil.
  • Quand aucune API n'existe pour le cas d'usage (avis concurrents, analyse de marché multi-marques), le scraping de données publiques avec proxies résidentiels reste une approche légitime, à condition de respecter les ToS et les lois applicables.

Pour approfondir vos stratégies de scraping, lisez notre guide sur le SERP tracking.

Points clés à retenir

  • Les proxies résidentiels sont essentiels pour scraper les avis : ils offrent des IP réelles, contournent les blocages anti-bot et garantissent la cohérence géographique.
  • Trustpilot : parsez le JSON __NEXT_DATA__ plutôt que le HTML. Rotation d'IP par page via session-tp{N}.
  • G2 : proxy résidentiel US obligatoire, en-têtes réalistes, délais aléatoires de 3 à 6 secondes. Gérez les 403 avec backoff.
  • Google Business : session sticky (session-abc123) avec country-US + paramètres hl/gl pour une locale cohérente.
  • Éthique : données publiques uniquement, respectez robots.txt, pas de PII, préférez les API officielles quand elles existent.
  • ProxyHat : gate.proxyhat.com:8080 pour HTTP, :1080 pour SOCKS5. Paramètres de geo et session dans le nom d'utilisateur.

Prêt à construire votre pipeline d'avis ? Découvrez nos offres residential proxies ou consultez la documentation ProxyHat pour démarrer.

Questions fréquentes

Comment les proxies aident-ils à scraper les avis ?

Les proxies résidentiels distribuent vos requêtes sur de multiples adresses IP réelles, ce qui empêche les plateformes d'avis de détecter et bloquer un seul IP effectuant trop de requêtes. De plus, le ciblage géographique (country-US, country-DE) garantit que les avis récupérés sont cohérents avec une locale donnée, évitant les résultats personnalisés et incohérents.

Pourquoi utiliser des proxies résidentiels plutôt que datacenter pour scraper les avis ?

Les plateformes comme G2 et Google Business filtrent activement les plages d'IP datacenter connues. Un proxy datacenter peut être bloqué après 5 à 20 requêtes, tandis qu'un proxy résidentiel maintient un taux de succès supérieur à 95% car les IPs proviennent de vrais FAI et sont indiscernables du trafic normal.

Quel type de proxy est le mieux adapté pour scraper les avis ?

Les proxies résidentiels rotatifs sont le meilleur choix pour le scraping d'avis. Pour Trustpilot, une rotation par page suffit. Pour Google Business, une session sticky (session-abc123) avec un pays cible fixe est préférable pour maintenir la cohérence de locale à travers un profil complet. Les proxies mobiles sont une alternative robuste mais plus coûteuse.

Comment éviter les blocages lors du scraping d'avis ?

Utilisez des proxies résidentiels rotatifs, des en-têtes HTTP réalistes (User-Agent, Accept-Language cohérents avec l'IP), des délais aléatoires entre 2 et 6 secondes, et un backoff exponentiel sur les codes 429 et 403. Parsez les JSON embarqués plutôt que le HTML fragile, et respectez le robots.txt de chaque plateforme.

Prêt à commencer ?

Accédez à plus de 50M d'IPs résidentielles dans plus de 148 pays avec filtrage IA.

Voir les tarifsProxies résidentiels
← Retour au Blog