Wichtiger Hinweis: Dieser Leitfaden behandelt ausschließlich den Zugriff auf öffentlich zugängliche Daten ohne Login. Glassdoor nutzt DataDome und Cloudflare Bot Management, um automatisierten Zugriff zu blockieren. Bevor Sie Glassdoor scrapen, prüfen Sie die Nutzungsbedingungen von Glassdoor sowie anwendbare Gesetze — imbesondere den Computer Fraud and Abuse Act (CFAA) in den USA und die DSGVO in der EU. Das Umgehen von Login-Walls oder das Sammeln personenbezogener Daten ohne Rechtsgrundlage ist untersagt und wird hier nicht behandelt.
Wer Glassdoor scrapen will, steht 2026 vor einer dicken Anti-Bot-Wand: DataDome IP-Scoring, Cloudflare JS-Challenges und TLS-Fingerprinting blocken nahezu jede Standard-HTTP-Bibliothek innerhalb weniger Requests. Dennoch sind Unternehmensbewertungen, Sterne-Ratings und aggregierte Gehaltsinformationen öffentlich zugänglich — wenn man die richtigen Endpunkte kennt und Residential Proxys korrekt einsetzt. Dieser Beitrag zeigt, wie Sie einen Glassdoor Bewertungen Scraper mit der undokumentierten BFF-GraphQL-Schnittstelle aufbauen, Paginierung cursorgesteuert handhaben und ethische Grenzen einhalten.
Glassdoor scrapen: Was öffentlich ist und was hinter der Login-Wall liegt
Glassdoor unterscheidet strikt zwischen öffentlichen und auth-geschützten Inhalten. Für HR-Analytics-Teams und Arbeitsmarktdaten-Ingenieure ist diese Grenze entscheidend, weil sie bestimmt, was legal und technisch ohne Login abrufbar ist.
Öffentlich zugänglich (kein Login erforderlich)
- Unternehmensprofilseiten unter
/Overview/Working-at-<company>-EI_IE<id>.htm— Branche, Größe, Hauptsitz, gegründet. - Bewertungsübersicht unter
/Reviews/<company>-Reviews-E<id>.htm— aggregierte Sterne-Ratings, gekürzte Pros/Cons-Texte, Jobtitel. - Gehaltsübersicht (aggregiert) — durchschnittliche Basisgehälter pro Rolle, soweit auf der öffentlichen Profilseite angezeigt.
Hinter Login-Wall (nicht Teil dieses Leitfadens)
- Vollständige Bewertungstexte mit detailliertem Kommentar-Verlauf.
- Detaillierte Gehaltsaufschlüsselungen nach Standort, Erfahrung und Bonus.
- Vorstellungsgespräch-Berichte und individuelle Gehaltsangaben mit personenbezug.
Alles hinter der Auth-Wall erfordert ein Glassdoor-Konto und unterliegt strengeren rechtlichen Einschränkungen. Wir konzentrieren uns ausschließlich auf die öffentliche Bewertungsschnittstelle.
Glassdoors Anti-Bot-Stack verstehen
Glassdoor setzt 2026 zwei überlappende Schutzsysteme ein: DataDome für IP-Reputation und Verhaltensanalyse sowie Cloudflare Bot Management für TLS-Fingerprinting und JavaScript-Challenges. Beide Systeme ergänzen sich und machen einfache HTTP-Clients wie requests oder urllib innerhalb von 5–20 Requests nutzlos.
DataDome: IP-Scoring und Cookie-Tracking
DataDome bewertet jede eingehende Verbindung anhand von IP-Reputation, ASN-Typ (Hosting vs. ISP), geografischer Konsistenz und Verhaltensmustern. Ein Datacenter-IP aus AWS (ASN AS14618) wird fast sofort als Bot markiert. Residential IPs von echten ISPs (z. B. Deutsche Telekom AS3320) haben deutlich bessere Überlebenschancen, weil sie wie echter Nutzer-Traffic aussehen. DataDome setzt ein datadome-Cookie, das nach erfolgreicher Challenge-Ausstellung für typischerweise 30 Minuten gültig bleibt.
Cloudflare: TLS-Fingerprinting und JS-Challenge
Cloudflare prüft den TLS-Client-Hello-Fingerprint (JA3/JA4) gegen eine Datenbank bekannter Browser- und Bibliotheksfingerprints. Python requests mit urllib3 produziert einen JA3-Hash, der sofort als nicht-Chrome erkannt wird. Die Lösung: curl_cffi — eine Python-Bibliothek, die curl mit BoringSSL nutzt und den TLS-Handshake von Chrome 120+ oder Safari bitgenau nachahmt.
Die undokumentierte BFF-GraphQL-Schnittstelle
Die HTML-Seite unter /Reviews/... rendert Bewertungen serverseitig, aber Glassdoor lädt zusätzliche Bewertungen über einen internen GraphQL-Endpunkt nach. Dieser Endpunkt ist nicht dokumentiert, aber im Netzwerk-Tab der Browser-DevTools sichtbar.
Endpunkte
https://www.glassdoor.com/bff/graphql— primärer BFF-Endpunkt (Backend-for-Frontend), akzeptiert POST mit JSON-Body.https://www.glassdoor.com/graph— älterer GraphQL-Endpunkt, teilweise noch aktiv, aber zunehmend durch BFF ersetzt.
Erforderliche Header
POST /bff/graphql HTTP/1.1
Host: www.glassdoor.com
Content-Type: application/json
gd-csrf-token: <token aus HTML oder Cookie>
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...
Accept: application/json
Referer: https://www.glassdoor.com/Reviews/<company>-Reviews-E<id>.htm</pre></code>
<p>Der <code>gd-csrf-token</code> wird im initialen HTML-Response als Meta-Tag oder Inline-JavaScript gesetzt. Sie müssen zuerst die HTML-Seite laden, den Token extrahieren und dann für alle nachfolgenden GraphQL-Requests wiederverwenden.</p>
<h3>Warum rotierende Residential Proxys DataDome schlagen</h3>
<p>DataDomes IP-Scoring bestraft Datacenter-IPs hart. Eine Studie von <a href="https://datadome.co/bot-management-protection/" rel="noopener noreferrer">DataDome</a> zeigt, dass über 80% des Datacenter-Traffics als bot-ähnlich klassifiziert wird. Residential Proxys wie ProxyHat bieten IPs aus echten ISP-Pools, die DataDome als legitime Endnutzer einstuft. Die Kombination aus Chrome-TLS-Impersonation (curl_cffi) und Residential-IP-Rotation ist der effektivste Ansatz, um Glassdoor in nennenswerten Volumina abzufragen.</p>
<table>
<thead>
<tr><th>Proxy-Typ</th><th>DataDome-Erkennungsrate</th><th>Erfolgsquote (geschätzt)</th><th>Kosten</th></tr>
</thead>
<tbody>
<tr><td>Datacenter</td><td>Hoch (ASN-basiert)</td><td>5–15%</td><td>Niedrig</td></tr>
<tr><td>Mobile (4G/5G)</td><td>Sehr niedrig</td><td>90–98%</td><td>Hoch</td></tr>
<tr><td>Residential</td><td>Niedrig</td><td>85–95%</td><td>Mittel</td></tr>
</tbody>
</table>
<h2>Python-Beispiel: Glassdoor Bewertungen über BFF-GraphQL mit ProxyHat</h2>
<p>Das folgende Beispiel zeigt, wie Sie die HTML-Seite laden, den CSRF-Token extrahieren und einen GraphQL-Request über den ProxyHat-Gateway absetzen. Wir verwenden <code>curl_cffi</code> für Chrome-TLS-Impersonation und <code>gate.proxyhat.com:8080</code> als HTTP-Proxy.</p>
<pre><code>import re, json, time, random
from curl_cffi import requests as cffi_requests
# ProxyHat Residential Proxy — Sticky Session für DataDome-Cookie-Konsistenz
PROXY = "http://user-session-glassdoor01:pass@gate.proxyhat.com:8080"
EMPLOYER_ID = "6036" # Beispiel: Google
REVIEW_URL = f"https://www.glassdoor.com/Reviews/Google-Reviews-E{EMPLOYER_ID}.htm"
BFF_URL = "https://www.glassdoor.com/bff/graphql"
HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/125.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",
}
# 1. HTML-Seite laden und CSRF-Token extrahieren
session = cffi_requests.Session(impersonate="chrome120")
resp = session.get(REVIEW_URL, proxies={"http": PROXY, "https": PROXY},
headers=HEADERS, timeout=30)
if resp.status_code != 200:
raise Exception(f"HTML-Laden fehlgeschlagen: {resp.status_code}")
csrf_match = re.search(r'gd-csrf-token["\']\s*[:=]\s*["\']([a-f0-9]+)', resp.text)
if not csrf_match:
raise Exception("CSRF-Token nicht gefunden")
csrf_token = csrf_match.group(1)
# DataDome-Cookie wird automatisch in session.cookies gespeichert
print(f"CSRF-Token: {csrf_token[:16]}...")
print(f"Cookies: {len(session.cookies)}")
# 2. GraphQL-Request für erste Bewertungsseite
graphql_body = {
"operationName": "EmployerReviews",
"variables": {
"employerId": int(EMPLOYER_ID),
"pageNum": 1,
"pageSize": 10,
"sort": "newest"
},
"query": "query EmployerReviews($employerId: Long!, $pageNum: Int!, $pageSize: Int!, $sort: String!) { employerReviews(employerId: $employerId, pageNum: $pageNum, pageSize: $pageSize, sort: $sort) { reviews { id ratingOverall pros cons jobTitle { text } } } }"
}
graphql_headers = {
**HEADERS,
"Content-Type": "application/json",
"gd-csrf-token": csrf_token,
"Referer": REVIEW_URL,
"Accept": "application/json",
}
resp2 = session.post(BFF_URL, json=graphql_body,
proxies={"http": PROXY, "https": PROXY},
headers=graphql_headers, timeout=30)
data = resp2.json()
reviews = data.get("data", {}).get("employerReviews", {}).get("reviews", [])
for r in reviews[:3]:
print(f"Rating: {r.get('ratingOverall')} | "
f"Job: {r.get('jobTitle', {}).get('text', 'N/A')} | "
f"Pros: {r.get('pros', '')[:80]}...")
Dieser Code lädt eine Bewertungsseite, extrahiert den CSRF-Token aus dem HTML und sendet einen GraphQL-POST an den BFF-Endpunkt. Die session-glassdoor01-Flag im ProxyHat-Benutzernamen sorgt dafür, dass alle Requests über dieselbe Exit-IP laufen — wichtig, weil DataDome das datadome-Cookie an die IP bindet.
Paginierung, Sticky Sessions und Pacing
Paginierung über Cursor oder pageNum
Die BFF-GraphQL-Schnittstelle unterstützt sowohl pageNum-basierte als auch cursor-basierte Paginierung, je nach Operation. Für EmployerReviews reicht typischerweise pageNum von 1 bis N. Bei cursor-basierten Operationen erhalten Sie ein endCursor-Feld im Response, das Sie als after-Variable im nächsten Request übergeben.
# Paginierung mit Pacing und Retry-Logik
MAX_PAGES = 50
DELAY_MIN, DELAY_MAX = 3, 7 # Sekunden zwischen Requests
MAX_RETRIES = 3
all_reviews = []
for page in range(1, MAX_PAGES + 1):
graphql_body["variables"]["pageNum"] = page
for attempt in range(MAX_RETRIES):
try:
r = session.post(BFF_URL, json=graphql_body,
proxies={"http": PROXY, "https": PROXY},
headers=graphql_headers, timeout=30)
if r.status_code == 403:
print(f"403 auf Seite {page} — neue Session...")
# Neue Sticky-Session für frische IP
new_session_id = f"glassdoor{random.randint(1000,9999)}"
PROXY = f"http://user-session-{new_session_id}:pass@gate.proxyhat.com:8080"
time.sleep(10)
continue
data = r.json()
page_reviews = data.get("data", {}).get("employerReviews", {}).get("reviews", [])
if not page_reviews:
print(f"Keine Reviews mehr auf Seite {page}")
break
all_reviews.extend(page_reviews)
break
except Exception as e:
print(f"Fehler Seite {page}, Versuch {attempt+1}: {e}")
time.sleep(5 * (attempt + 1))
delay = random.uniform(DELAY_MIN, DELAY_MAX)
time.sleep(delay)
print(f"Gesamt: {len(all_reviews)} Reviews gesammelt")
Sticky Sessions und DataDome-Cookie-Konsistenz
Das datadome-Cookie ist an die IP-Adresse gebunden. Wenn Sie die Exit-IP mid-session wechseln, wird das Cookie ungültig und Sie erhalten 403. ProxyHat löst dies mit der -session--Flag im Benutzernamen: user-session-abc123:pass hält die IP für typischerweise 10–30 Minuten stabil. Wechseln Sie die Session-ID nur, wenn Sie eine 403 erhalten oder bewusst rotieren wollen.
Pacing-Strategien
- 3–7 Sekunden zwischen Requests für einzelne Unternehmen.
- Maximal 100 Requests pro Sticky-Session, dann Session-ID wechseln.
- Concurrency begrenzen: 5–10 parallele Requests für verschiedene Unternehmen, nicht für dasselbe.
- Backoff bei 403: Exponentiell, 10s → 30s → 90s, dann neue Session.
Node.js-Beispiel mit curl-impersonate und ProxyHat
Für Node.js-Teams ist node-libcurl mit --with-impersonate-chrome eine Option. Einfacher ist das Paket crawlee, das TLS-Impersonation über Playwright-Browser-Kontexte handhabt.
const { ProxyConfiguration } = require('crawlee');
const proxyConfig = new ProxyConfiguration({
proxyUrls: ['http://user-session-gd01:pass@gate.proxyhat.com:8080']
});
// In Crawlee mit Playwright:
// proxyInfo = await proxyConfig.newProxyInfo();
// browserContext = await browser.newContext({ proxy: proxyInfo });
// page = await browserContext.newPage();
// await page.goto('https://www.glassdoor.com/Reviews/...');
Häufige Fehler und Edge Cases
- CSRF-Token abgelaufen: Der Token ist nur für die aktuelle Session gültig. Bei IP-Wechsel muss die HTML-Seite neu geladen werden.
- GraphQL-Schema-Änderungen: Glassdoor passt Operation-Namen und Felder regelmäßig an. Überwachen Sie den Netzwerk-Tab und halten Sie Ihre Queries aktuell.
- Teilweise Reviews vs. vollständige: Öffentliche Reviews zeigen gekürzte Pros/Cons (ca. 200–300 Zeichen). Volltexte sind login-gated.
- Rate-Limit-Header ignorieren: Glassdoor sendet
X-RateLimit-Remainingim Response-Header. Werten Sie diesen aus und pausieren Sie bei < 10. - Geo-Restrictions: Einige Inhalte sind länderspezifisch. Verwenden Sie
user-country-DE:passfür deutsche Exit-IPs, falls Sie deutsche Bewertungen benötigen.
ProxyHat-spezifische Einrichtung
ProxyHat bietet Residential Proxys in über 90 Ländern. Für Glassdoor-Scraping empfehlen wir folgende Konfiguration:
- Gateway:
gate.proxyhat.com:8080(HTTP) oder:1080(SOCKS5) - Geo-Targeting:
user-country-US:passfür US-Bewertungen,user-country-DE:passfür Deutschland - Sticky Session:
user-session-gd{nummer}:passfür Cookie-Konsistenz - City-Level:
user-country-US-city-san-francisco:passfür granulare Geo-Targeting
Preise und Pakete finden Sie auf der ProxyHat-Preisseite. Eine Übersicht aller verfügbaren Standorte bietet die ProxyHat-Locations-Seite. Weitere Anleitungen zum Web-Scraping mit Proxys finden Sie in unserem Web-Scraping-Use-Case und im Bereich SERP-Tracking. Technische Details stehen in der ProxyHat-Dokumentation.
Ethisches Scraping und wann offizielle APIs besser sind
Das Scrapen von Glassdoor-Bewertungen bewegt sich in einer rechtlichen Grauzone. Hier sind die wichtigsten Leitlinien:
Was zulässig sein kann
- Aggregierte, nicht-personenbezogene Daten (Durchschnittsratings, Bewertungszahlen).
- Öffentliche Unternehmensprofile ohne Login.
- Forschungszwecke mit angemessener Datenminimierung.
Was vermieden werden sollte
- Scraping hinter Login-Wall — verstößt gegen die Glassdoor-Nutzungsbedingungen und potenziell den CFAA.
- Speicherung personenbezogener Daten (Namen, E-Mail-Adressen) ohne Rechtsgrundlage.
- EU-Bewertungen mit personenbezug ohne DSGVO-konforme Verarbeitung — betroffene Personen haben Auskunfts- und Löschungsrechte.
- Massenhaftes Scraping, das Glassdoors Serverinfrastruktur belastet.
Wann eine offizielle Datenlizenz besser ist
Für kommerzielle Produkte, die auf Glassdoor-Daten basieren, ist eine offizielle Datenpartnerschaft oder API-Lizenz oft die bessere Wahl. Glassdoor bietet Enterprise-Datenpakete über sein Employer-Portal an. Vorteile: rechtliche Absicherung, strukturierte Datenqualität, keine Anti-Bot-Hürden, SLA-garantierte Verfügbarkeit. Für HR-Analytics-Teams, die wiederkehrend Daten benötigen, übersteigen die Kosten für Proxy-Infrastruktur und Wartung oft die Lizenzgebühren.
Key Takeaways
- Glassdoor-Bewertungen sind öffentlich unter
/Reviews/..., aber durch DataDome + Cloudflare geschützt — curl_cffi mit Chrome-Impersonation ist Pflicht.- Die BFF-GraphQL-Schnittstelle (
/bff/graphql) liefert strukturierte JSON-Daten mitgd-csrf-token-Header.- Residential Proxys mit Sticky Sessions (
-session--Flag) halten das DataDome-Cookie gültig.- Pacing von 3–7 Sekunden und maximal 100 Requests pro Session minimieren 403-Raten.
- Niemals hinter Login scrapen — CFAA und DSGVO machen dies rechtlich riskant.
- Für kommerzielle Nutzung ist eine offizielle Glassdoor-Datenlizenz oft wirtschaftlich sinnvoller.






