Slik henter du data fra Glassdoor med Python: jobber, lønninger og anmeldelser

Sist oppdatert April 16, 2026
Slik henter du data fra Glassdoor med Python: jobber, lønninger og anmeldelser

Hvis Glassdoor-scraperen din fungerte fint i 2022, men nå bare gir deg 403-feil, er du langt fra alene. Det samme spørsmålet dukker opp forum etter forum: "Vet noen hvorfor denne scraperen ikke virker lenger?"

Kortversjonen: Glassdoor endret alt. Recruit Holdings slo Glassdoor inn i Indeed i juli 2025, kuttet 1 300 ansatte, og strammet inn anti-bot-beskyttelsen så mye at vanlige Selenium- og requests-baserte scrapers blir stoppet før den første HTML-byten i det hele tatt lastes inn. Per februar 2026 håndteres innlogging til Glassdoor fullstendig via Indeed Login — så enhver guide som hardkoder et Glassdoor-spesifikt innloggingsskjema, er i praksis ødelagt fra start. Samtidig sitter plattformen fortsatt på over 180 millioner anmeldelser, lønnsdata og innsikter fordelt på 2,5 millioner arbeidsgivere. Disse dataene er ekstremt verdifulle for HR-benchmarking, konkurranseanalyse og salgsprospektering — hvis du faktisk får tilgang til dem. Denne guiden er varianten som fungerer etter alle disse endringene, og dekker alle tre typer Glassdoor-data (jobber, anmeldelser og lønninger) på ett sted. Jeg viser deg Python-tilnærmingen med fungerende kode for 2025, forklarer nøyaktig hva som blokkerer deg og hvordan du kommer forbi det, og viser en no-code snarvei for deg som heller vil hoppe over alt det tekniske.

Hvorfor skrape Glassdoor med Python i 2025?

Glassdoor er ikke bare en jobbportal. Det er et av de rikeste datasettene for arbeidsgiverinnsikt på nettet — brukt av omtrent en tredjedel av Fortune 500-selskapene og med rundt 55 millioner unike månedlige besøkende. Dataene bak sidene driver reelle forretningsbeslutninger på tvers av flere team.

Slik bruker ulike team Glassdoor-data i praksis:

BruksområdeNødvendig datatypeHvem har nytte av det
LønnbenchmarkingLønnsfordelinger, utvalgsstørrelserHR, total kompensasjon, drift
Sporing av konkurrenters ansettelserJobbannonser, publiseringsfrekvensSalg, strategi, VC/Corp Dev
Overvåking av employer brandAnmeldelsestekst, trend i vurderinger, CEO-godkjenningHR, markedsføring, kommunikasjon
Leadgenerering (vekstselskaper)Jobbannonser + selskapsinfoSalgsteam, SDR-er
Markeds- og akademisk forskningAlle treAnalytikere, konsulenter, forskere

glassdoor_stats_00937e478e.png

Da BLS ikke kunne publisere jobbtall under nedstengingen av amerikanske myndigheter i oktober 2025, publiserte Glassdoors eget Economic Research-team en alternativ jobbrapport fra sitt datasett. Så seriøst blir disse dataene tatt av institusjonelle analytikere nå.

Python er fortsatt førstevalget fordi økosystemet er uslåelig — Playwright for nettleserautomatisering, parsel/lxml for parsing, curl_cffi for å omgå TLS-fingeravtrykk, og et enormt community som deler fungerende mønstre. Problemet er ikke Python. Problemet er at Glassdoor har blitt mye vanskeligere å skrape.

Hent Glassdoor-data med AI Get Started Free

Hvis du vil ha et no-code alternativ for uttrekk av Glassdoor-data, kan Thunderbit hjelpe deg med å hente jobber, anmeldelser og lønnssider uten å bygge og vedlikeholde en egen Python-stack.

Hvilke Glassdoor-data kan du faktisk hente ut?

De fleste guider dekker bare jobbannonser. Men det brukerne faktisk etterspør mest — basert på forumtråder, GitHub-issues og Reddit-spørsmål jeg har fulgt — er de to datatypene nesten ingen lærer bort: anmeldelser og lønninger. Her er hele oversikten over hva som kan hentes ut i alle tre kategorier.

Jobbannonser

Den mest tilgjengelige datatypen. Du kan hente ut: stillingstittel, selskapsnavn, sted, estimert lønn, selskapsvurdering, publiseringsdato, easy-apply-badge og lenke til stillingen. Jobbannonser er delvis tilgjengelige uten innlogging, selv om Glassdoor kan vise en innloggingspopup etter noen sider.

Selskapsanmeldelser

Her blir det interessant for employer brand-analyse. Feltene du kan hente ut inkluderer: total vurdering, underkategorier (work-life balance, kultur og verdier, mangfold og inkludering, karrieremuligheter, lønn og fordeler, toppledelse), fordeler, ulemper, anmelderens stillingstittel, anmeldelsesdato og ansettelsesstatus. Full anmeldelsestekst er bak innlogging — du ser et utdrag, men hele teksten med fordeler og ulemper krever autentisering.

