Python ile Glassdoor Nasıl Kazınır: İş İlanları, Maaşlar ve Yorumlar

Son güncelleme: April 16, 2026
Python ile Glassdoor Nasıl Kazınır: İş İlanları, Maaşlar ve Yorumlar

Glassdoor kazıyıcınız 2022’de harika çalışıp bugün yalnızca 403 hatası döndürüyorsa, yalnız değilsiniz. Forumlar aynı soruyla kaynıyor: “Bu kazıyıcı artık neden çalışmıyor?”

Kısa cevap: Glassdoor her şeyi değiştirdi. Recruit Holdings, Glassdoor’u Temmuz 2025’te Indeed’e entegre etti, 1.300 çalışanı işten çıkardı ve anti-bot korumasını öyle bir noktaya taşıdı ki, klasik Selenium ve requests tabanlı kazıyıcılar daha HTML’in ilk baytı bile gelmeden bloke ediliyor. Şubat 2026 itibarıyla Glassdoor oturum açma işlemleri tamamen Indeed Login üzerinden yürütülüyor — yani Glassdoor’a özel giriş formunu sabit kodlayan her eğitim, daha en baştan mimari olarak hatalı. Öte yandan platform hâlâ 2,5 milyon işveren genelinde 180 milyondan fazla yorum, maaş ve içgörü barındırıyor. Bu veri, doğru biçimde erişebilirseniz, İK kıyaslaması, rakip analizi ve satış potansiyel müşteri araştırması için inanılmaz değerli. Bu rehber, tüm bu değişikliklerden sonra hâlâ çalışan sürümdür; iş ilanları, yorumlar ve maaşlar olmak üzere üç Glassdoor veri türünün tamamını tek yerde ele alır. Çalışan 2025 koduyla Python yaklaşımını adım adım gösterecek, sizi tam olarak neyin engellediğini ve bunu nasıl aşacağınızı anlatacak, ayrıca mühendislik tarafına hiç girmek istemeyenler için kodsuz bir alternatif sunacağım.

2025’te Neden Python ile Glassdoor Kazıyorsunuz?

Glassdoor yalnızca bir iş ilanı sitesi değil. Web üzerindeki en zengin işveren istihbaratı veri kümelerinden biri; yaklaşık Fortune 500 şirketlerinin üçte biri tarafından kullanılıyor ve ayda yaklaşık 55 milyon tekil ziyaretçi çekiyor. O sayfaların arkasındaki veri, birden fazla ekip için doğrudan iş kararlarını besliyor.

Farklı ekiplerin Glassdoor verisini nasıl kullandığına bakalım:

Kullanım SenaryosuGerekli Veri TürüKimler Faydalanır
Maaş kıyaslamaMaaş dağılımları, örneklem büyüklükleriİK, Total Rewards, Operasyon
Rakip işe alım takibiİş ilanları, ilan yoğunluğuSatış, Strateji, VC/Kurumsal Gelişim
İşveren markası izlemeYorum metni, puan trendleri, CEO onayıİK, Pazarlama, İletişim
Lead üretimi (büyüyen şirketler)İş ilanları + şirket bilgileriSatış ekipleri, SDR’lar
Pazar / akademik araştırmaÜçünün de tamamıAnalistler, Danışmanlar, Araştırmacılar

glassdoor_stats_00937e478e.png

Ekim 2025’teki hükümet kapanışı sırasında BLS iş verisi yayımlayamazken, Glassdoor’un kendi Economic Research ekibi veri setlerinden alternatif bir iş raporu yayımladı. Bu veri artık kurumsal analistler tarafından ne kadar ciddiye alınıyor, buradan anlayabilirsiniz.

Python hâlâ ilk tercih olmaya devam ediyor; çünkü ekosistemi benzersiz: tarayıcı otomasyonu için Playwright, ayrıştırma için parsel/lxml, TLS fingerprint engelini aşmak için curl_cffi ve çalışan örüntüleri paylaşan devasa bir topluluk. Sorun Python değil. Sorun, Glassdoor’un kazınmasının çok daha zor hâle gelmiş olması.

Yapay zekâ ile Glassdoor verisi kazıyın Get Started Free

Glassdoor verisini kod yazmadan çekmek istiyorsanız, Thunderbit özel bir Python yığını kurmadan ve bakım derdiyle uğraşmadan iş ilanlarını, yorumları ve maaş sayfalarını kazımanıza yardımcı olabilir.

Glassdoor’da Hangi Verileri Gerçekten Kazıyabilirsiniz?

Çoğu rehber yalnızca iş ilanlarını anlatır. Ama forum başlıklarına, GitHub sorunlarına ve takip ettiğim Reddit sorularına bakınca kullanıcı talebinin en yüksek olduğu iki veri türü — kimsenin pek öğretmediği — yorumlar ve maaşlar. Aşağıda üç kategori için de çıkarılabilir verilerin tam dökümü var.

