Meteen naar de inhoud

Hoe Glassdoor te schrapen

Glassdoor is een geweldige bron voor zowel werkzoekenden, werknemers als werkgevers. Het bevat een schat aan informatie over bedrijven en banen, waaronder salarissen, beoordelingen, sollicitatievragen, kantoorfoto's en meer. Al deze gegevens maken Glassdoor tot een aantrekkelijk doelwit voor webscraping.

In deze uitgebreide handleiding bespreken we verschillende technieken en strategieën voor het verzamelen van verschillende soorten gegevens van Glassdoor.

Overzicht van de architectuur van Glassdoor

Voordat we ingaan op de details van het schrapen, moeten we eerst begrijpen hoe de website van Glassdoor is gestructureerd:

  • Rendering aan de clientzijde – Glassdoor gebruikt React om het grootste deel van de gebruikersinterface aan de clientzijde weer te geven in plaats van aan de serverzijde. Dit betekent dat de initiële HTML die aan de browser wordt aangeboden minimaal is en dat de meeste inhoud wordt geladen en weergegeven met Javascript.

  • GraphQL-API – De gegevens die op Glassdoor-pagina’s worden weergegeven, worden opgehaald via een GraphQL API. De website doet AJAX-verzoeken aan deze API om gestructureerde gegevens te verkrijgen die vervolgens op de pagina worden weergegeven.

  • Zwaar anti-schrapen – Glassdoor maakt gebruik van verschillende anti-scraping-maatregelen, zoals botdetectie, snelheidsbeperking en het blokkeren van scrapers.

Kortom, Glassdoor is een React-app van één pagina die GraphQL gebruikt om gegevens op te halen en sterke anti-scraping-verdedigingen heeft. Deze architectuur brengt een aantal unieke uitdagingen met zich mee voor scrapers die we zullen moeten overwinnen.

Bedrijfsoverzichtpagina's schrapen

Elk bedrijf op Glassdoor heeft een speciale overzichtspagina met basisinformatie zoals hoofdkantoor, sector, omzet, enz. Laten we eens kijken hoe we deze details kunnen schrapen.

Om de overzichtspagina van een bedrijf te krijgen, hebben we de Glassdoor-ID nodig die is opgenomen in de pagina-URL:

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

Here EI_IE9079 betekent de bedrijfs-ID van Google. We kunnen deze ID uit elke bedrijfs-URL halen om de URL van de overzichtspagina samen te stellen.

Het schrapen van de onbewerkte HTML van deze pagina levert ons geen gestructureerde gegevens op. De sleutel is om de GraphQL-gegevens uit de pagina te extraheren die alle informatie in een gestructureerd JSON-formaat bevat.

Zo extraheert u de GraphQL-gegevens:

import json
import re 

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

Dit geeft ons de volledige GraphQL-gegevens voor de pagina. We kunnen nu velden als description, headquarters, revenueetc:

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

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

En dat is het! Met slechts een paar regels Python-code kunnen we gestructureerde gegevens extraheren voor het Glassdoor-overzicht van elk bedrijf.

Vacatures schrappen

Met Glassdoor kunt u door open vacatures bladeren die door bedrijven zijn geplaatst. Deze vermeldingen bevatten titel, locatie, beschrijving en meer.

Om de banen van een bedrijf te vinden, navigeren we naar:

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

De vacatures worden dynamisch geladen via AJAX-oproepen bij het naar beneden scrollen of het wisselen van pagina's. De gegevens zijn opnieuw afkomstig van GraphQL en we moeten deze analyseren.

Eerst doen we een verzoek aan pagina 1 om het totale aantal opdrachten te verkrijgen dat we gebruiken om het aantal pagina's te berekenen. Vervolgens schrapen we elke pagina en extraheren we taakgegevens:

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

Hierdoor kunnen we voor elk bedrijf systematisch alle banen schrappen. De sleutel is het berekenen van pagina's op basis van het totale aantal taken en paginering via AJAX-oproepen.

Bedrijfsrecensies schrappen

Reviews zijn misschien wel de meest waardevolle gegevens op Glassdoor. Laten we bespreken hoe u alle beoordelingen voor een bedrijf kunt verzamelen.

Net als bij vacatures navigeren we naar de pagina met bedrijfsrecensies:

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

We moeten begrijpen hoe beoordelingen zijn gepagineerd. Glassdoor toont een vast aantal beoordelingen per pagina en we moeten alle pagina's schrapen om volledige gegevens te krijgen.

Het aantal recensiepagina's kan vooraf worden berekend door a te extraheren numberOfPages veld uit GraphQL-gegevens. Vervolgens pagineren we over elke pagina en verzamelen we beoordelingen:

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 extraheren we vooraf het aantal recensiepagina's en doorlopen we vervolgens elke pagina om de volledige reeks recensies samen te stellen.

Deze techniek kan alle beoordelingen voor elk bedrijf op Glassdoor schrappen!

Salarissen schrappen

Naast beoordelingen zijn ook salarisgegevens zeer nuttig. Glassdoor heeft voor elk bedrijf een speciale salarissectie. Laten we eens kijken naar het schrappen van salarisgegevens.

We beginnen met de URL van de salarispagina:

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

Onze algemene aanpak zal opnieuw het volgende inhouden:

  1. Berekening van het aantal pagina's op basis van het totale salaris
  2. Pagineren door elke pagina en salarisgegevens schrapen

Hier is een implementatie:

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

Hierdoor kunnen we systematisch alle salarissen voor een bedrijf over meerdere pagina's schrappen.

Interviewvragen schrappen

Interviewinzichten zijn een andere geweldige gegevensbron op Glassdoor. Laten we eens kijken hoe we alle interviewvragen die voor een bedrijf zijn geplaatst, kunnen schrappen.