Lønnsdata

Den mest etterspurte og mest frustrerende datatypen. Du kan hente ut: stillingstittel, lønnsintervall for grunnlønn, totalt kompensasjonsintervall, antall lønnsrapporter og sted. Men lønnssidene er fullstendig bak innlogging, og Glassdoor legger noen ganger på en "bidra for å låse opp"-flyt der du må sende inn din egen lønn før du får se andres. Ingen konkurrerende guide viser fungerende kode for dette — det skal vi fikse.

Hva krever innlogging, og hva gjør ikke det?

Denne tabellen sparer deg for å oppdage på den harde måten hvilke sider som bare returnerer tom data:

DatatypeTilgjengelig uten innlogging?Merknader
Jobb-titler og grunninfoSom regel jaPopup kan dukke opp etter noen sider
Full stillingsbeskrivelseDelvisOfte låst etter 2–3 visninger
Selskapsanmeldelser (full tekst)Nei — innlogging krevesUtdrag er synlig, full tekst er låst
LønnsdataNei — innlogging krevesKan også kreve "bidra for å låse opp"

Hvorfor den gamle Glassdoor-scraperen din sannsynligvis er ødelagt

glassdoor_defense_82a26cd8bd.png

La meg si det rett ut: hvis du kopierer kode fra en guide fra 2021–2023, vil den ikke fungere. Den mest stjernemerket gamle Glassdoor Selenium-scraperen på GitHub (MatthewChatham/glassdoor-review-scraper, ca. 1,4k stjerner) har 12+ åpne, uløste issues — blant annet "Glassdoor new UI design", "Cloudflare anti-bot protection" og "NoSuchElementException." Repoet er i praksis forlatt. Apify sin glassdoor-jobs-scraper actor er merket DEPRECATED. ScrapeOps gir Glassdoor 9/10 i total scraping-vanskelighetsgrad og 8/10 i bypass-vanskelighetsgrad.

Dette er det som har endret seg, og hvorfor gammel kode feiler:

ForsvarslagHva som endret segEffekt på gamle scrapers
Cloudflare Bot ManagementStrengere JA3/JA4-fingerprinting siden 2024Enkle requests/Selenium-skript får 403 umiddelbart
Dynamiske CSS-klassenavnKlassenavn randomiseres ved hver buildGamle CSS-selectorer fra guider slutter stille å virke
Rate limiting + sessionsporingStrengere grenser per IP og per sesjonScrapers blir blokkert etter færre sider
CAPTCHA-utfordringer (trolig Cloudflare Turnstile)Hyppigere, særlig ved pagineringHeadless-browsere utløser utfordringer
Utvidet login-veggFlere sidetyper krever autentiseringLønns- og anmeldelsessider returnerer tom data
Flytting til Indeed Login (feb. 2026)Glassdoors innloggingsskjema er helt erstattetKode som peker på gammelt login-DOM er død

Scrapflys guide fra 2026 har en tydelig advarsel: "Glassdoor is known for its high blocking rate, so if you get None values while running the Python code, it's likely you're getting blocked." Og et DEV.to-innlegg fra mars 2026 sier det enda mer rett frem: "Simple HTTP requests with requests or httpx get blocked instantly."

Mottiltakene jeg viser deg — Patchright (en stealth-fork av Playwright), data-test-attributtselectorer, roterende residential proxies og autentiserte, vedvarende sesjoner — er laget for å håndtere hvert av disse forsvarslagene.

Glassdoor API vs. Python-scraping: velg riktig metode først

Flere forumtråder spør: "Burde jeg bare bruke Glassdoor API?" — og svaret er: det kan du ikke.

Den gamle Glassdoor Partner API-en er stengt for nye søkere. Utviklerportalen finnes teknisk sett fortsatt, men returnerer HTTP 403. Det har aldri eksistert et offentlig reviews-endepunkt — MatthewChathams scraper ble laget nettopp "because Glassdoor doesn't have an API for reviews." Og det finnes ingen migreringsvei for anmeldelser eller lønninger via Indeed Publisher API.

Her er den ærlige sammenligningen:

FaktorGlassdoor Partner API v1Python-scrapingThunderbit (no-code)
TilgangStengt for nye søkereÅpen (du implementerer selv)Chrome-utvidelse
JobbannonserBegrenset/utfasesTilgjengelig med innsatsTilgjengelig
SelskapsanmeldelserFantes aldri offentligJa (innlogging kreves)Ja (via Browser Mode)
LønnsdataFantes aldri offentligJa (innlogging kreves)Ja
Rate limitsUdokumentertDu styrer tempoetKreditbasert
OppsettKan ikke registrere nye apperTimer til dager~2 minutter
VedlikeholdN/AHøyt (HTML-endringer ødelegger kode)Lavt (AI foreslår feltene på nytt)

Hvis du trenger anmeldelser eller lønnsdata — og det er de fleste som leser dette — er Python-scraping eller et no-code verktøy det eneste realistiske alternativet.