İş İlanları

En erişilebilir veri türü. Şunları çekebilirsiniz: iş unvanı, şirket adı, konum, maaş tahmini, şirket puanı, yayın tarihi, kolay başvuru rozeti ve iş bağlantısı. İş ilanlarına kısmen giriş yapmadan erişilebilir, ancak Glassdoor birkaç sayfadan sonra bir giriş açılır penceresi gösterebilir.

Şirket Yorumları

İşveren markası analizi için en ilginç bölüm burası. Çekilebilir alanlar şunlardır: genel puan, alt puanlar (iş-özel yaşam dengesi, kültür ve değerler, çeşitlilik ve kapsayıcılık, kariyer fırsatları, ücret ve yan haklar, üst yönetim), artılar metni, eksiler metni, yorum yapan kişinin pozisyonu, yorum tarihi ve istihdam durumu. Yorumun tam metni için giriş gerekir — kısa bir özet görünür, fakat tam artılar/eksiler yalnızca kimlik doğrulamayla açılır.

Maaş Verileri

En çok istenen ve en sinir bozucu veri türü. Şunları çıkarabilirsiniz: iş unvanı, temel maaş aralığı, toplam ücret aralığı, maaş raporu sayısı ve konum. Ancak maaş sayfaları tamamen giriş korumalıdır ve Glassdoor bazen kendi maaşınızı göndermeden başkalarının maaşlarını göremeyeceğiniz bir “erişimi açmak için katkıda bulun” akışı da ekler. Rakip rehberlerin hiçbiri bunun için çalışan kod sunmuyor — bunu biz düzelteceğiz.

Hangisi Giriş Gerektirir, Hangisi Gerektirmez?

Bu tablo, hangi sayfaların boş veri döndüreceğini acı tecrübeyle keşfetmenizi önler:

Veri TürüGiriş Yapmadan Erişilebilir mi?Notlar
İş ilanı başlıkları ve temel bilgilerBüyük ölçüde evetBirkaç sayfa sonra açılır pencere çıkabilir
Tam iş tanımlarıKısmenGenellikle 2–3 görüntülemeden sonra kilitlenir
Şirket yorumları (tam metin)Hayır — giriş gerekliKısa özet görünür, tam metin kilitli
Maaş verisiHayır — giriş gerekliAyrıca “erişimi açmak için katkıda bulun” isteyebilir

Eski Glassdoor Kazıyıcınız Neden Muhtemelen Bozuldu?

glassdoor_defense_82a26cd8bd.png

Bunu açıkça söylemek istiyorum: 2021–2023 tarihli bir öğreticiden kod kopyalıyorsanız, çalışmayacak. GitHub’daki en çok yıldız alan eski Glassdoor Selenium kazıyıcısı (MatthewChatham/glassdoor-review-scraper, yaklaşık 1,4 bin yıldız), “Glassdoor yeni UI tasarımı”, “Cloudflare anti-bot koruması” ve “NoSuchElementException” gibi 12’den fazla açık ve çözülmemiş sorunla terk edilmiş durumda. Apify’nin glassdoor-jobs-scraper actor’ü DEPRECATED olarak işaretlenmiş. ScrapeOps, Glassdoor için genel kazıma zorluğunu 10 üzerinden 9 ve engeli aşma zorluğunu 10 üzerinden 8 olarak değerlendiriyor.

Nelerin değiştiği ve eski kodun neden bozulduğuna bakalım:

Savunma KatmanıNe DeğiştiEski Kazıyıcılara Etkisi
Cloudflare Bot Management2024’ten beri daha sıkı JA3/JA4 parmak izi kontrolüBasit requests/Selenium betikleri anında 403 alır
Dinamik CSS sınıf adlarıSınıf adları her build’de rastgeleleşiyorÖğreticilerdeki eski CSS seçiciler sessizce bozulur
Hız sınırı + oturum takibiIP ve oturum başına daha sıkı limitlerKazıyıcılar daha az sayfa sonra engellenir
CAPTCHA zorlukları (muhtemelen Cloudflare Turnstile)Özellikle sayfalama sırasında daha sıkHeadless tarayıcılar zorluk tetikler
Genişletilmiş giriş duvarıDaha fazla sayfa türü kimlik doğrulama istiyorMaaş ve yorum sayfaları boş veri döndürür
Indeed Login geçişi (Şub 2026)Glassdoor giriş formu tamamen değiştiEski login DOM’una göre yazılmış her kod öldü

Scrapfly’nin 2026 rehberi açık bir uyarı taşıyor: “Glassdoor yüksek bloklama oranıyla bilinir; bu yüzden Python kodunu çalıştırırken None değerleri alıyorsanız, büyük olasılıkla engelleniyorsunuzdur.” Ve Mart 2026 tarihli bir DEV.to yazısı bunu daha da net söylüyor: “requests veya httpx ile yapılan basit HTTP istekleri anında engelleniyor.”

