Site scraper

Glassdoor Scraper: Scrape Glassdoor Reviews with Python or API

HTTP $0.50JS rendering $2.00 per 1,000 results or your own scraper from $1.95/GB

To scrape Glassdoor company reviews with Python, drive a real browser with Playwright through one sticky residential IP, keep that browser's cookies between runs with storage_state, wait up to 15 s for the reviews to render, open one page every few seconds and stop at the sign-in prompt: reviews behind it need Glassdoor's permission. ProxyField residential proxies carry that browser from $1.95/GB, with sticky sessions up to 36 h; start with the Easy Trial, 1 GB for $2.95. To send URLs instead, ProxyField's Web Scraping API is designed for $2.00 per 1,000 rendered pages, or $1.00 from 10,000 results in one purchase. It is in development, so access is through Contact sales.

Contact sales for the Web Scraping API

Web Scraping API per 1,000 successful results
Web Scraping API prices per 1,000 successful results
FetchEntryVolume, from
HTTP$0.50$0.20
JS rendering$2.00$1.00

Billed on successful results only.

Your own scraper on residential proxies
from $1.95/GB Easy Trial: 1 GB for $2.95
gate.proxyfield.io:7000
Data

Scrape Glassdoor reviews with Python and Playwright

This script opens one company's reviews in Chromium through a ProxyField residential IP and walks the numbered pages (_P2.htm, _P3.htm and so on). It saves rating, title, pros, cons and date per review, keyed by the employer ID, and stops cleanly when a page shows no reviews. Playwright takes the proxy username and password in its launch options, so no extra package is needed.

Read moreShow less
Shell
pip install playwright
playwright install chromium
Python
# glassdoor_reviews.py
import json, random, time
from pathlib import Path
from playwright.sync_api import sync_playwright, TimeoutError as PlaywrightTimeout

EMPLOYER = "Example-Reviews-E12345"      # from the company's reviews URL
EMPLOYER_ID = EMPLOYER.rsplit("-E", 1)[1]
BASE = "https://www.glassdoor.com/Reviews/"
STATE = Path("glassdoor-state.json")     # this browser's cookies, reused next run; keep it out of git
SESSION = "gd" + EMPLOYER_ID             # one sticky IP for this company's run
MAX_PAGES = 5

# Glassdoor changes its markup: confirm every selector in DevTools on a live page first
SEL = {
    "card": "[data-test='review-details-container']",
    "rating": "[data-test='review-rating-label']",
    "title": "[data-test='review-details-title']",
    "pros": "[data-test='review-text-PROS']",
    "cons": "[data-test='review-text-CONS']",
    "date": "[data-test='review-details-date']",
}

def text(card, selector):
    loc = card.locator(selector).first
    return loc.inner_text().strip() if loc.count() else None

def page_url(n):
    return f"{BASE}{EMPLOYER}.htm" if n == 1 else f"{BASE}{EMPLOYER}_P{n}.htm"

rows = []
with sync_playwright() as p:
    browser = p.chromium.launch(headless=False, proxy={   # visible while you test
        "server": "http://gate.proxyfield.io:7000",
        "username": f"<login>-country-us-session-{SESSION}-ttl-3600",
        "password": "<password>"})
    context = browser.new_context(locale="en-US",
                                  storage_state=STATE if STATE.exists() else None)
    page = context.new_page()
    for n in range(1, MAX_PAGES + 1):
        page.goto(page_url(n), wait_until="domcontentloaded", timeout=90_000)
        cards = page.locator(SEL["card"])
        try:
            cards.first.wait_for(timeout=15_000)
        except PlaywrightTimeout:
            print(f"page {n}: no reviews (sign-in prompt, challenge page or changed selector), stopping")
            break
        for card in cards.all():
            rows.append({"employer_id": EMPLOYER_ID, "page": n,
                         **{k: text(card, s) for k, s in SEL.items() if k != "card"}})
        print(f"page {n}: {cards.count()} reviews")
        time.sleep(random.uniform(4, 8))       # well under the 120 s idle limit of a sticky IP
    context.storage_state(path=STATE)
    browser.close()

Path(f"reviews-{EMPLOYER_ID}.jsonl").write_text("\n".join(json.dumps(r) for r in rows))
print(len(rows), "reviews saved")