Før du begynner

  • Vanskelighetsgrad: Middels (du bør være komfortabel med Python og terminalen)
  • Tidsbruk: ca. 30–60 minutter for hele oppsettet; ca. 10 minutter per datatype etterpå
  • Dette trenger du:
    • Python 3.10+ (3.11 eller 3.12 anbefales)
    • Chrome installert
    • En Glassdoor-konto (gratis — nødvendig for lønns- og anmeldelsesdata)
    • Roterende residential proxies (for mer enn noen få sider)
    • Valgfritt: Thunderbit Chrome Extension hvis du vil ha no-code-løsningen

Verktøy og biblioteker for å skrape Glassdoor med Python i 2025

Verktøybildet har endret seg dramatisk. Her er det som faktisk fungerer mot Glassdoors nåværende forsvar.

Hvorfor Patchright er det beste valget for Glassdoor

Patchright er en stealth-fork av Playwright som patcher Runtime.Enable CDP-lekkasjen — den konkrete tekniske årsaken til at vanlig Playwright blir avslørt på Cloudflare-beskyttede sider. Den bruker nøyaktig samme API som Playwright, så hvis du kan Playwright, kan du Patchright. Versjon 1.58.2 (mars 2026) er den nåværende og aktivt vedlikeholdte utgaven.

Sammenlignet med alternativene:

  • Vanlig Playwright: Blir oppdaget på Glassdoors innloggingsside på grunn av Runtime.Enable-lekkasjen
  • Selenium + undetected-chromedriver: Siste utgivelse av undetected-chromedriver kom i februar 2024 — den er i praksis legacy. Scrapflys benchmark fant at den "failed on every domain in our test"
  • requests + BeautifulSoup: Kan ikke rendere JavaScript og blir stoppet umiddelbart av Cloudflares TLS-fingerprinting
  • curl_cffi: Utmerket for rasksporet (10–20x raskere enn en nettleser) når sidene leverer __NEXT_DATA__ i den første HTML-en, men kan ikke håndtere innlogging eller mellomliggende utfordringer

Støttende biblioteker

  • parsel (1.11.0) eller lxml (6.0.4): Rask HTML/XPath-parsing
  • csv eller pandas: Eksport av data
  • asyncio: Asynkron scraping for raskere paginering

Proxies: kun residential

Glassdoors Cloudflare-lag utfordrer datacenter-ASN-er aggressivt. Residential proxies skal visstnok redusere blokkeringsraten fra 20–30 % til under 5 %. Startpris er rundt $1,75/GB fra IPRoyal (kampanje) eller $3,00/GB fra Decodo. For produksjonsscraping bør du budsjettere med $3–8/GB avhengig av volum.

Tilfeldige forsinkelser mellom forespørsler (minst 3–8 sekunder, 5–15 sekunder ved lengre kjøringer) er viktige uansett proxy-kvalitet.

Steg 1: Sett opp Python-miljøet ditt

Lag prosjektmappen og installer den anbefalte pakken:

mkdir glassdoor-scraper && cd glassdoor-scraper
python3.11 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip

# Kjernepakker
pip install patchright==1.58.2 parsel==1.11.0

# Installer nettleserbinærer
patchright install chromium

# Valgfritt: rask vei for __NEXT_DATA__-uttrekk
pip install "curl_cffi==0.15.0"

Du skal se at Patchright laster ned en Chromium-binær. Hvis patchright install chromium feiler, sjekk at du har nok diskplass (~300 MB) og at Python-versjonen din er 3.10+.

Steg 2: Start Patchright og gå til Glassdoor

Her er den grunnleggende oppstartsmetoden som fungerer mot Glassdoors Cloudflare-lag:

from patchright.sync_api import sync_playwright
import random, time

with sync_playwright() as p:
    browser = p.chromium.launch(
        headless=False,          # headless er fortsatt lettere å oppdage
        channel="chrome",        # bruk ekte Chrome, ikke den innebygde Chromium-versjonen
    )
    context = browser.new_context(
        viewport={"width": 1440, "height": 900},
        locale="en-US",
        timezone_id="America/New_York",
        user_agent=(
            "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
            "AppleWebKit/537.36 (KHTML, like Gecko) "
            "Chrome/134.0.0.0 Safari/537.36"
        ),
    )
    page = context.new_page()
    page.goto(
        "https://www.glassdoor.com/Job/new-york-data-engineer-jobs-"
        "SRCH_IL.0,8_IC1132348_KO9,22.htm"
    )

    # Fjern innloggingsoverlayet — innholdet ligger fortsatt i DOM-en
    page.add_style_tag(content="""
        #HardsellOverlay, .LoginModal { display: none !important; }
        body { overflow: auto !important; position: initial !important; }
    """)

    page.wait_for_selector("[data-test='jobListing']")
    print("Siden lastet — jobbannonsene er synlige.")