Size göstereceğim karşı önlemler — Patchright (gizlilik odaklı bir Playwright çatallanması), data-test öznitelik seçicileri, dönen residential proxy’ler ve kimliği doğrulanmış kalıcı oturumlar — bu katmanların her biriyle başa çıkmak için tasarlandı.

Glassdoor API mi, Python ile Kazıma mı? Önce Doğru Yolu Seçin

Birden fazla forum başlığı “Glassdoor API’sini kullansam olmaz mı?” diye soruyor — cevap ise: kullanamazsınız.

Eski Glassdoor Partner API’si yeni başvurulara kapalı. Geliştirici portalı teknik olarak hâlâ var ama HTTP 403 dönüyor. Yorumlar için hiçbir zaman kamuya açık bir uç nokta olmadı — MatthewChatham’ın kazıyıcısı açıkça “Glassdoor’da yorumlar için API olmadığı” için yazıldı. Ve Indeed’in Publisher API’si altında yorumlar ya da maaşlar için bir geçiş yolu da yok.

Açık karşılaştırma şu şekilde:

KriterGlassdoor Partner API v1Python ile KazımaThunderbit (kodsuz)
ErişimYeni başvurulara kapalıAçık (siz uygularsınız)Chrome uzantısı
İş ilanlarıSınırlı / kullanım dışıEforla mümkünErişilebilir
Şirket yorumlarıHiç kamuya açık olmadıEvet (giriş gerekir)Evet (Browser Mode ile)
Maaş verisiHiç kamuya açık olmadıEvet (giriş gerekir)Evet
Hız limitleriDokümante edilmemişKontrol sizdeKredi bazlı
Kurulum eforuYeni uygulama kaydı yokSaatler–günler~2 dakika
Bakım yüküUygulanamazYüksek (HTML değişince bozulur)Düşük (AI alanları yeniden önerir)

Yorumlara veya maaş verilerine ihtiyacınız varsa — ve bunu okuyan çoğu kişinin ihtiyacı da bu — Python ile kazıma ya da kodsuz bir araç tek gerçekçi seçeneğinizdir.

Başlamadan Önce

  • Zorluk: Orta seviye (Python ve terminal kullanımı konusunda rahat olmalısınız)
  • Gerekli süre: Tüm kurulum için yaklaşık 30–60 dakika; sonrasında her veri türü için yaklaşık 10 dakika
  • Gerekenler:
    • Python 3.10+ (3.11 veya 3.12 önerilir)
    • Chrome tarayıcısı yüklü olmalı
    • Bir Glassdoor hesabı (ücretsiz — maaş ve yorum verileri için gerekli)
    • Dönen residential proxy’ler (birkaç sayfadan fazlasını kazıyacaksanız)
    • İsteğe bağlı: kodsuz yolu istiyorsanız Thunderbit Chrome Uzantısı

2025’te Python ile Glassdoor Kazımak İçin Araçlar ve Kütüphaneler

Araç ekosistemi ciddi biçimde değişti. Glassdoor’un güncel savunmalarına karşı gerçekten işe yarayanlar şunlar.

Neden Glassdoor İçin En İyi Seçim Patchright?

Patchright, Runtime.Enable CDP sızıntısını yamayan bir gizlilik odaklı Playwright çatallanmasıdır — yani düz Playwright’ın Cloudflare korumalı sitelerde neden başarısız olduğuna yol açan teknik sebebi. Playwright ile birebir aynı API’yi kullanır; Playwright biliyorsanız Patchright da size tanıdık gelir. 1.58.2 sürümü (Mart 2026) güncel ve aktif biçimde bakımı yapılıyor.

Alternatiflerle karşılaştırınca:

  • Sade Playwright: Runtime.Enable sızıntısı nedeniyle Glassdoor giriş sayfasında tespit edilir
  • Selenium + undetected-chromedriver: undetected-chromedriver’ın son sürümü Şubat 2024’te; artık neredeyse eski nesil. Scrapfly benchmark’ı bunun “testteki her domainde başarısız” olduğunu buldu
  • requests + BeautifulSoup: JavaScript’i çalıştıramaz, Cloudflare’ın TLS fingerprinting’i tarafından anında engellenir
  • curl_cffi: Sayfalar başlangıç HTML’inde __NEXT_DATA__ gönderiyorsa hızlı yol için mükemmeldir (tarayıcıya göre 10–20 kat hızlı), ancak giriş ya da ara zorluk ekranlarını yönetemez

Destekleyici Kütüphaneler

  • parsel (1.11.0) veya lxml (6.0.4): Hızlı HTML/XPath ayrıştırma
  • csv veya pandas: Veri dışa aktarma
  • asyncio: Daha hızlı sayfalama için asenkron kazıma

Proxy’ler: Yalnızca Residential

