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-Languagecohé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-DEgarantit 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-UScombiné àgl=USethl=enassure 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-cardest 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
hletglcohé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.txtde chaque plateforme. Sirobots.txtinterdit 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 viasession-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) aveccountry-US+ paramètreshl/glpour 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:8080pour HTTP,:1080pour 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.