What to expect: one page N: … reviews line per page that loaded, then the no reviews … stopping line at the first page that showed the sign-in prompt, a challenge or no matching cards, if any, and finally <n> reviews saved. Each line in the .jsonl file holds employer_id, page, rating, title, pros, cons and date. Fields come back None when a selector no longer matches. If many of them are None, fix the selector in SEL; don't add more requests.

  • The proxy username: <login>-country-us-session-<id>-ttl-3600 keeps one US IP for up to an hour. Sessions go from 30 to 129,600 seconds (36 h); with no ttl a session lasts 20 minutes. An IP idle for 120 s is replaced, so keep pauses between pages shorter than that. Add -city-new_york or -region-<region> for a city or a state, and use -country-gb or -country-de for glassdoor.co.uk or glassdoor.de.
  • One company, one sticky session, one browser context. Run companies in parallel as separate processes, each with its own session id; ProxyField allows unlimited concurrent threads.
  • Selenium instead: Chrome's options take no proxy password, so use IP allowlist authentication and start Chrome with --proxy-server=http://gate.proxyfield.io:<port>, the port your dashboard shows for that allowlist setup. Setup guides: Playwright, Selenium.

Access opens once the payment is confirmed; the gateway, credentials or allowlist are in your account.

Good to know

Why Glassdoor keeps asking you to sign in

Glassdoor shows logged-out visitors part of a company's reviews and salaries, then lays a sign-in or "contribute to see more" prompt over the page. It also answers traffic that looks automated with a challenge page or a 403. Three things make that happen sooner, and each has a fix:

What triggers itWhat you seeWhat to do
The IP changes between pages of one sessionA prompt or challenge on page 2 or 3One sticky session per browser context (-session-<id>-ttl-<seconds>), so cookies and IP stay together
Every run starts with no cookiesThe cookie banner and the prompt again on every runSave the context's cookies with context.storage_state(path=…) and load them with new_context(storage_state=…)
Pages requested too fast, or plain HTTP with no browserA challenge page, a 403 or an empty pageA real browser, a few seconds between pages, residential IPs from the site's country (Cloudflare 403 errors)

What none of this changes: content Glassdoor keeps for signed-in members. Collecting it with a scraper needs Glassdoor's permission, such as a data agreement. ProxyField's acceptable use policy forbids accessing data behind logins you are not entitled to, and creating accounts or posting reviews to unlock pages is not allowed either.

If Glassdoor has given you that permission, the pattern Playwright documents is to sign in once by hand in a visible browser and save the state with context.storage_state(path="glassdoor-state.json"). Later runs then start with browser.new_context(storage_state="glassdoor-state.json"). The state file holds cookies and local storage but not session storage. Treat it like a password: never commit it to git.

Glassdoor data on public pages

Glassdoor pageURL patternWhat the public page shows
Job search/Job/<location>-<keyword>-jobs-SRCH_...htmJob cards: title, company, location, pay estimate when shown, rating, age of the posting
Job page/job-listing/...?jl=<id>Full description, pay range, company rating, apply route
Company overview/Overview/Working-at-<Company>-EI_IE<id>...htmSize, industry, headquarters, overall rating, CEO approval, recommend-to-a-friend share
Reviews/Reviews/<Company>-Reviews-E<id>.htm, then ..._P2.htmStar ratings by category, pros and cons, job title and location of the reviewer, date
Salaries and interviews/Salary/...-E<id>.htm, /Interview/...-E<id>.htmPay ranges by job title, interview questions and difficulty

Every company on Glassdoor has a numeric employer ID, the number after E or EI_IE in its URLs. Store it as the company's key: the overview, reviews, salaries and interview pages of one company all carry it, so you can join them without matching names. Sort reviews by date to collect only what is new since your last run.

Glassdoor runs sites per country, such as glassdoor.co.uk, glassdoor.de and glassdoor.ca, with local jobs and pay in local currency. Fetch each from its own country: ProxyField has 16.6M+ residential IPs in the United Kingdom and 20.2M+ in Germany.

Compare

Glassdoor's API or a scraper?

Glassdoor once gave developers a public partner API for company ratings and jobs, but as far as its public pages show, it no longer takes new developers. What Glassdoor offers today serves employers, who manage their own company profile and job ads. To collect ratings, reviews, salaries or jobs across companies, a scraper reads the public pages.

ItemGlassdoor employer toolsYour Playwright scraper on ProxyField proxiesProxyField Web Scraping API (in development)
Who can use itEmployers with a Glassdoor accountAnyone with a ProxyField balanceThrough Contact sales
DataYour own profile, reviews and job adsAny public job, company, review or salary pageThe same public pages
You runNothingThe browser, the parser and the retriesOnly the parser
BillingSet by GlassdoorPer GB, from $1.95/GBPer 1,000 successful results

What you send to the Web Scraping API

