Zum Inhalt

So kratzen Sie Glassdoor

Glassdoor ist eine großartige Ressource für Arbeitssuchende, Arbeitnehmer und Arbeitgeber gleichermaßen. Es enthält eine Fülle von Informationen zu Unternehmen und Jobs, darunter Gehälter, Bewertungen, Interviewfragen, Bürofotos und mehr. All diese Daten machen Glassdoor zu einem attraktiven Ziel für Web Scraping.

In diesem umfassenden Leitfaden gehen wir durch verschiedene Techniken und Strategien zum Scrapen verschiedener Arten von Daten aus Glassdoor.

Überblick über die Architektur von Glassdoor

Bevor wir uns mit den Besonderheiten des Scrapings befassen, wollen wir zunächst verstehen, wie die Website von Glassdoor aufgebaut ist:

  • Clientseitiges Rendering – Glassdoor verwendet React, um den Großteil seiner Benutzeroberfläche auf der Clientseite und nicht auf der Serverseite darzustellen. Dies bedeutet, dass der anfänglich an den Browser gelieferte HTML-Code minimal ist und die meisten Inhalte mit Javascript geladen und gerendert werden.

  • GraphQL-API – Die auf Glassdoor-Seiten angezeigten Daten werden über eine GraphQL-API abgerufen. Die Website sendet AJAX-Anfragen an diese API, um strukturierte Daten abzurufen, die dann auf der Seite gerendert werden.

  • Starker Kratzschutz – Glassdoor nutzt verschiedene Anti-Scraping-Maßnahmen wie Bot-Erkennung, Ratenbegrenzung und Blockierung von Scrapern.

Zusammenfassend lässt sich sagen, dass Glassdoor eine Single-Page-React-App ist, die GraphQL zum Abrufen von Daten verwendet und über starke Anti-Scraping-Schutzmaßnahmen verfügt. Diese Architektur stellt Scraper vor einige einzigartige Herausforderungen, die wir bewältigen müssen.

Übersichtsseiten der Scraping Company

Jedes Unternehmen auf Glassdoor verfügt über eine eigene Übersichtsseite mit grundlegenden Informationen wie Hauptsitz, Branche, Umsatz usw. Sehen wir uns an, wie Sie diese Details abrufen können.

Um die Übersichtsseite eines Unternehmens zu erhalten, benötigen wir dessen Glassdoor-ID, die in der Seiten-URL enthalten ist:

https://www.glassdoor.com/Overview/Working-at-Google-EI_IE9079.16,22.htm 

Hier EI_IE9079 bezeichnet die Firmen-ID von Google. Wir können diese ID aus jeder Unternehmens-URL extrahieren, um die URL der Übersichtsseite zu erstellen.

Durch das Scrapen des rohen HTML-Codes dieser Seite erhalten wir keine strukturierten Daten. Der Schlüssel besteht darin, die GraphQL-Daten aus der Seite zu extrahieren, die alle Informationen in einem strukturierten JSON-Format enthält.

So extrahieren Sie die GraphQL-Daten:

import json
import re 

html = # page HTML
match = re.search(r‘window.__ENV__ = (\{.*?\})‘, html)
if match:
    data = json.loads(match.group(1))  

Dadurch erhalten wir die vollständigen GraphQL-Daten für die Seite. Wir können jetzt Felder wie analysieren description, headquarters, revenue, Etc.:

overview = data[‘EmployerPage‘][‘Employer‘]

print(overview[‘description‘]) 
print(overview[‘headquarters‘])
print(overview[‘revenue‘])

Und das ist es! Mit nur wenigen Zeilen Python-Code können wir strukturierte Daten für die Glassdoor-Übersicht jedes Unternehmens extrahieren.

Scraping-Stellenangebote

Glassdoor ermöglicht das Durchsuchen offener Stellenangebote, die von Unternehmen veröffentlicht wurden. Diese Einträge enthalten Titel, Ort, Beschreibung und mehr.

Um die Stellenangebote eines Unternehmens zu finden, navigieren wir zu:

https://www.glassdoor.com/Jobs/Google-Jobs-E9079.htm

Die Stellenanzeigen werden dynamisch über AJAX-Aufrufe beim Herunterscrollen oder Seitenwechsel geladen. Die Daten stammen wieder von GraphQL und wir müssen sie analysieren.