De interviewpagina van het bedrijf bevindt zich op:

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

Interviewvragen worden dynamisch geladen via AJAX-verzoeken wanneer u naar beneden scrollt of van pagina wisselt.

Ons spelplan is bekend:

  1. Bereken het aantal pagina's op basis van het totale aantal vragen
  2. Haal vragen uit elke pagina

Hier is een implementatie:

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

Samenvattend berekenen we het totale aantal pagina's op basis van het aantal vragen, pagineren we via AJAX-oproepen en extraheren we vragen – waardoor we alle interviewinzichten voor een bedrijf kunnen krijgen.

Kantoorfoto's schrapen

Om onze Glassdoor-gegevensextractie te voltooien, schrappen we ook kantoorfoto's van het bedrijf die een mooi visueel inzicht bieden.

De fotopagina van een bedrijf kunt u vinden op:

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

Onze standaard pagineringsstrategie is van toepassing: bereken pagina's op basis van het totale aantal foto's, pagineer via AJAX-oproepen, extraheer foto's:

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

En hiermee kunnen wij alle beschikbare kantoorfoto’s voor een bedrijf schrapen!

Omgaan met anti-schrapen

Hoewel de besproken technieken het mogelijk maken om verschillende datapunten uit Glassdoor te extraheren, worden scrapers op schaal meestal geblokkeerd.

Glassdoor heeft een reeks anti-scraping-mechanismen om volledige gegevensextractie te voorkomen, waaronder:

  • IP-blokkering
  • Browser Fingerprinting
  • Botdetectiesystemen
  • snelheidsbeperking

Hier zijn enkele tips om blokkades te voorkomen tijdens het scrapen van Glassdoor:

  • Gebruik proxy's: Roteer voor elk verzoek verschillende residentiële proxy's, zodat uw schraper als verschillende gebruikers verschijnt.

  • Limiettarief: Zorg ervoor dat u vertragingen heeft tussen verzoeken en schrapen tegen een bescheiden tarief.

  • Mimische browser: Stel een geldige User-Agent in, accepteer headers en schakel Javascript in om als een echte browser te verschijnen.

  • Blokken bewaken: Controleer of uw IP-adres of proxy's worden geblokkeerd en verander dienovereenkomstig van datacenter of provider.

  • Gebruik schrapservices: Maak gebruik van scraping-API's zoals ScraperAPI en Octoparse, die ingebouwde ondersteuning hebben om anti-scraping-mechanismen te omzeilen.

Met de juiste voorzorgsmaatregelen is het mogelijk om op grote schaal gegevens uit Glassdoor te extraheren zonder geblokkeerd te worden.

Glassdoor schrapen met ScraperAPI

ScraperAPI is een betaalde scraping-API die alle anti-scraping-uitdagingen aankan en het mogelijk maakt gegevens op schaal te extraheren.

Het ondersteunt Ajax-crawling, proxy's en kan rechtstreeks worden geïntegreerd met populaire bibliotheken zoals Python Requests.

Hier ziet u hoe we bedrijfsrecensies zouden schrapen met ScraperAPI:

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 verwerkt ScraperAPI proxy's, browsers en andere aspecten waardoor we ons kunnen concentreren op gegevensextractie.

Dit is een eenvoudige manier om schaalbare Glassdoor-scrapers te bouwen zonder dat u zich zorgen hoeft te maken over anti-scraping-systemen.

Bij het bouwen van Glassdoor-scrapers is het belangrijk ervoor te zorgen dat uw werk aan de wettelijke eisen voldoet. Hier zijn enkele belangrijke aspecten waarmee u rekening moet houden:

  • Algemene Voorwaarden – Bestudeer de servicevoorwaarden van Glassdoor om de vergoedingen en beperkingen op het gebruik van de gegevens te begrijpen. Over het algemeen is het toegestaan ​​om periodiek redelijke volumes te schrappen voor niet-commerciële doeleinden.

  • Persoonsgegevens – Vermijd het verzamelen van persoonlijke gebruikersgegevens van Glassdoor, zoals namen, e-mail-ID's, enz., wat privacyproblemen met zich meebrengt.

  • Auteursrechten – Glassdoor-reviews en andere door gebruikers ingediende gegevens vallen onder het auteursrecht. Reproduceer de inhoud niet woordelijk van de site in grote aantallen.

  • Tarieflimieten – Respecteer eventuele tarieflimieten die door Glassdoor worden opgelegd en overbelast hun servers niet met een buitensporig aantal verzoeken.

  • Cases – Gebruik Glassdoor-gegevens niet voor onethische doeleinden, zoals intimidatie van werknemers, discriminatie, enz.

Als u zich aan deze principes houdt, zorgt u ervoor dat uw schraper aan de goede kant van de wet blijft.

Conclusie

In deze handleiding hebben we verschillende strategieën en technieken onderzocht om bedrijfsgegevens van Glassdoor te schrappen met behulp van Python, waaronder:

  • Het extraheren van overzichtsinformatie, vacatures, salarissen, recensies, sollicitatievragen en foto's door het parseren van GraphQL API-gegevens
  • Pagineringspagina's berekenen op basis van het totale aantal en systematisch alle pagina's schrapen
  • Omgaan met de anti-scraping-systemen van Glassdoor met proxy's en services zoals ScraperAPI
  • Garanderen van wettelijke naleving door het respecteren van ToS, privacy, auteursrechten en tarieflimieten

De besproken methoden kunnen worden aangepast om krachtige Glassdoor-scrapers te bouwen die op een robuuste en ethische manier op grote schaal nuttige gegevens verzamelen.

Veel plezier met schrapen!

Tags:

Doe mee aan het gesprek

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd *