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:
- Berechnung der Seitenanzahl aus der Gesamtgehaltszählung
- 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:
- Berechnen Sie die Anzahl der Seiten aus der Gesamtzahl der Fragen
- 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.
Rechtlichen Erwägungen
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!