Zuerst stellen wir eine Anfrage an Seite 1, um die Gesamtzahl der Aufträge zu erhalten, anhand derer wir die Anzahl der Seiten berechnen. Dann durchsuchen wir jede Seite, um Jobdaten zu extrahieren:

import math
import json 

def get_jobs(companyId):
    url = f‘https://www.glassdoor.com/Jobs/-Jobs-E{companyId}.htm‘

    # request page 1 to get total job count
    page = requests.get(url) 
    total = extract_job_count(page.text) 
    pages = math.ceil(total / 20)

    jobs = []

    # scrape data from each page
    for page in range(1, pages+1):
        page = requests.get(f‘{url}?p={page}‘)
        data = json.loads(extract_graphql(page.text))  
        jobs.extend(data[‘jobs‘])

    return jobs

Dies ermöglicht es uns, systematisch alle Jobs für jedes Unternehmen zu streichen. Der Schlüssel liegt in der Berechnung der Seiten basierend auf der Gesamtzahl der Jobs und der Paginierung durch AJAX-Aufrufe.

Bewertungen von Scraping-Unternehmen

Bewertungen sind wohl die wertvollsten Daten auf Glassdoor. Lassen Sie uns besprechen, wie Sie alle Bewertungen für ein Unternehmen durchsuchen können.

Ähnlich wie bei Jobs navigieren wir zur Seite mit den Unternehmensbewertungen:

https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm

Wir müssen verstehen, wie Bewertungen paginiert werden. Glassdoor zeigt eine feste Anzahl von Bewertungen pro Seite an und wir müssen alle Seiten durchsuchen, um vollständige Daten zu erhalten.

Die Anzahl der Rezensionsseiten kann im Voraus berechnet werden, indem a extrahiert wird numberOfPages Feld aus GraphQL-Daten. Dann paginieren wir jede Seite und sammeln Bewertungen:

import math
import json

def get_reviews(companyId):
    url = f‘https://www.glassdoor.com/Reviews/-Reviews-E{companyId}.htm‘ 

    # extract number of pages from initial request
    page = requests.get(url)
    data = json.loads(extract_graphql(page.text))
    pages = data[‘numberOfPages‘]

    reviews = []

    for page in range(1, pages+1):
        page = requests.get(f‘{url}?p={page}‘) 
        data = json.loads(extract_graphql(page.text))

        # extract reviews
        reviews.extend(data[‘reviews‘]) 

    return reviews

Hier extrahieren wir im Voraus die Anzahl der Rezensionsseiten und durchlaufen dann jede Seite, um den vollständigen Satz an Rezensionen zu erstellen.

Mit dieser Technik können alle Bewertungen für jedes Unternehmen auf Glassdoor gelöscht werden!

Scraping-Gehälter

Neben Bewertungen sind auch Gehaltsdaten von großem Nutzen. Glassdoor verfügt für jedes Unternehmen über einen eigenen Gehaltsbereich. Schauen wir uns das Scrapen von Gehaltsunterlagen an.

Wir beginnen mit der URL der Gehaltsseite:

https://www.glassdoor.com/Salary/Google-Salaries-E9079.htm 

Unser allgemeiner Ansatz wird wiederum Folgendes umfassen:

  1. Berechnung der Seitenanzahl aus der Gesamtgehaltszählung
  2. Ich blättere jede Seite durch und kratze Gehaltsunterlagen durch

Hier ist eine Implementierung:

import math
import json

def get_salaries(companyId):
    url = f‘https://www.glassdoor.com/Salary/-Salaries-E{companyId}.htm‘

    # extract page count
    page = requests.get(url)
    data = json.loads(extract_graphql(page.text)) 
    pages = data[‘numPages‘]

    salaries = []

    for page in range(1, pages+1):
        page = requests.get(f‘{url}?p={page}‘)
        data = json.loads(extract_graphql(page.text))

        # extract salary records 
        salaries.extend(data[‘salaries‘])

    return salaries

Dadurch können wir alle Gehälter eines Unternehmens systematisch über mehrere Seiten hinweg durchsuchen.

Fragen zum Scraping-Interview

Einblicke in Vorstellungsgespräche sind eine weitere großartige Datenquelle auf Glassdoor. Schauen wir uns an, wie man alle für ein Unternehmen geposteten Interviewfragen herausfiltert.