The Web Scraping API is designed to fetch a Glassdoor URL, render it in a browser and return the page; your code takes the fields out. ProxyField sells no separate Glassdoor API with pre-parsed fields. As designed:

  • The request a POST to https://api.proxyfield.io/v1/scrape, with your API key in an Authorization: Bearer <api_key> header and a JSON body: - url; - render (true for Glassdoor); - wait_for, a CSS selector to wait for (it needs render); - country, the exit IP's country as a two-letter code, such as de for glassdoor.de; it accepts the proxy pool's 195+ countries; - session_id, which keeps the same exit IP for up to 10 minutes across requests; - output (html, markdown, text or json).
  • The response the page itself, or a JSON envelope with the status code, the final URL, the headers, the cookies and the content.

Parameter reference: API documentation.

Shell
# The request as designed (in development; access through Contact sales)
curl https://api.proxyfield.io/v1/scrape \
  -H "Authorization: Bearer <api_key>" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://www.glassdoor.com/Reviews/Example-Reviews-E12345_P2.htm", "render": true, "wait_for": "[data-test=\"review-details-container\"]", "country": "us", "session_id": "gd12345", "output": "json"}'

Example response (shortened; content is the rendered page's HTML):

JSON
{
  "metadata": {"id": "req_366f91214e93f113", "api": "web_scrape", "status": "success", "billed": true},
  "status_code": 200,
  "final_url": "https://www.glassdoor.com/Reviews/Example-Reviews-E12345_P2.htm",
  "content_type": "text/html; charset=utf-8",
  "content": "<!DOCTYPE html><html lang=\"en-US\">…</html>"
}
Pricing

Pricing: $2.00 per 1,000 rendered pages, $1.00 from 10,000

Glassdoor builds its pages with scripts, so budget for JS rendering. The Web Scraping API is priced at $2.00 per 1,000 successful results with JS rendering, or $1.00 from 10,000 results in one purchase. Pages that load over plain HTTP cost $0.50 per 1,000, or $0.20 from 10,000.

You pay only for successful results:

Workload (30-day month)
Workload (30-day month), Pages a month, JS rendering at $2.00, At $1.00 (from 10,000)
Workload (30-day month)Pages a monthJS rendering at $2.00At $1.00 (from 10,000)
300 job searches (keyword × city), first 3 result pages, daily27,000$54$27
2,000 new job pages, daily60,000$120$60
1,000 companies: overview, salaries and 5 review pages, monthly7,000$14$7
All three94,000$188$94
  • Billed a page Glassdoor answered with a 2xx status, and a target's 404 or 410. A sign-in page served with a 200 status also counts as a billed result, so check each page for reviews before you queue the next one.
  • Not billed blocked requests, timeouts, errors on our side and our internal retries on new IPs.

Every response says whether it was billed. For availability and access, contact sales through the sales team on our 24/7 live chat.

The API is paid from the same crypto balance as proxies, which never expires; there is no subscription or monthly fee. With your own scraper, residential proxies cost $2.95/GB for 1 GB down to $1.95/GB from 1,000 GB; the traffic never expires, and all purchases are final. All prices: pricing.

Through the sales team on our 24/7 live chat

Use cases

What teams use Glassdoor data for

  • Employer brand research: ratings, pros and cons over time, for your company and competitors.
  • Salary benchmarking from pay ranges by job title and city.
  • Hiring trends: which companies post which roles, and where.
  • Investment and HR research: rating changes as a signal about a company.

Posting reviews, creating accounts or contributing content to unlock pages through a scraper is not data collection; fake accounts and fake engagement are forbidden under ProxyField's acceptable use policy.

More scrapers

More scrapers

FAQ

Glassdoor Scraper FAQ

24/7 support by live chat, including help with setup and integration.

How is the Glassdoor scraper API priced?

ProxyField's Web Scraping API is priced at $2.00 per 1,000 successful Glassdoor pages with JS rendering, or $1.00 from 10,000 results in one purchase, and you pay only for successful results. 300 daily job searches, 2,000 daily job pages and a monthly pass over 1,000 companies come to 94,000 pages a month: $188, or $94 at the volume price. The API is in development; access is through Contact sales.

Why does Glassdoor keep asking me to sign in when I scrape reviews with Python?

Glassdoor shows logged-out visitors part of the reviews, then a sign-in prompt, and it shows the prompt sooner when the IP changes between pages or every run starts without cookies. Use one sticky residential IP per Playwright context (-session-<id>-ttl-3600), save cookies with storage_state, wait a few seconds between pages, and stop at the prompt. Reviews behind the sign-in need Glassdoor's permission.

How do I keep the same Glassdoor session between scraper runs?

Save the browser context with context.storage_state(path="glassdoor-state.json") at the end of a run and pass storage_state="glassdoor-state.json" to browser.new_context() on the next one, with the same sticky proxy session id. The file holds cookies and local storage, not session storage, so keep it private and out of git.

What is a Glassdoor scraper?

A Glassdoor scraper is a script or service that collects public Glassdoor data: jobs, company ratings, reviews, salaries and interview questions. ProxyField's options are residential proxies for your own browser scraper, or its Web Scraping API (in development) on Glassdoor URLs, with JS rendering.

How do I scrape Glassdoor?

Find each company's employer ID, open its overview, reviews and salary pages in a real browser through residential IPs from the site's country, and read what the logged-out page shows. Go slowly, stop at the sign-in prompt, or send the URLs to a scraping API with JS rendering.

Does Glassdoor have an API?

Glassdoor once offered developers a public partner API, but as far as its public pages show it no longer takes new developers. Its current tools serve employers managing their own profile and job ads, not data collection across companies.

Is the Glassdoor API free?

There is no open Glassdoor API to sign up for, free or paid. Collecting Glassdoor data means scraping the public pages yourself or paying a scraping API, such as ProxyField's at $2.00 per 1,000 rendered pages.

Can I scrape Glassdoor reviews and ratings?

The ratings, review counts and the reviews Glassdoor shows logged-out visitors can be read from the public pages. Glassdoor puts more reviews behind a sign-in or a contribution, and that part is out of scope without Glassdoor's permission.

How do I scrape Glassdoor reviews with Python?

Open the reviews page with Playwright through a sticky residential proxy, wait up to 15 s for the review cards and read rating, title, pros, cons and date from each one. Then load _P2.htm, _P3.htm and so on a few seconds apart, and stop at the first page with no reviews; the script on this page does exactly that.

Can I scrape Glassdoor with Selenium?

Yes: Selenium drives a real browser, which runs the scripts Glassdoor's pages need. Route it through a residential proxy: Chrome's options take no proxy password, so use IP allowlist authentication and pass the gateway with --proxy-server. Playwright, as in the example on this page, takes the username and password directly.

Show 11 more questionsShow fewer questions

Do I need Selenium or a browser to scrape Glassdoor?

Usually yes: Glassdoor builds its pages with scripts and checks for bots, so a plain HTTP request often gets a challenge page. A browser, or a scraping API with JS rendering, gets the page as a visitor sees it.

Can I scrape Glassdoor salary data?

The salary pages show pay ranges by job title and location for a company, and logged-out visitors see part of them. Collect the ranges and counts shown publicly; salary details behind the sign-in are out of scope.

How do I scrape Glassdoor jobs?

Run job searches by keyword and city, read each card's title, company, location and pay estimate, then open the job pages for full descriptions. Store each job by its listing ID so a job seen twice is stored once.

Do I need an account to scrape Glassdoor Jobs?

No for job searches and job pages, which are public, and a scraper should never sign in without Glassdoor's permission. Glassdoor may still show a sign-in prompt after several pages; slow down rather than create an account.

Can I scrape Glassdoor without proxies?

For a handful of pages from your own browser, yes. Any regular collection from one IP soon meets Glassdoor's challenge pages, so scrapers spread companies over sticky residential IPs, which ProxyField sells from $1.95/GB.

Can I scrape Glassdoor Jobs from a specific country?

Yes: Glassdoor runs country sites such as glassdoor.co.uk and glassdoor.de, with local jobs and pay. Fetch each from its own country with -country-gb or -country-de in the ProxyField username; region and city targeting work the same way.

What's the rate limit for scraping Glassdoor Jobs?

Glassdoor publishes no rate limit for visitors; it challenges or blocks traffic that looks automated. Keep 4 to 8 seconds between pages per IP, as the script on this page does, and spread companies over many IPs.

How do I scrape multiple Glassdoor companies at once?

Keep a list of employer IDs and run them in parallel, each in its own browser context with its own sticky session id. ProxyField allows unlimited concurrent threads, so the limit is how fast Glassdoor lets each IP read.

What happens if Glassdoor changes its pages?

Your selectors stop matching and the scraper returns empty fields (None in the script above). Alert on runs that return far fewer items than usual, and keep the selectors in one place, like the SEL dictionary, so a change means one fix.

What are the use cases for Glassdoor scraping?

Employer brand tracking, salary benchmarking, hiring trend analysis and investment research on rating changes. Recruiters also use it to see which companies are hiring for which roles.

Do Glassdoor's terms permit web scraping?

No: Glassdoor's terms of use prohibit scraping and other automated access without its permission, so scraping breaches its terms even for public pages. Whether it breaks a law is a separate question; this is not legal advice.

Collect Glassdoor pages with the Web Scraping API

Billed on successful results only. Contact sales for the Web Scraping API and the volume you need, or run your own scraper on residential proxies. 24/7 live chat helps with setup and integration.