Et par ting er verdt å merke seg her. Flagget channel="chrome" sier til Patchright at den skal bruke Chrome-binæren du allerede har installert, i stedet for den medfølgende Chromium-versjonen — det gir et mer autentisk nettleserfingeravtrykk. Trikset med add_style_tag skjuler Glassdoors innloggingsmodal (kalt #HardsellOverlay) uten at du trenger å klikke noe. Scrapfly bekrefter at "all of the content is still there, it's just covered up by the overlay" — HTML-en inneholder dataene uansett om modalen vises eller ikke.

Du skal se et Chrome-vindu åpne, gå til Glassdoors søkeside for jobber og vise kortene med jobbannonser uten at innloggingspopupen sperrer visningen.

Steg 3: Skrap Glassdoor-jobbannonser

Finn stabile selectorer

Glassdoor randomiserer CSS-klassenavn ved hver build — så .jobCard_xyz123-selector fra en guide fra 2023 vil stille returnere ingenting i dag. Bruk derfor data-test-attributter, som er Glassdoors interne QA-konvensjon og forblir stabile mellom deployer.

Her er selektorreferansen for feltene i en jobbannonse:

FeltSelektor
Beholder for jobbkort[data-test="jobListing"]
Jobbtittel[data-test="job-title"]
Jobblenkea[data-test="job-link"]
Selskapsnavn[data-test="employer-name"]
Sted[data-test="emp-location"]
Lønnsintervall[data-test="detailSalary"]
Selskapsvurdering[data-test="rating"]
Publiseringsdato[data-test="job-age"]
Neste side i paginering[data-test="pagination-next"]

Hent ut jobbddata

from parsel import Selector
import csv, random, time

def scrape_jobs(page, max_pages=5):
    all_jobs = []

    for page_num in range(1, max_pages + 1):
        html = page.content()
        sel = Selector(text=html)
        cards = sel.css('[data-test="jobListing"]')

        if not cards:
            print(f"Side {page_num}: Fant ingen kort — mulig blokkering eller endret selektor.")
            break

        for card in cards:
            job = {
                "title": card.css('[data-test="job-title"]::text').get("").strip(),
                "company": card.css('[data-test="employer-name"]::text').get("").strip(),
                "location": card.css('[data-test="emp-location"]::text').get("").strip(),
                "salary": card.css('[data-test="detailSalary"]::text').get("").strip(),
                "rating": card.css('[data-test="rating"]::text').get("").strip(),
                "link": card.css('a[data-test="job-link"]::attr(href)').get(""),
                "posted": card.css('[data-test="job-age"]::text').get("").strip(),
            }
            if job["link"] and not job["link"].startswith("http"):
                job["link"] = "https://www.glassdoor.com" + job["link"]
            all_jobs.append(job)

        print(f"Side {page_num}: hentet {len(cards)} jobber")

        # Paginering
        next_btn = page.query_selector('[data-test="pagination-next"]')
        if next_btn and page_num < max_pages:
            next_btn.click()
            time.sleep(random.uniform(3, 8))
            page.wait_for_selector("[data-test='jobListing']")
        else:
            break

    return all_jobs

Lagre til CSV

def save_to_csv(jobs, filename="glassdoor_jobs.csv"):
    if not jobs:
        print("Ingen jobber å lagre.")
        return
    keys = jobs[0].keys()
    with open(filename, "w", newline="", encoding="utf-8") as f:
        writer = csv.DictWriter(f, fieldnames=keys)
        writer.writeheader()
        writer.writerows(jobs)
    print(f"Laget {len(jobs)} jobber i {filename}")

Et lite notat om pagineringsgrenser: Glassdoor begrenser søkeresultater til omtrent 30 sider uansett total mengde. Hvis du trenger mer dekning, bør du bruke filtre (sted, stillingstype, lønnsintervall) for å snevre inn hvert søk, i stedet for å prøve å gå forbi grensen.

I testene mine tok det rundt 45 sekunder å skrape 5 sider med jobbannonser (omtrent 75 jobber) med tilfeldige forsinkelser. Å gjøre det samme manuelt ville tatt minst 20 minutter med copy-paste.

Steg 4: Skrap Glassdoor-selskapsanmeldelser

Dette er delen ingen andre guider gir fungerende kode for. Anmeldelser er der den virkelige arbeidsgiverinnsikten ligger — sentimentanalyse, kulturindikatorer og varsellamper rundt ledelsen.

Gå til anmeldelsessiden

URL-er for anmeldelser følger dette mønsteret: /Reviews/{Company}-Reviews-E{id}.htm. Du finner arbeidsgiver-ID-en ved å søke etter selskapet på Glassdoor og se på URL-en.

def navigate_to_reviews(page, company_reviews_url):
    page.goto(company_reviews_url)
    page.add_style_tag(content="""
        #HardsellOverlay, .LoginModal { display: none !important; }
        body { overflow: auto !important; position: initial !important; }
    """)
    page.wait_for_selector('[data-test="review"]', timeout=15000)

Det skjulte BFF-endepunktet (den reneste løsningen)

Her er det viktigste funnet fra undersøkelsen min: Glassdoor-anmeldelser har et fungerende internt JSON-API som omgår HTML-parsing helt. Scrapflys scrapers-repo dokumenterer dette endepunktet, og det er langt mer pålitelig enn DOM-scraping.

import json, re, requests

def get_review_ids(page):
    """Hent employerId og dynamicProfileId fra HTML-en på anmeldelsessiden."""
    html = page.content()
    sel = Selector(text=html)
    script_text = sel.xpath(
        "//script[contains(text(), 'profileId')]/text()"
    ).get("")
    employer_match = re.search(r'"employer"\s*:\s*(\{[^}]+\})', script_text)
    if employer_match:
        meta = json.loads(employer_match.group(1))
        return meta.get("id"), meta.get("profileId")
    return None, None

def fetch_reviews_bff(page, employer_id, profile_id, max_pages=5):
    """Kall Glassdoors interne BFF-endepunkt for strukturert anmeldelsesdata."""
    all_reviews = []
    cookies = {c["name"]: c["value"] for c in page.context.cookies()}

    for pg in range(1, max_pages + 1):
        payload = {
            "applyDefaultCriteria": True,
            "employerId": employer_id,
            "dynamicProfileId": profile_id,
            "employmentStatuses": ["REGULAR", "PART_TIME"],
            "language": "eng",
            "onlyCurrentEmployees": False,
            "page": pg,
            "pageSize": 10,
            "sort": "DATE",
            "textSearch": "",
        }
        resp = requests.post(
            "https://www.glassdoor.com/bff/employer-profile-mono/employer-reviews",
            json=payload,
            cookies=cookies,
            headers={"Content-Type": "application/json"},
        )
        if resp.status_code != 200:
            print(f"BFF returnerte {resp.status_code} på side {pg}")
            break

        data = resp.json()
        reviews = data.get("data", {}).get("employerReviews", {}).get("reviews", [])
        total_pages = data.get("data", {}).get("employerReviews", {}).get("numberOfPages", 1)

        for r in reviews:
            all_reviews.append({
                "title": r.get("summary", ""),
                "rating": r.get("ratingOverall"),
                "pros": r.get("pros", ""),
                "cons": r.get("cons", ""),
                "author_role": r.get("jobTitle", {}).get("text", ""),
                "date": r.get("reviewDateTime", ""),
                "recommend": r.get("isRecommend"),
            })

        print(f"Anmeldelsesside {pg}/{total_pages}: fikk {len(reviews)} anmeldelser")
        if pg >= total_pages:
            break
        time.sleep(random.uniform(3, 6))

    return all_reviews

BFF-endepunktet gir deg ren JSON med alle anmeldelsesfeltene — ingen HTML-parsing, ingen CSS-selektor som ryker. Du trenger sesjonskapsler fra en autentisert Playwright-kontekst (dekkes i steg 6 nedenfor), og du må hente ut employerId og dynamicProfileId fra HTML-en på anmeldelsessiden først.

HTML-fallback-selectorer for anmeldelser

Hvis BFF-endepunktet endrer seg, eller du foretrekker DOM-parsing, er dette de stabile data-test-selectorene:

FeltSelektor
Beholder for anmeldelse[data-test="review"]
Overskrift[data-test="review-title"]
Total vurdering[data-test="overall-rating"]
Fordeler[data-test="pros"]
Ulemper[data-test="cons"]
Dato[data-test="review-date"]
Forfatterens rolle[data-test="author-jobTitle"]

Steg 5: Skrap Glassdoor-lønnsdata

Lønnssidene er helt bak innlogging. Du må ha en autentisert sesjon (steg 6) før koden under vil returnere reelle data.

Gå til lønnssiden

Lønns-URL-er følger mønsteret: /Salary/{Company}-Salaries-E{id}.htm, med paginering som _P{n}.htm.

def scrape_salaries(page, salary_url, max_pages=3):
    all_salaries = []

    for pg in range(1, max_pages + 1):
        url = salary_url if pg == 1 else salary_url.replace(".htm", f"_P{pg}.htm")
        page.goto(url)
        page.add_style_tag(content="""
            #HardsellOverlay { display: none !important; }
            body { overflow: auto !important; position: initial !important; }
        """)
        time.sleep(random.uniform(3, 7))

        html = page.content()
        sel = Selector(text=html)
        items = sel.css('[data-test="salary-item"]')

        if not items:
            print(f"Lønnsside {pg}: Fant ingen elementer — mulig login-vegg eller blokkering.")
            break

        for item in items:
            salary = {
                "job_title": item.css('[class*="SalaryItem_jobTitle__"]::text').get("").strip(),
                "salary_range": item.css('[class*="SalaryItem_salaryRange__"]::text').get("").strip(),
                "count": item.css('[class*="SalaryItem_salaryCount__"]::text').get("").strip(),
            }
            all_salaries.append(salary)

        print(f"Lønnsside {pg}: hentet {len(items)} oppføringer")

    return all_salaries

Legg merke til mønsteret [class*="SalaryItem_jobTitle__"]. Glassdoors lønnsside bruker CSS-modul-hashede klassenavn (for eksempel SalaryItem_jobTitle__XWGpT), der hash-suffikset endrer seg ved hver deploy. Prefikset er stabilt — ikke hashen. Du må aldri hardkode hele klassenavnet.

Steg 6: Kom forbi Glassdoors innloggingsvegg

Dette er den kritiske delen som åpner for lønnsdata og full anmeldelsestekst. Tilnærmingen er: logg inn én gang manuelt i et synlig nettleservindu, lagre den autentiserte sesjonen, og gjenbruk den i alle senere scraping-kjøringer.

Lagre den autentiserte sesjonen din

Kjør dette skriptet én gang. Det åpner et Chrome-vindu, går til Glassdoors innloggingsside (som nå videresender til Indeed Login), og venter på at du logger inn manuelt:

import asyncio
from pathlib import Path
from patchright.async_api import async_playwright

STATE_FILE = Path("glassdoor_state.json")

async def login_and_save():
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=False, channel="chrome")
        context = await browser.new_context(
            viewport={"width": 1366, "height": 800},
            locale="en-US",
        )
        page = await context.new_page()
        await page.goto("https://www.glassdoor.com/profile/login_input.htm")
        print("Logg inn i nettleservinduet, og trykk deretter Enter her...")
        input()
        await context.storage_state(path=str(STATE_FILE))
        print(f"Sesjonen ble lagret i {STATE_FILE}")
        await browser.close()

