Avertissement légal : Le scraping de Glassdoor doit respecter les Conditions d'Utilisation de la plateforme, le Computer Fraud and Abuse Act (CFAA) aux États-Unis et le RGPD dans l'Union européenne. Ce guide couvre uniquement l'accès à des données publiques agrégées et non personnelles. Ne scrapez jamais derrière une authentification, et consultez un avocat avant tout déploiement à grande échelle.
Pour les équipes d'analytics RH et les data engineers du marché du travail, apprendre à scraper Glassdoor de manière fiable est devenu un défi technique sérieux. Glassdoor protège ses pages avec DataDome et Cloudflare Bot Management, ce qui rend les approches naïves avec requests ou axios quasi inutilisables. Ce guide explique comment construire un Glassdoor reviews scraper robuste en 2026, quelles données sont accessibles sans login, et pourquoi les proxies résidentiels rotatifs sont indispensables.
Pourquoi scraper les avis Glassdoor en 2026 est difficile
Glassdoor combine deux couches anti-bot : DataDome, qui score les adresses IP et les empreintes TLS, et Cloudflare Bot Management, qui sert des challenges JavaScript et vérifie la cohérence de l'empreinte TLS du client. Une requête curl standard avec la signature TLS d'OpenSSL est immédiatement classée comme bot et reçoit une réponse 403 ou une page de challenge interminable.
Le problème existe parce que Glassdoor monétise des données sensibles — avis d'employés, fourchettes salariales — et veut empêcher la revente non autorisée. La conséquence directe : un scraper sérieux doit imiter à la fois le TLS d'un vrai navigateur Chrome et distribuer ses requêtes sur des adresses IP résidentielles pour éviter le scoring IP de DataDome.
Données publiques vs données derrière authentification
Toutes les données de Glassdoor ne sont pas équivalentes. Voici ce qui est accessible sans login et ce qui ne l'est pas :
| Type de donnée | Accessible sans login ? | Notes |
|---|---|---|
| Page entreprise (/Overview/…) | Oui | Note globale, secteur, taille |
| Avis tronqués (/Reviews/<company>-Reviews-E<id>.htm) | Oui (partiellement) | Pros/cons coupés après ~600 caractères |
| Décompte d'avis par note | Oui | Visible dans le HTML public |
| Salaires détaillés par poste | Non | Derrière auth wall — ne pas scraper |
| Avis complets (texte intégral) | Non | Connexion requise |
Ce guide se limite aux avis tronqués publics et aux métadonnées agrégées. Les Glassdoor salary data détaillées derrière login sont exclues — leur extraction violerait les ToS et exposerait des données personnelles au sens du RGPD.
L'architecture anti-bot de Glassdoor : DataDome + Cloudflare
Glassdoor utilise DataDome comme protection principale. DataDome analyse plus de 40 signaux par requête : empreinte TLS JA3/JA4, en-têtes HTTP dans le bon ordre, fréquence par IP, réputation ASN. Une seule requête avec un TLS mismatch suffit à déclencher un blocage qui peut durer 24 heures sur l'IP concernée.
Cloudflare ajoute une couche de JS challenge. La solution pratique en Python est curl_cffi, une bibliothèque qui réplique l'empreinte TLS de Chrome via BoringSSL. Contrairement à requests, curl_cffi produit un handshake TLS indiscernable d'un vrai Chrome 120+.
pip install curl_cffi
Avec impersonate="chrome", curl_cffi envoie automatiquement les cipher suites, extensions et ordre d'en-têtes attendus par DataDome. C'est la base non négociable de tout scraper Glassdoor en 2026.
Les endpoints GraphQL /bff/ et /graph de Glassdoor
Au-delà du HTML, Glassdoor expose des endpoints JSON non documentés qui retournent des données structurées :
/bff/graphql— endpoint principal pour les avis paginés/graph— endpoint alternatif pour les métadonnées d'entreprise
Ces endpoints attendent une requête POST GraphQL et exigent un en-tête gd-csrf-token. Ce token est généré côté client à partir d'un cookie gdId posé lors de la première visite. Le flux typique :
- Requête GET sur la page /Reviews/… pour récupérer les cookies initiaux (datadome, gdId, etc.)
- Extraction du
gd-csrf-tokendepuis le HTML ou le JavaScript inline - POST GraphQL vers
/bff/graphqlavec le token et les cookies
Pourquoi les proxies résidentiels battent DataDome : DataDome score les IP datacenter avec une pénalité immédiate. Une IP résidentielle française avec une session collante permet de conserver les cookies DataDome valides pendant toute la durée d'extraction d'une entreprise, soit typiquement 50 à 300 requêtes. La rotation par entreprise — et non par requête — est la stratégie gagnante.
Implémentation Python : scraper les avis via BFF GraphQL avec ProxyHat
Voici un exemple complet en Python utilisant curl_cffi et le proxy résidentiel de ProxyHat. Le proxy passe par gate.proxyhat.com:8080 avec une session collante identifiée par session-glassdoor-001.
from curl_cffi import requests
import json
import time
PROXY = "http://user-session-glassdoor001-country-US:pass@gate.proxyhat.com:8080"
def fetch_reviews(company_id, cursor=None, limit=10):
session = requests.Session(impersonate="chrome")
session.proxies = {"http": PROXY, "https": PROXY}
# Étape 1 : GET sur la page publique pour récupérer les cookies
page_url = f"https://www.glassdoor.com/Reviews/company-reviews-E{company_id}.htm"
r = session.get(page_url, timeout=20)
if r.status_code != 200:
raise Exception(f"Page load failed: {r.status_code}")
# Étape 2 : extraire le gd-csrf-token depuis les cookies/en-têtes
csrf_token = session.cookies.get("gd-csrf-token", "")
if not csrf_token:
# Fallback : extraction depuis le HTML
import re
m = re.search(r'gd-csrf-token["\']?\s*[:=]\s*["\']?([a-f0-9]+)', r.text)
csrf_token = m.group(1) if m else ""
# Étape 3 : POST GraphQL
graphql_url = "https://www.glassdoor.com/bff/graphql"
query = """
query GetReviews($employerId: Long!, $cursor: String, $limit: Int) {
employerReviews(employerId: $employerId, after: $cursor, first: $limit) {
edges {
node {
ratingOverall
pros
cons
jobTitle { name }
reviewDateTime
}
}
pageInfo { hasNextPage endCursor }
}
}
"""
payload = {
"query": query,
"variables": {
"employerId": company_id,
"cursor": cursor,
"limit": limit
}
}
headers = {
"Content-Type": "application/json",
"gd-csrf-token": csrf_token,
"Referer": page_url,
"Origin": "https://www.glassdoor.com"
}
r2 = session.post(graphql_url, json=payload, headers=headers, timeout=20)
if r2.status_code == 403:
raise Exception("DataDome block — rotate session")
data = r2.json()
reviews = data["data"]["employerReviews"]
return reviews["edges"], reviews["pageInfo"]
# Utilisation
edges, info = fetch_reviews(company_id=1283, limit=10)
for edge in edges:
node = edge["node"]
print(f"{node['ratingOverall']}★ — {node['jobTitle']['name']}")
print(f"Pros: {node['pros'][:200]}...")
print(f"Cons: {node['cons'][:200]}...")
print("---")
Cet extrait récupère les champs ratingOverall, pros, cons et jobTitle de chaque avis tronqué. Le texte des pros/cons est limité par Glassdoor à environ 600 caractères sans login — c'est délibéré et conforme à notre périmètre de données publiques.
Version Node.js avec undici et proxy résidentiel
import { fetch } from "undici";
const proxyUrl = "http://user-session-glassdoor001-country-US:pass@gate.proxyhat.com:8080";
async function getReviews(companyId) {
const pageRes = await fetch(
`https://www.glassdoor.com/Reviews/company-reviews-E${companyId}.htm`,
{ dispatcher: createProxyAgent(proxyUrl) }
);
const cookies = parseCookies(pageRes.headers.get("set-cookie"));
const csrf = cookies["gd-csrf-token"] || "";
const res = await fetch("https://www.glassdoor.com/bff/graphql", {
method: "POST",
headers: {
"Content-Type": "application/json",
"gd-csrf-token": csrf,
"Referer": pageRes.url
},
body: JSON.stringify({
query: `query { employerReviews(employerId: ${companyId}, first: 10) { edges { node { ratingOverall pros cons } } } }`
}),
dispatcher: createProxyAgent(proxyUrl)
});
return res.json();
}
Pagination, sessions collantes et logique de retry
La pagination GraphQL utilise des curseurs (endCursor / hasNextPage). Pour parcourir tous les avis d'une entreprise de 500+ avis, il faut :
- Session collante : utiliser le même
session-glassdoor-XXXdans le nom d'utilisateur ProxyHat pour toute la pagination d'une entreprise. Cela garde les cookies DataDome valides et évite un nouveau challenge JS à chaque page. - Pacing : espacer les requêtes de 2 à 5 secondes. DataDome déclenche un challenge au-delà d'environ 60 requêtes/minute sur une même IP résidentielle.
- Retry sur 403 : si DataDome renvoie un 403, ne pas réessayer immédiatement. Changer de session (
session-glassdoor-002), attendre 30 secondes, et recharger la page /Reviews depuis zéro pour récupérer de nouveaux cookies.
def scrape_all_reviews(company_id, max_pages=50):
cursor = None
all_reviews = []
for page in range(max_pages):
try:
edges, info = fetch_reviews(company_id, cursor=cursor)
all_reviews.extend(edge["node"] for edge in edges)
if not info["hasNextPage"]:
break
cursor = info["endCursor"]
time.sleep(3) # pacing
except Exception as e:
if "403" in str(e):
print("Block détecté — rotation de session")
time.sleep(30)
continue
raise
return all_reviews
Stratégie de rotation des proxies résidentiels
La rotation par entreprise est plus efficace que la rotation par requête. DataDome tolère 40 à 60 requêtes par minute sur une IP résidentielle propre avant de déclencher un challenge. Pour scraper 100 entreprises :
- Attribuer un identifiant de session unique par entreprise :
session-glassdoor-comp-001,session-glassdoor-comp-002, etc. - Garder la même session pendant toute la pagination de cette entreprise (50 à 300 requêtes).
- Changer de session au passage à l'entreprise suivante.
- Utiliser le géociblage
country-UScar Glassdoor sert plus de contenu aux IP américaines et le scoring DataDome est plus permissif sur les IP résidentielles US.
Consultez la tarification ProxyHat et la page des localisations disponibles pour planifier votre volume. La page use-case web scraping détaille les patterns de rotation avancés. La documentation ProxyHat liste tous les paramètres de session et de géociblage.
Erreurs courantes et cas limites
- Utiliser
requestssans impersonation TLS — 100% de blocage dès la première requête. Utilisezcurl_cffiavecimpersonate="chrome". - Oublier le
gd-csrf-token— l'endpoint GraphQL renvoie 401 sans ce token. Il doit provenir des cookies de la page /Reviews. - Rotation par requête — casse les cookies DataDome et force un challenge JS à chaque appel. Utilisez des sessions collantes.
- Headers incomplets — DataDome vérifie l'ordre et la présence de
sec-ch-ua,accept-language,sec-fetch-dest. curl_cffi gère cela automatiquement en mode impersonation. - Tenter de scraper les salaires derrière login — violation des ToS et du RGPD. Restez sur les avis publics tronqués.
Scraping éthique et quand utiliser une API officielle
Le scraping éthique de Glassdoor repose sur trois principes :
- Données agrégées et non personnelles uniquement. Les avis Glassdoor sont rédigés par des individus identifiables. Ne stockez jamais le nom de l'auteur, l'identifiant utilisateur ou toute donnée permettant de réidentifier un employé. Agrégez par entreprise, par poste et par tranche de note.
- Pas de scraping derrière login. Les salaires détaillés et les avis complets sont derrière authentification. Leur extraction violerait les ToS de Glassdoor et potentiellement le CFAA. Pour les Glassdoor salary data, utilisez plutôt une licence de données officielle Glassdoor for Employers ou des partenaires comme Revelio Labs.
- Conformité RGPD pour les données UE. Si vous scrapez des avis d'employés basés dans l'UE, le RGPD s'applique même aux données publiques. Anonymisez systématiquement, minimisez la rétention (90 jours maximum recommandé), et documentez votre base légale (intérêt légitime pour recherche de marché).
Quand une licence officielle est-elle justifiée ? Si votre cas d'usage implique : publication publique des données, analyse comparative à grande échelle (>10 000 entreprises), ou commercialisation d'un produit dérivé. Dans ces cas, une licence Glassdoor ou un partenaire agrégé est plus sûr, plus fiable et souvent moins coûteux que l'infrastructure de scraping nécessaire pour contourner DataDome durablement.
Points clés à retenir
- Seuls les avis tronqués et les métadonnées d'entreprise sont publics. Les salaires détaillés sont derrière login — ne les scrapez pas.
- DataDome + Cloudflare exigent curl_cffi avec
impersonate="chrome"pour répliquer l'empreinte TLS de Chrome.- L'endpoint
/bff/graphqlretourne des avis structurés JSON mais exige ungd-csrf-tokenextrait des cookies de la page /Reviews.- Les sessions collantes ProxyHat (
session-glassdoor-XXX) conservent les cookies DataDome valides pendant toute la pagination d'une entreprise.- Pacing de 2 à 5 secondes par requête, rotation de session par entreprise, géociblage
country-USpour minimiser les challenges.- Anonymisez, agréez et respectez le RGPD. Pour les données salariales, préférez une licence officielle.
FAQ
Est-il légal de scraper les avis publics de Glassdoor ?
L'accès aux données publiques (sans login) de Glassdoor est techniquement possible mais reste encadré par les Conditions d'Utilisation de la plateforme, le CFAA aux États-Unis et le RGPD dans l'UE. Ce guide ne couvre que les données agrégées non personnelles accessibles sans authentification. Consultez un avocat avant tout déploiement, car la jurisprudence sur le scraping évolue.
Pourquoi utiliser un proxy résidentiel pour scraper Glassdoor ?
DataDome score les adresses IP en temps réel. Les IP datacenter sont immédiatement pénalisées, tandis que les IP résidentielles avec session collante permettent de conserver les cookies DataDome valides pendant 50 à 300 requêtes. La rotation par entreprise — et non par requête — est la stratégie qui maximise le taux de succès tout en respectant les limites de fréquence de DataDome.
Quel type de proxy fonctionne le mieux pour scraper Glassdoor ?
Les proxies résidentiels sont le meilleur choix car ils proviennent d'ISP réels et ne sont pas flaggés par DataDome. Les proxies datacenter sont bloqués quasi instantanément. Les proxies mobiles fonctionnent aussi mais sont plus lents et plus coûteux. Pour Glassdoor, un proxy résidentiel avec géociblage country-US et session collante offre le meilleur rapport coût/efficacité.
Comment éviter les blocages DataDome lors du scraping Glassdoor ?
Utilisez curl_cffi avec impersonate="chrome" pour répliquer l'empreinte TLS de Chrome, des sessions collantes pour conserver les cookies DataDome, un pacing de 2 à 5 secondes par requête, et une rotation de session par entreprise. En cas de 403, changez de session, attendez 30 secondes et rechargez la page /Reviews depuis zéro pour récupérer de nouveaux cookies.
Peut-on scraper les salaires Glassdoor sans login ?
Non. Les données salariales détaillées de Glassdoor sont derrière un mur d'authentification. Les scraper violerait les ToS de Glassdoor et potentiellement le CFAA. Pour des données salariales fiables et légales, utilisez une licence officielle Glassdoor for Employers ou un partenaire de données agrégées comme Revelio Labs.