Glassdoor’un Cloudflare katmanı, veri merkezi ASN’lerini agresif biçimde zorlayıp duruyor. Residential proxy’ler engel oranlarını %20–30’dan %5’in altına düşürebiliyor. Giriş seviyesi fiyatlar, IPRoyal için promosyon olarak yaklaşık 1,75 $/GB veya Decodo için 3,00 $/GB civarında. Üretim seviyesinde kazıma için hacme göre 3–8 $/GB bütçe ayırın.

Proxy kalitesi ne olursa olsun, istekler arasında rastgele gecikmeler (en az 3–8 saniye, uzun koşular için 5–15 saniye) şarttır.

Adım 1: Python Ortamınızı Kurun

Proje klasörünüzü oluşturun ve önerilen yığını kurun:

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

# Çekirdek yığın
pip install patchright==1.58.2 parsel==1.11.0

# Tarayıcı ikililerini kur
patchright install chromium

# İsteğe bağlı: __NEXT_DATA__ çıkarımı için hızlı yol
pip install "curl_cffi==0.15.0"

Patchright’ın bir Chromium ikilisi indirdiğini görmelisiniz. patchright install chromium başarısız olursa yeterli disk alanınızın (~300MB) olduğundan ve Python sürümünüzün 3.10+ olduğundan emin olun.

Adım 2: Patchright’ı Başlatın ve Glassdoor’a Gidin

Glassdoor’un Cloudflare katmanına karşı çalışan temel başlatma deseni şöyledir:

from patchright.sync_api import sync_playwright
import random, time

with sync_playwright() as p:
    browser = p.chromium.launch(
        headless=False,          # headless hâlâ daha kolay fark ediliyor
        channel="chrome",        # paketlenmiş Chromium yerine gerçek Chrome kullan
    )
    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"
    )

    # Giriş kaplamasını kapat — içerik hâlâ DOM'da duruyor
    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("Sayfa yüklendi — iş ilanı kartları görünüyor.")

Burada dikkat edilmesi gereken birkaç şey var. channel="chrome" bayrağı, paketlenmiş Chromium yerine sisteminizde yüklü Chrome ikilisini kullanmasını söyler — bu da daha gerçekçi bir tarayıcı parmak izi üretir. add_style_tag hilesi, Glassdoor’un giriş modalını (#HardsellOverlay) herhangi bir tıklama yapmadan gizler. Scrapfly doğruluyor: “içeriğin tamamı orada, sadece kaplama onun üstünü örtüyor” — modal görünse bile HTML’de veri duruyor.

Bir Chrome penceresinin açıldığını, Glassdoor iş arama sayfasına gittiğini ve giriş penceresi engel olmadan iş kartlarını gösterdiğini görmelisiniz.

Adım 3: Glassdoor İş İlanlarını Kazıyın

Kararlı Seçicileri Belirleyin

Glassdoor, CSS sınıf adlarını her build’de rastgele değiştirir — bu yüzden 2023 tarihli bir öğreticideki .jobCard_xyz123 seçicisi bugün sessizce hiçbir şey döndürür. Bunun yerine, Glassdoor’un iç QA standardı olan ve dağıtımlar arasında daha stabil kalan data-test özniteliklerini kullanın.

İş ilanı alanları için seçici referansı:

AlanSeçici
İş kartı kapsayıcısı[data-test="jobListing"]
İş unvanı[data-test="job-title"]
İş bağlantısıa[data-test="job-link"]
Şirket adı[data-test="employer-name"]
Konum[data-test="emp-location"]
Maaş aralığı[data-test="detailSalary"]
Şirket puanı[data-test="rating"]
Yayın tarihi[data-test="job-age"]
Sonraki sayfa[data-test="pagination-next"]

İş Verisini Çekin

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"Sayfa {page_num}: Kart bulunamadı — engel veya seçici değişikliği olabilir.")
            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"Sayfa {page_num}: {len(cards)} iş ilanı kazındı")

        # Sayfalama
        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

CSV’ye Kaydetme

def save_to_csv(jobs, filename="glassdoor_jobs.csv"):
    if not jobs:
        print("Kaydedilecek iş verisi yok.")
        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"{len(jobs)} iş ilanı {filename} dosyasına kaydedildi")

Sayfalama sınırına dair not: Glassdoor, toplam sayı ne olursa olsun arama sonuçlarını kabaca 30 sayfa ile sınırlar. Daha fazla kapsama ihtiyacınız varsa, sınıra ulaşmaya çalışmak yerine her aramayı filtrelerle (konum, iş türü, maaş aralığı) daraltın.

Testlerimde, 5 sayfa iş ilanını (yaklaşık 75 iş) rastgele gecikmelerle kazımak yaklaşık 45 saniye sürdü. Aynı işi elle yapmak en az 20 dakikalık kopyala-yapıştır gerektirir.

Adım 4: Glassdoor Şirket Yorumlarını Kazıyın