asyncio.run(login_and_save())

Etter at du har logget inn og trykket Enter, lagrer Patchright alle cookies og lokal lagring til glassdoor_state.json. Denne filen inneholder gdId, GSESSIONID, cf_clearance og autentiserings-tokens.

Gjenbruk sesjonen i scraping

Alle senere scraping-kjøringer laster inn den lagrede tilstanden — ingen manuell innlogging nødvendig:

async def scrape_with_auth(target_url):
    async with async_playwright() as p:
        browser = await p.chromium.launch(headless=True, channel="chrome")
        context = await browser.new_context(
            storage_state="glassdoor_state.json"
        )
        page = await context.new_page()
        await page.goto(target_url)
        await page.add_style_tag(
            content="#HardsellOverlay{display:none!important}"
        )
        await page.wait_for_load_state("networkidle")
        html = await page.content()
        await browser.close()
        return html

Den lagrede sesjonen varer vanligvis 20–30 minutter med aktiv bruk før Glassdoor ber om ny bekreftelse. For lengre scraping-runder bør du legge inn en kontroll: hvis du får null resultater fra en side som burde ha data, kjører du innloggingsskriptet på nytt for å oppdatere state-filen.

Oppdag og fjern innloggingspopupen

For delvis låste sider (jobbannonser som viser data, men legger en modal over), fungerer CSS-injeksjonsmetoden fra tidligere steg:

page.add_style_tag(content="""
    #HardsellOverlay, .LoginModal { display: none !important; }
    body { overflow: auto !important; position: initial !important; }
""")

Dette fungerer bare når HTML-en allerede inneholder dataene under overlayet. For fullstendig server-side-låste sider (lønninger, dyptliggende anmeldelsessider) er den autentiserte sesjonen fra steg 6 den eneste veien.

Tips for å holde Glassdoor-scraperen i gang

Glassdoor oppdaterer frontenden ofte. Slik bygger du robusthet inn i scraperen.

Foretrekk data-test-attributter fremfor klassenavn

Glassdoor randomiserer CSS-klasser, men beholder ofte data-test-attributtene stabile. Bruk alltid [data-test="jobListing"] i stedet for .jobCard_abc123. Når data-test ikke finnes (som for lønnsfelter), bruk prefix-match-mønsteret: [class*="SalaryItem_jobTitle__"].

Roter proxies og randomiser forsinkelser

Bruk roterende residential proxies — datacenter-IP-er blir utfordret nesten umiddelbart. Legg inn tilfeldige pauser på 3–8 sekunder mellom sideinnlastinger (5–15 sekunder ved lengre kjøringer). Unngå helst scraping i US business hours, når Cloudflares atferdsdeteksjon er mest aggressiv.

Overvåk om noe har gått i stykker

Bygg inn en enkel sjekk: hvis en side som burde inneholde data returnerer null ekstraherte poster, behandl det som en selektorfeil, ikke som et tomt datasett, og varsle deg selv. Kjør en liten test-scrape ukentlig for å oppdage feil tidlig — Glassdoor deployer frontend-endringer uten varsel.

Bruk __NEXT_DATA__-rasksporet når det er mulig

Glassdoor er en Next.js + Apollo GraphQL-app. Mange sider leverer et <script id="__NEXT_DATA__">-tagg med hele GraphQL-cachen som JSON. Å parse dette er mye mer robust enn DOM-scraping og omgår Hardsell-overlayet helt:

import json

def extract_next_data(html):
    sel = Selector(text=html)
    raw = sel.css("script#__NEXT_DATA__::text").get()
    if raw:
        return json.loads(raw)["props"]["pageProps"].get("apolloCache", {})
    return None