Die Interviewseite des Unternehmens finden Sie unter:

https://www.glassdoor.com/Interview/Google-Interview-Questions-E9079.htm

Interviewfragen werden dynamisch über AJAX-Anfragen beim Herunterscrollen oder Seitenwechsel geladen.

Unser Spielplan ist bekannt:

  1. Berechnen Sie die Anzahl der Seiten aus der Gesamtzahl der Fragen
  2. Extrahieren Sie Fragen von jeder Seite

Hier ist eine Implementierung:

import math
import json

def get_questions(companyId):
    url = f‘https://www.glassdoor.com/Interview/-Interview-Questions-E{companyId}.htm‘

    # get total question count
    page = requests.get(url)
    data = json.loads(extract_graphql(page.text))
    total = data[‘interviewQuestionCount‘]
    pages = math.ceil(total / 20)

    questions = []

    for page in range(1, pages+1):
        page = requests.get(f‘{url}?p={page}‘)
        data = json.loads(extract_graphql(page.text))

        # extract questions
        questions.extend(data[‘interviewQuestions‘])

    return questions

Zusammenfassend lässt sich sagen, dass wir die Gesamtseitenzahl basierend auf der Anzahl der Fragen berechnen, durch AJAX-Aufrufe paginieren und Fragen extrahieren – so können wir alle Intervieweinblicke für ein Unternehmen erhalten.

Bürofotos kratzen

Um die Extraktion unserer Glassdoor-Daten zu vervollständigen, kratzen wir auch Fotos von Firmenbüros, die einen schönen visuellen Einblick bieten.

Die Fotoseite eines Unternehmens kann aufgerufen werden unter:

https://www.glassdoor.com/Photos/Google-Office-Photos-E9079.htm

Es gilt unsere Standard-Paginierungsstrategie – Seiten anhand der Gesamtzahl der Fotos berechnen, durch AJAX-Aufrufe paginieren, Fotos extrahieren:

import math 
import json

def get_photos(companyId):
    url = f‘https://www.glassdoor.com/Photos/-Office-Photos-E{companyId}.htm‘

    # get total photo count 
    page = requests.get(url)
    data = json.loads(extract_graphql(page.text))
    total = data[‘officePhotoCount‘]
    pages = math.ceil(total / 20)

    photos = []

    for page in range(1, pages+1):
        page = requests.get(f‘{url}?p={page}‘)
        data = json.loads(extract_graphql(page.text))

        # extract photos
        photos.extend(data[‘officePhotos‘])

    return photos

Und damit können wir alle für ein Unternehmen verfügbaren Bürofotos durchsuchen!

Umgang mit Anti-Scraping

Während die besprochenen Techniken das Extrahieren verschiedener Datenpunkte aus Glassdoor ermöglichen, werden Scraper im großen Maßstab normalerweise blockiert.

Glassdoor verfügt über eine Reihe von Anti-Scraping-Mechanismen, um eine umfassende Datenextraktion zu verhindern, darunter:

  • IP-Blockierung
  • Browser Fingerprinting
  • Bot-Erkennungssysteme
  • Rate Limiting

Hier sind einige Tipps, um Blockaden beim Scrapen von Glassdoor zu vermeiden:

  • Verwenden Sie Proxys: Wechseln Sie für jede Anfrage verschiedene private Proxys, sodass Ihr Scraper als unterschiedliche Benutzer angezeigt wird.

  • Grenzrate: Stellen Sie sicher, dass die Verzögerungen zwischen Anfragen und Scraping moderat sind.

  • Mimic-Browser: Legen Sie einen gültigen Benutzeragenten fest, akzeptieren Sie Header und aktivieren Sie Javascript, damit es wie ein echter Browser aussieht.

  • Überwachen Sie Blöcke: Überprüfen Sie, ob Ihre IP oder Proxys blockiert werden, und wechseln Sie entsprechend das Rechenzentrum oder den Anbieter.

  • Nutzen Sie Scraping-Dienste: Nutzen Sie Scraping-APIs wie ScraperAPI und Octoparse, die über integrierte Unterstützung zur Umgehung von Anti-Scraping-Mechanismen verfügen.