Bu bölüm, başka hiçbir rehberin çalışan kod sunmadığı kısım. Yorumlar, gerçek işveren istihbaratının bulunduğu yerdir — duygu analizi, kültür sinyalleri, yönetimle ilgili kırmızı bayraklar.

Yorumlar Sayfasına Gidin

Yorum URL’leri şu deseni izler: /Reviews/{Company}-Reviews-E{id}.htm. İşveren ID’sini Glassdoor’da bir şirketi arayarak ve URL’yi kontrol ederek bulabilirsiniz.

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)

Gizli BFF Uç Noktası (En Temiz Yol)

Araştırmalarımdan çıkan en büyük bulgu şu: Glassdoor yorumlarının HTML ayrıştırmayı tamamen atlayan çalışan bir dahili JSON API’si var. Scrapfly kazıyıcı deposu bu uç noktayı belgeliyor ve DOM kazımaya göre çok daha güvenilir.

import json, re, requests

def get_review_ids(page):
    """Yorum sayfası HTML'sinden employerId ve dynamicProfileId çıkarır."""
    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):
    """Yapılandırılmış yorum verisi için Glassdoor'un dahili BFF uç noktasını çağırır."""
    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 {pg}. sayfada {resp.status_code} döndürdü")
            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"Yorumlar sayfası {pg}/{total_pages}: {len(reviews)} yorum alındı")
        if pg >= total_pages:
            break
        time.sleep(random.uniform(3, 6))

    return all_reviews

BFF uç noktası size tüm yorum alanlarını temiz JSON olarak verir — HTML ayrıştırmaya da CSS seçici bozulmasına da gerek kalmaz. Kimliği doğrulanmış bir Playwright oturumundan gelen oturum çerezlerine ihtiyacınız var (bu, aşağıdaki 6. adımda ele alınıyor) ve önce yorum sayfası HTML’sinden employerId ve dynamicProfileId çıkarmanız gerekiyor.

Yorumlar İçin HTML Yedek Seçiciler

BFF uç noktası değişirse veya DOM ayrıştırmayı tercih ederseniz, kararlı data-test seçicileri şunlardır:

AlanSeçici
Yorum kapsayıcısı[data-test="review"]
Başlık[data-test="review-title"]
Genel puan[data-test="overall-rating"]
Artılar[data-test="pros"]
Eksiler[data-test="cons"]
Tarih[data-test="review-date"]
Yazarın rolü[data-test="author-jobTitle"]

Adım 5: Glassdoor Maaş Verilerini Kazıyın

Maaş sayfaları tamamen giriş korumalıdır. Bu kodun gerçek veri döndürmesi için önce kimliği doğrulanmış bir oturuma sahip olmanız gerekir (Adım 6).

Maaş Sayfasına Gidin

Maaş URL’leri şu şekildedir: /Salary/{Company}-Salaries-E{id}.htm, sayfalama ise _P{n}.htm biçimindedir.

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"Maaş sayfası {pg}: öğe yok — olası giriş kapısı veya engel.")
            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"Maaş sayfası {pg}: {len(items)} kayıt kazındı")

    return all_salaries

Dikkat edin, [class*="SalaryItem_jobTitle__"] önek eşleştirme desenini kullanıyoruz. Glassdoor’un maaş sayfası, CSS module ile hash’lenmiş sınıf adları kullanır (örneğin SalaryItem_jobTitle__XWGpT); bu hash eki her dağıtımda değişir. Önek sabit kalır — hash değil. Tam sınıf adını asla sabitlemeyin.

Adım 6: Glassdoor’un Giriş Duvarını Aşın

Bu, maaş verilerini ve tam yorum metnini açan kritik kısımdır. Yaklaşım şu: görünür bir tarayıcıda bir kez manuel giriş yapın, kimliği doğrulanmış oturum durumunu kaydedin ve ardından bunu sonraki tüm kazıma çalışmalarında yeniden kullanın.

Kimliği Doğrulanmış Oturumu Kaydedin

Bu betiği bir kez çalıştırın. Bir Chrome penceresi açar, Glassdoor’un giriş sayfasına gider (bu sayfa artık Indeed Login’e yönleniyor) ve manuel giriş yapmanızı bekler:

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("Tarayıcı penceresinde giriş yapın, sonra burada Enter'a basın...")
        input()
        await context.storage_state(path=str(STATE_FILE))
        print(f"Oturum {STATE_FILE} dosyasına kaydedildi")
        await browser.close()

asyncio.run(login_and_save())

Giriş yapıp Enter’a bastığınızda, Patchright tüm çerezleri ve yerel depolamayı glassdoor_state.json dosyasına kaydeder. Bu dosya gdId, GSESSIONID, cf_clearance ve auth token’larınızı içerir.

Kazıma İçin Oturumu Yeniden Kullanın

Sonraki her kazıma çalışması kaydedilmiş durumu yükler — manuel giriş gerekmez:

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