Dette gir deg den strukturerte Apollo-cachen med alle jobb-, anmeldelses- og lønnsfelter — ingen CSS-selectorer er nødvendig. Det er den mest robuste ekstraksjonsstrategien som finnes, siden det er de samme dataene som driver Glassdoors React-frontende.

Hopp over koden: Skrap Glassdoor med Thunderbit (uten Python)

Det er ikke alle som leser dette som er utviklere. HR-team, rekrutterere, salgsanalytikere og markedsforskere trenger også Glassdoor-data — og de skal ikke måtte håndtere Playwright-kontekster og proxy-rotasjon for å få tak i dem.

Thunderbit er en AI Web Scraper Chrome Extension som kan hente ut de samme dataene om jobber, anmeldelser og lønninger uten at du skriver én eneste linje kode. Jeg jobber i Thunderbit-teamet, så det er greit å være tydelig på det — men grunnen til at jeg tar det med her, er at det faktisk løser de to vanskeligste problemene i Glassdoor-scraping.

Slik fungerer Thunderbit på Glassdoor

Arbeidsflyten tar to klikk:

  1. Åpne hvilken som helst Glassdoor-side i Chrome (jobb­søk, selskapsanmeldelser, lønnsside)
  2. Klikk AI Suggest Fields i Thunderbit-sidepanelet — AI-en leser DOM-en og foreslår kolonner (jobbtittel, selskap, vurdering, lønnsintervall, fordeler, ulemper osv.)
  3. Klikk Scrape — dataene hentes inn i en tabell uten CSS-selectorer eller browser-automatiseringskode

Thunderbit har en ferdig Glassdoor company scraper-template som henter ut over 23 felt per selskap i én kjøring. For jobbannonser, anmeldelser eller lønninger håndterer den generiske AI Suggest Fields-flyten hvilken som helst Glassdoor-URL.

Håndter login-veggen uten kode

Dette er Thunderbits strukturelle fordel for akkurat Glassdoor. Browser Mode kjører i din egen Chrome-sesjon — hvis du er logget inn i Glassdoor i Chrome, arver Thunderbit disse cookies automatisk. Login-veggen for lønninger og anmeldelser som stopper server-side scrapers, gjelder rett og slett ikke. Ingen cookie-håndtering, ingen vedvarende kontekster, ingen sesjonskode.

Underside-scraping for berikelse

Start fra en listeside (for eksempel 30 selskaper fra et søk), la Thunderbit lese radene, og aktiver deretter subpage scraping for å besøke hver bedrifts anmeldelses- eller lønnsside og berike tabellen med full beskrivelse, anmeldelsestekst eller lønnsdetaljer.

Eksporter til forretningsverktøy

I motsetning til Python-skript som sender ut CSV eller JSON, eksporterer Thunderbit direkte til Google Sheets, Airtable, Notion eller Excel — gratis i alle planer. Særlig nyttig for team som trenger å dele og analysere data sammen.

Python vs. Thunderbit: når bør du bruke hva?

ScenarioAnbefalt metode
Bygger en gjentakende datapipelinePython + Patchright
Engangsresearch eller lite teamprosjektThunderbit
Trenger programmatisk kontroll over hvert feltPython
Ikke-utvikler som trenger Glassdoor-data i dagThunderbit
Skraping av 1 000+ sider i én kjøringPython + proxies
Skraping av 30 selskaper med berikelseBegge fungerer — Thunderbit er raskere å sette opp

Thunderbit-prisen starter gratis (6 sider/måned), med Pro-plan til $38/måned for 3 000 credits. Med 1 credit per output-rad (2 credits for subpage scraping) er det nok til rundt 33 kjøringer med 30 berikede selskaper per måned.

Prøv Thunderbit for Glassdoor-scraping

Er det lovlig å skrape Glassdoor?

Jeg holder dette kort og faktabasert. Glassdoors vilkår forbyr eksplisitt automatisert scraping: "You may not use any robot, spider, scraper... to access the Services for any purpose without our express written permission."

Det juridiske bildet er likevel mer nyansert enn én vilkårsklausul:

  • Meta v. Bright Data (N.D. Cal., jan. 2024): Retten slo fast at hvis du aldri logger inn, har du aldri godtatt vilkårene, og scraping av offentlig tilgjengelig innhold uten innlogging bryter dem ikke
  • hiQ Labs v. LinkedIn (9th Cir.): CFAA gjelder ikke for automatisert innsamling av offentlig tilgjengelige data — men falske kontoer og scraping med innlogging er noe annet
  • Van Buren v. United States (Høyesterett, 2021): Innsnevret "exceeds authorized access" under CFAA

Det praktiske poenget: scraping av offentlige jobbannonser uten innlogging ligger i en relativt tryggere juridisk sone. Scraping med innlogget sesjon betyr at du godtok vilkårene ved registrering, og de forbyr det eksplisitt. Dette gjelder like mye Python-skript som Thunderbits Browser Mode.

