Glassdoor Bewertungen und Gehaltsdaten scrapen: Praxisleitfaden 2026

So extrahieren Sie öffentliche Glassdoor-Unternehmensbewertungen über die BFF-GraphQL-API mit Residential Proxys — inklusive Python-Beispielen, Anti-Bot-Workarounds und ethischen Leitlinien.

How to Scrape Glassdoor Company Reviews and Salaries in 2026: BFF GraphQL, DataDome, and Proxy Workarounds
In diesem Artikel

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 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")

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-Remaining im Response-Header. Werten Sie diesen aus und pausieren Sie bei < 10.
  • Geo-Restrictions: Einige Inhalte sind länderspezifisch. Verwenden Sie user-country-DE:pass fü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:pass für US-Bewertungen, user-country-DE:pass für Deutschland
  • Sticky Session: user-session-gd{nummer}:pass für Cookie-Konsistenz
  • City-Level: user-country-US-city-san-francisco:pass fü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 mit gd-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.

Häufig gestellte Fragen

Wie scrapt man Glassdoor Bewertungen legal?

Nur öffentliche Daten ohne Login dürfen abgerufen werden — Unternehmensprofile und gekürzte Bewertungen unter /Reviews/...htm sind öffentlich zugänglich. Verwenden Sie Residential Proxys mit Chrome-TLS-Impersonation (curl_cffi), um DataDome und Cloudflare zu umgehen. Scrapen Sie niemals hinter der Login-Wall, da dies gegen die Glassdoor-Nutzungsbedingungen und potenziell den CFAA verstößt. Aggregieren Sie Daten und vermeiden Sie personenbezogene Informationen.

Welcher Proxy-Typ funktioniert am besten für Glassdoor-Scraping?

Residential Proxys sind die beste Wahl für Glassdoor, da DataDome Datacenter-IPs anhand der ASN fast sofort blockiert. Residential IPs von echten ISPs wie Deutsche Telekom oder Comcast werden als legitimer Endnutzer-Traffic eingestuft und erreichen Erfolgsquoten von 85–95%. Mobile Proxys (4G/5G) bieten noch bessere Erfolgsquoten von 90–98%, sind aber teurer. Verwenden Sie Sticky Sessions, um das DataDome-Cookie an eine konsistente IP zu binden.

Was ist die BFF-GraphQL-Schnittstelle von Glassdoor?

Glassdoor nutzt einen Backend-for-Frontend (BFF) GraphQL-Endpunkt unter /bff/graphql, der strukturierte JSON-Daten für Bewertungen, Gehälter und Unternehmensinformationen zurückgibt. Der Endpunkt ist nicht dokumentiert, aber im Browser-Netzwerk-Tab sichtbar. Für den Zugriff ist ein gd-csrf-token Header erforderlich, der aus dem initialen HTML-Response extrahiert wird. Die Schnittstelle unterstützt pageNum- und cursor-basierte Paginierung.

Wie vermeidet man Blöcken beim Glassdoor-Scraping?

Verwenden Sie curl_cffi mit Chrome-120-TLS-Impersonation, um den JA3-Fingerprint an Cloudflare vorbei zu schleusen. Setzen Sie Residential Proxys mit Sticky Sessions ein, damit das DataDome-Cookie gültig bleibt. Pacing ist entscheidend: 3–7 Sekunden zwischen Requests, maximal 100 Requests pro Session, dann Session-ID wechseln. Bei 403-Responses sollten Sie exponentielles Backoff (10s, 30s, 90s) anwenden und eine neue Sticky-Session starten.

Darf man Glassdoor Gehaltsdaten scrapen?

Aggregierte Gehaltsdaten, die auf der öffentlichen Unternehmensprofilseite ohne Login sichtbar sind, können abgerufen werden. Detaillierte Gehaltsaufschlüsselungen pro Standort und Mitarbeiter befinden sich jedoch hinter der Login-Wall und dürfen nicht gescrapt werden. Für kommerzielle Produkte, die auf Glassdoor-Gehaltsdaten basieren, ist eine offizielle Datenlizenz über das Glassdoor-Employer-Portal die rechtlich sicherere Option.

Bereit loszulegen?

Zugang zu über 50 Mio. Residential-IPs in über 148 Ländern mit KI-gesteuerter Filterung.

Preise ansehenResidential Proxies
← Zurück zum Blog