Kaydedilen oturum genellikle Glassdoor yeniden zorlama yapmadan önce 20–30 dakikalık aktif kullanım sürer. Daha uzun kazıma işlerindeyse, bir kontrol mekanizması kurun: veri içermesi gereken bir sayfa sıfır sonuç döndürüyorsa, durum dosyanızı yenilemek için giriş betiğini yeniden çalıştırın.

Giriş Açılır Penceresini Tespit Etme ve Kapatma

Kısmen korumalı sayfalarda (veri gösteren ama üstüne modal bindiren iş ilanları) daha önceki adımlardaki CSS enjeksiyonu işe yarar:

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

Bu yalnızca HTML’in altında veri zaten mevcutsa işe yarar. Tamamen sunucu tarafında kilitli sayfalarda (maaşlar, derin yorum sayfaları) tek yol, 6. adımda alınan kimliği doğrulanmış oturumdur.

Glassdoor Kazıyıcınızı Çalışır Tutmak İçin İpuçları

Glassdoor ön yüzünü sık sık güncelliyor. Kazıyıcınızı dayanıklı hâle getirmenin yolları şöyle.

Sınıf Adları Yerine data-test Özniteliklerini Tercih Edin

Glassdoor CSS sınıf adlarını rastgeleleştirir ama data-test özniteliklerini daha sabit tutma eğilimindedir. Her zaman .jobCard_abc123 yerine [data-test="jobListing"] kullanın. data-test yoksa (maaş alan sınıflarında olduğu gibi), önek eşleştirmeyi tercih edin: [class*="SalaryItem_jobTitle__"].

Proxy Döndürün ve Gecikmeleri Rastgeleleştirin

Dönen residential proxy’ler kullanın — veri merkezi IP’leri neredeyse anında zorlukla karşılaşır. Sayfa yüklemeleri arasında 3–8 saniyelik rastgele gecikmeler ekleyin (uzun koşular için 5–15 saniye). Mümkünse ABD iş saatlerinde kazıma yapmaktan kaçının; çünkü Cloudflare’ın davranışsal tespiti o saatlerde daha agresiftir.

Bozulmayı Takip Edin

Kazıyıcınıza basit bir kontrol ekleyin: veri içermesi gereken bir sayfa sıfır kayıt döndürüyorsa, bunu boş sonuç değil seçici hatası olarak değerlendirin ve kendinize uyarı verin. Bozulmayı erken yakalamak için haftalık küçük bir test kazıması çalıştırın — Glassdoor ön yüz değişikliklerini duyurmadan yayınlar.

Mümkün Olduğunda __NEXT_DATA__ Hızlı Yolunu Kullanın

Glassdoor bir Next.js + Apollo GraphQL uygulamasıdır. Birçok sayfa, tam GraphQL önbelleğini JSON olarak içeren <script id="__NEXT_DATA__"> etiketi gönderir. Bunu ayrıştırmak, DOM kazımaya göre çok daha dayanıklıdır ve Hardsell kaplamasını tamamen atlar:

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

Bu, tüm iş, yorum ve maaş alanlarını içeren yapılandırılmış Apollo önbelleğini döndürür — CSS seçicisine gerek yoktur. Çünkü bu, Glassdoor’un React ön yüzünü besleyen verinin aynısıdır; dolayısıyla en dayanıklı çıkarım stratejisidir.

Kodu Atlayın: Thunderbit ile Glassdoor Kazıyın (Python Gerekmez)

Bunu okuyan herkes geliştirici değil. İK ekipleri, işe alımcılar, satış operasyonu analistleri ve pazar araştırmacılarının da Glassdoor verisine ihtiyacı var — ve bunu almak için Playwright context’leri ve proxy döndürme yönetimi yapmak zorunda kalmamaları gerekir.

Thunderbit, tek satır kod yazmadan aynı iş ilanı, yorum ve maaş verilerini çıkarabilen bir AI Web Scraper Chrome Uzantısıdır. Thunderbit ekibinde çalışıyorum, bu yüzden bunu açıkça söylüyorum — ama buraya eklememin nedeni, Glassdoor kazımasındaki en zor iki problemi gerçekten çözmesi.

Thunderbit Glassdoor’da Nasıl Çalışır?

Akış iki tıklamadan oluşur:

  1. Chrome’da herhangi bir Glassdoor sayfasını açın (iş arama, şirket yorumları, maaş sayfası)
  2. Thunderbit kenar çubuğunda AI Alan Öner’e tıklayın — yapay zekâ sayfa DOM’unu okur ve sütunlar önerir (iş unvanı, şirket, puan, maaş aralığı, artılar, eksiler vb.)
  3. Kazı’ya tıklayın — veriler CSS seçicisi ya da tarayıcı otomasyon kodu olmadan tabloya çıkarılır

Thunderbit’in, tek çalıştırmada şirket başına 23’ten fazla alan çıkaran hazır bir Glassdoor şirket kazıyıcı şablonu vardır. İş ilanları, yorumlar veya maaşlar için ise genel AI Alan Öner akışı herhangi bir Glassdoor URL’sinde çalışır.