Etiske retningslinjer som er verdt å følge uansett:

  • Begrens hastigheten godt under normal menneskelig surfetakt
  • Ikke skrap eller videreselg personidentifiserende informasjon om anmeldere
  • Respekter robots.txt-direktiver
  • Hent bare feltene du faktisk trenger

Konklusjon: hvilken metode passer for deg?

Denne guiden dekket alle tre Glassdoor-datatypene — jobber, anmeldelser og lønninger — med fungerende kode for 2025 som tar høyde for Indeed Login-migreringen, Cloudflare Bot Management og rotasjonen av CSS-modul-klassenavn som ødela alle eldre guider.

Her er beslutningsrammen:

Din situasjonBeste vei
Utvikler som bygger en datapipelinePython + Patchright (følg steg-for-steg-guiden over)
Engangsresearch eller gjentatte små uttrekkThunderbit (uten kode, nettleserbasert)
Trenger bare enkle jobbannonser i liten skalaSjekk først om Glassdoor API-tilgang fortsatt finnes (sannsynligvis ikke)
Trenger spesielt lønns- eller anmeldelsesdataDu må bruke Python-scraping eller Thunderbit — API-en dekket aldri dette
Team av ikke-utviklere som trenger delt dataThunderbit → eksport til Google Sheets

Glassdoors forsvar vil fortsette å utvikle seg. Selectorer vil ryke. Nye utfordringer vil dukke opp. Bokmerk denne guiden — og hvis du vil ha et dypere blikk på verktøy og teknikker for web scraping, kan du se våre innlegg om beste automatiserte web scraping-verktøy, hvordan hente data fra en nettside med Python, og beste verktøy for jobbscraping. Du kan også se gjennomganger på Thunderbit YouTube-kanalen.

Prøv Thunderbit for uttrekk av Glassdoor-data Get Started Free

Vanlige spørsmål

1. Kan du skrape Glassdoor uten å logge inn?

Ja, for de fleste dataene om jobbannonser og de viktigste selskapsvurderingene. Nei, for fullstendige lønnsfordelinger eller hele anmeldelsestekster utover de første sidene. #HardsellOverlay er en CSS-basert modal — den underliggende HTML-en inneholder fortsatt data fra første side — men dypere innhold er låst på serversiden bak Glassdoors "give-to-get"-vegg.

2. Hvilket Python-bibliotek fungerer best for Glassdoor-scraping i 2025?

Patchright (en stealth-fork av Playwright) er standardanbefalingen. Det patcher Runtime.Enable CDP-lekkasjen som vanlig Playwright har, og som Cloudflare uttrykkelig ser etter. For listesider som leverer __NEXT_DATA__ i den første HTML-en, er curl_cffi med impersonate="chrome124" 10–20x raskere, men det kan ikke håndtere sider med innloggingskrav.

3. Hvordan unngår jeg å bli blokkert når jeg skraper Glassdoor?

Bruk Patchright eller rebrowser-playwright (ikke vanlig Playwright eller Selenium). Roter residential proxies — datacenter-IP-er blir utfordret med en gang. Legg inn tilfeldige pauser på 3–8 sekunder mellom sidene. Behold cookies (gdId, cf_clearance, GSESSIONID) mellom forespørsler. Regn med et sesjonsvindu på 20–30 minutter før du blir utfordret på nytt.

4. Finnes det en Glassdoor API jeg kan bruke i stedet for scraping?

I praksis nei. Den gamle Partner API-en er stengt for nye søkere, et offentlig reviews-endepunkt har aldri eksistert, og det finnes ingen migreringsvei under Indeed Publisher API. Scraping eller et no-code-verktøy som Thunderbit er det eneste praktiske alternativet for anmeldelser og lønnsdata.

5. Hvor ofte går Glassdoor-scrapers i stykker?

Ganske ofte. Glassdoor deployer frontend-endringer uten varsel, og CSS-modul-hashene skifter ved hver build. De mest stabile metodene er: (1) data-test-attributtselectorer, (2) __NEXT_DATA__-JSON-blokken, og (3) det interne BFF-endepunktet for anmeldelser. Legg inn en sjekk for null-resultater og kjør en liten test-scrape ukentlig for å oppdage feil tidlig.

Les mer

Ke
Ke
CTO i Thunderbit | Senior Data Scientist og ML-ekspert Med nesten ti års erfaring innen maskinlæring og datavitenskap er Ke Shen alumnus fra Columbia University og tidligere Senior Data Scientist hos Walmart Labs. Med solid, anerkjent ekspertise i Python, R, Java og statistikk deler han velprøvde innsikter om hvordan komplekse AI-algoritmer kan tas fra teori til produksjonsklar arkitektur.
Innholdsfortegnelse

Hent en nettside bare ved å spørre

Si hva du trenger på vanlig norsk. Eller enda bedre, si ingenting i det hele tatt.

Prøv Thunderbit gratis
Hent data med AI
Overfør enkelt data til Google Sheets, Airtable eller Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week