Mit den richtigen Vorsichtsmaßnahmen ist es möglich, in großem Umfang Daten aus Glassdoor zu extrahieren, ohne blockiert zu werden.

Scraping von Glassdoor mit ScraperAPI

ScraperAPI ist eine kostenpflichtige Scraping-API, die alle Anti-Scraping-Herausforderungen bewältigt und die Extraktion von Daten in großem Maßstab ermöglicht.

Es unterstützt Ajax-Crawling und Proxys und lässt sich direkt in beliebte Bibliotheken wie Python Requests integrieren.

So würden wir Unternehmensbewertungen mit ScraperAPI scrapen:

import requests
import math
import json

API_KEY = ‘XXX‘ # assign key

def get_reviews(companyId):

    url = f‘https://www.glassdoor.com/Reviews/-Reviews-E{companyId}.htm‘

    # initial request to get page count
    response = requests.get(url, 
        headers={‘apikey‘: API_KEY})

    pages = extract_page_count(response.text)

    reviews = []

    for page in range(1, pages+1):
        response = requests.get(f‘{url}?p={page}‘,
            headers={‘apikey‘: API_KEY})

        data = json.loads(response.text)    
        reviews.extend(data[‘reviews‘])

    return reviews 

Hier kümmert sich ScraperAPI um Proxys, Browser und andere Aspekte, sodass wir uns auf die Datenextraktion konzentrieren können.

Dies ist eine einfache Möglichkeit, skalierbare Glassdoor-Schaber zu bauen, ohne sich um Anti-Schaber-Systeme kümmern zu müssen.

Beim Bau von Glassdoor-Schabern ist es wichtig, sicherzustellen, dass Ihre Arbeit rechtskonform ist. Hier sind einige wichtige Aspekte, die es zu berücksichtigen gilt:

  • Nutzungsbedingungen – Studieren Sie die Nutzungsbedingungen von Glassdoor, um die Erlaubnisse und Einschränkungen bei der Nutzung der Daten zu verstehen. Das regelmäßige Scrapen angemessener Mengen für nichtkommerzielle Zwecke ist grundsätzlich zulässig.

  • Personenbezogene Daten – Vermeiden Sie es, persönliche Benutzerdaten wie Namen, E-Mail-IDs usw. von Glassdoor zu extrahieren, da dies zu Datenschutzproblemen führt.

  • Copyrights – Glassdoor-Bewertungen und andere von Benutzern übermittelte Daten unterliegen dem Urheberrecht. Vervielfältigen Sie keine wörtlichen Inhalte der Website massenhaft.

  • Ratenbegrenzungen – Beachten Sie alle von Glassdoor durchgesetzten Ratenbeschränkungen und überlasten Sie die Server nicht mit einer übermäßigen Anzahl von Anfragen.

  • Anwendungsbeispiele – Nutzen Sie Glassdoor-Daten nicht für unethische Zwecke wie Belästigung, Diskriminierung usw. von Mitarbeitern.

Die Einhaltung dieser Grundsätze trägt dazu bei, dass Ihr Scraper auf der richtigen Seite des Gesetzes bleibt.

Zusammenfassung

In diesem Leitfaden haben wir verschiedene Strategien und Techniken zum Scrapen von Unternehmensdaten aus Glassdoor mit Python untersucht, darunter:

  • Extrahieren von Übersichtsinformationen, Stellenangeboten, Gehältern, Bewertungen, Interviewfragen und Fotos durch Parsen von GraphQL-API-Daten
  • Berechnen der Seitennummerierung anhand der Gesamtzahl und systematisches Durchsuchen aller Seiten
  • Umgang mit den Anti-Scraping-Systemen von Glassdoor mit Proxys und Diensten wie ScraperAPI
  • Gewährleistung der Einhaltung gesetzlicher Vorschriften durch Berücksichtigung von Nutzungsbedingungen, Datenschutz, Urheberrechten und Ratenbeschränkungen

Die besprochenen Methoden können angepasst werden, um leistungsstarke Glassdoor-Scraper zu erstellen, die nützliche Daten in großem Maßstab auf robuste und ethische Weise sammeln.

Viel Spaß beim Schaben!

Stichworte:

Mitreden

E-Mail-Adresse wird nicht veröffentlicht. Pflichtfelder sind MIT * gekennzeichnet. *