Kod Olmadan Giriş Duvarını Aşmak

Glassdoor özelinde Thunderbit’in yapısal avantajı budur. Browser Mode, kendi Chrome oturumunun içinde çalışır — Chrome’da Glassdoor’a giriş yaptıysan Thunderbit bu çerezleri otomatik olarak devralır. Sunucu taraflı kazıyıcıları durduran maaş ve yorum giriş duvarı burada geçerli olmaz. Çerez yönetimi yok, kalıcı context yok, oturum kodu yok.

Zenginleştirme İçin Alt Sayfa Kazıma

Bir liste sayfasından başlayın (örneğin aramadan 30 şirket), Thunderbit’in satırları tek tek listelemesine izin verin, ardından her şirketin yorum ya da maaş sayfasını ziyaret edip tabloyu tam açıklamalar, yorum metni veya maaş detaylarıyla zenginleştirmek için alt sayfa kazımayı etkinleştirin.

İş Araçlarına Dışa Aktarın

CSV veya JSON üreten Python betiklerinden farklı olarak Thunderbit veriyi doğrudan Google Sheets, Airtable, Notion veya Excel’e aktarır — tüm planlarda ücretsiz. Özellikle veriyi ekip içinde paylaşması ve birlikte analiz etmesi gereken ekipler için çok kullanışlıdır.

Python mı Thunderbit mi: Hangisini Ne Zaman Kullanmalı?

SenaryoÖnerilen Yaklaşım
Tekrarlayan bir veri hattı kuruyorsanızPython + Patchright
Tek seferlik araştırma veya küçük ekip projesiThunderbit
Her alan üzerinde programatik kontrol istiyorsanızPython
Bugün Glassdoor verisine ihtiyacı olan geliştirici olmayan biriysenizThunderbit
Tek çalıştırmada 1.000+ sayfa kazıyorsanızPython + proxy’ler
30 şirketi zenginleştirilmiş biçimde kazıyorsanızİkisi de olur — Thunderbit kurulumda daha hızlıdır

Thunderbit fiyatlandırması ücretsiz planla başlar (ayda 6 sayfa), Pro planı ise ayda 38 $ karşılığında 3.000 kredi sunar. Çıktı satırı başına 1 kredi (alt sayfa kazıma için 2 kredi) hesabıyla bu, ayda yaklaşık 33 kez 30 şirketlik zenginleştirilmiş çalışma için yeterlidir.

Glassdoor kazıma için Thunderbit'i deneyin

Glassdoor Kazımak Yasal mı?

Kısa ve net konuşacağım. Glassdoor’un Kullanım Şartları otomatik kazımayı açıkça yasaklıyor: “Hizmetlere herhangi bir amaçla, açık yazılı iznimiz olmadan robot, spider, scraper... kullanamazsınız.”

Ama hukuki tablo, tek bir ToS maddesinden daha nüanslı:

  • Meta v. Bright Data (N.D. Cal., Ocak 2024): Mahkeme, hiç giriş yapmadıysanız ToS’u da kabul etmediğinizi ve herkese açık, giriş yapılmamış kazımanın bunu ihlal etmediğini belirledi
  • hiQ Labs v. LinkedIn (9. Daire): CFAA, kamuya açık verilerin otomatik toplanmasına uygulanmaz — ancak sahte hesaplar ve giriş yaparak kazıma ayrı bir konudur
  • Van Buren v. United States (Yüksek Mahkeme, 2021): CFAA kapsamındaki “yetkili erişimi aşma” tanımını daralttı

Pratik çıkarım şu: giriş yapmadan herkese açık iş ilanlarını kazımak, yasal açıdan görece daha güvenli bir alandadır. Giriş yapılmış bir oturumla kazıma yapmak, kayıt sırasında ToS’u kabul ettiğiniz anlamına gelir; bu şartlar bunu açıkça yasaklar. Bu, Python betikleri ve Thunderbit’in Browser Mode’u için eşit şekilde geçerlidir.

Takip etmeye değer etik ilkeler:

  • İnsan gezinme hızının oldukça altında hız sınırı uygulayın
  • Kişisel olarak tanımlanabilir yorumcu bilgilerini kazımayın veya yeniden satmayın
  • robots.txt yönergelerine uyun
  • Sadece gerçekten ihtiyaç duyduğunuz alanları çekin

Sonuç: Hangi Yöntem Sizin İçin Doğru?

Bu rehber, Indeed Login geçişini, Cloudflare Bot Management’i ve eski tüm öğreticileri bozan CSS-module sınıf adı dönüşümünü dikkate alan çalışan 2025 koduyla üç Glassdoor veri türünü — iş ilanları, yorumlar ve maaşlar — kapsadı.

Karar çerçevesi şöyle:

DurumunuzEn İyi Yol
Veri hattı kuran geliştiriciPython + Patchright (yukarıdaki adımları izleyin)
Tek seferlik araştırma veya düzenli küçük çekimlerThunderbit (kodsuz, tarayıcı tabanlı)
Sadece küçük ölçekte temel iş ilanlarına ihtiyacınız varsaÖnce Glassdoor API erişimi hâlâ açık mı kontrol edin (muhtemelen değil)
Özellikle maaş veya yorum verisine ihtiyacınız varsaPython ile kazıma ya da Thunderbit kullanmalısınız — API bunları hiç kapsamadı
Veriyi paylaşan geliştirici olmayan ekipThunderbit → Google Sheets’e aktarım

Glassdoor’un savunmaları gelişmeye devam edecek. Seçiciler bozulacak. Yeni zorluklar çıkacak. Bu rehberi kaydedin — ve web kazıma araçları ile tekniklerine daha derin bakmak isterseniz, en iyi otomatik web kazıma araçları, Python ile bir web sitesinden veri nasıl kazınır ve en iyi iş kazıma araçları yazılarına göz atın. Ayrıca Thunderbit YouTube Kanalı üzerindeki anlatımları da izleyebilirsiniz.

Glassdoor veri çıkarımı için Thunderbit'i deneyin Get Started Free

SSS

1. Glassdoor’u giriş yapmadan kazıyabilir misiniz?

Evet, çoğu iş ilanı verisi ve üst seviye şirket puanları için. Hayır, tam maaş dökümleri veya ilk birkaç sayfayı aşan tam yorum metni için. #HardsellOverlay yalnızca CSS tabanlı bir modal’dır — altındaki HTML ilk sayfa verisini hâlâ içerir — fakat daha derin içerik, Glassdoor’un “vermek için al” duvarının arkasında sunucu tarafında kilitlidir.

2. 2025’te Glassdoor kazımak için en iyi Python kütüphanesi hangisi?

Varsayılan öneri Patchright’tır (gizlilik odaklı Playwright çatallanması). Sade Playwright’taki ve Cloudflare’ın özellikle kontrol ettiği Runtime.Enable CDP sızıntısını yamalar. Başlangıç HTML’inde __NEXT_DATA__ taşıyan liste sayfaları için impersonate="chrome124" ile curl_cffi, 10–20 kat daha hızlıdır ancak giriş korumalı sayfaları yönetemez.

3. Glassdoor kazırken engellenmemek için ne yapmalıyım?

Patchright veya rebrowser-playwright kullanın (sade Playwright veya Selenium değil). Residential proxy’ler döndürün — veri merkezi IP’leri hemen zorlukla karşılaşır. Sayfalar arasında 3–8 saniyelik rastgele gecikmeler ekleyin. Çerezleri (gdId, cf_clearance, GSESSIONID) istekler arasında kalıcı tutun. Yeniden zorlama gelmeden önce 20–30 dakikalık oturum penceresi bekleyin.

4. Kazıma yerine kullanabileceğim bir Glassdoor API’si var mı?

Fiilen hayır. Eski Partner API yeni başvurulara kapalıdır, kamuya açık bir yorum uç noktası hiç olmadı ve Indeed’in Publisher API’si altında da bir geçiş yolu yok. Yorumlar ve maaş verileri için kazıma veya Thunderbit gibi kodsuz bir araç tek pratik seçenektir.

5. Glassdoor kazıyıcılar ne sıklıkla bozulur?

Sık sık. Glassdoor ön yüz değişikliklerini duyurmadan yayınlar ve CSS-module sınıf adı hash’leri her build’de değişir. En dayanıklı çıkarım stratejileri: (1) data-test öznitelik seçicileri, (2) __NEXT_DATA__ JSON bloğu ve (3) dahili BFF yorum uç noktasıdır. Sıfır sonuç kontrolü ekleyin ve bozulmayı erken yakalamak için haftalık küçük bir test kazıması çalıştırın.

Daha Fazla Öğrenin

Ke
Ke
Thunderbit’ta CTO | Kıdemli Veri Bilimci ve ML Uzmanı Makine öğrenimi ve veri bilimi alanında yaklaşık on yıllık deneyime sahip olan Ke Shen, Columbia University mezunu ve Walmart Labs’te eski Kıdemli Veri Bilimci’dir. Python, R, Java ve İstatistik konularında derin ve meslektaşları tarafından tanınan uzmanlığıyla, karmaşık yapay zekâ algoritmalarını teoriden üretim düzeyinde mimariye taşıma konusunda sahada test edilmiş içgörüler paylaşır.
İçindekiler

Sadece sorarak bir web sayfasını çek

Ne istediğini düz İngilizceyle söyle. Hatta daha iyisi, hiçbir şey söyleme.

Thunderbit’i dene ücretsiz
Yapay Zeka ile Veri Çıkar
Verileri Google Sheets, Airtable veya Notion’a kolayca aktar
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week