Salta al contenuto

Come raschiare Glassdoor

Glassdoor è un'ottima risorsa per chi cerca lavoro, dipendenti e datori di lavoro. Contiene numerose informazioni su aziende e lavori, inclusi stipendi, recensioni, domande sui colloqui, foto degli uffici e altro ancora. Tutti questi dati rendono Glassdoor un obiettivo attraente per il web scraping.

In questa guida completa, esamineremo varie tecniche e strategie per estrarre diversi tipi di dati da Glassdoor.

Panoramica dell'architettura di Glassdoor

Prima di immergerci nello specifico dello scraping, capiamo come è strutturato il sito web di Glassdoor:

  • Rendering lato client – Glassdoor utilizza React per eseguire il rendering della maggior parte della sua interfaccia utente sul lato client anziché sul lato server. Ciò significa che l'HTML iniziale fornito al browser è minimo e la maggior parte dei contenuti viene caricata e renderizzata con Javascript.

  • API GraphQL – I dati visualizzati sulle pagine Glassdoor vengono recuperati tramite un'API GraphQL. Il sito Web effettua richieste AJAX a questa API per ottenere dati strutturati che vengono poi visualizzati nella pagina.

  • Antigraffio pesante – Glassdoor utilizza varie misure anti-scraping come il rilevamento dei bot, la limitazione della velocità e il blocco degli scraper.

Quindi, in sintesi, Glassdoor è un'app React a pagina singola che utilizza GraphQL per recuperare dati e dispone di forti difese anti-scraping. Questa architettura pone alcune sfide uniche per gli scraper che dovremo superare.

Raschiatura delle pagine di panoramica dell'azienda

Ogni azienda su Glassdoor ha una pagina panoramica dedicata con informazioni di base come sede centrale, settore, entrate, ecc. Vediamo come analizzare questi dettagli.

Per ottenere la pagina di panoramica di un'azienda, abbiamo bisogno del suo ID Glassdoor incluso nell'URL della pagina:

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

Qui EI_IE9079 indica l'ID azienda di Google. Possiamo estrarre questo ID da qualsiasi URL aziendale per creare l'URL della pagina di panoramica.

Eliminare l'HTML grezzo di questa pagina non ci fornirà dati strutturati. La chiave è estrarre i dati GraphQL dalla pagina che contiene tutte le informazioni in un formato JSON strutturato.

Ecco come estrarre i dati GraphQL:

import json
import re 

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

Questo ci fornisce i dati GraphQL completi per la pagina. Ora possiamo analizzare campi come description, headquarters, revenueetc:

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

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

E questo è tutto! Con solo poche righe di codice Python possiamo estrarre dati strutturati per la panoramica Glassdoor di qualsiasi azienda.

Raschiare elenchi di lavoro

Glassdoor consente di sfogliare gli annunci di lavoro aperti pubblicati dalle aziende. Questi elenchi contengono titolo, posizione, descrizione e altro.

Per trovare le offerte di lavoro di un'azienda, visitiamo:

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

Gli annunci di lavoro vengono caricati dinamicamente tramite chiamate AJAX quando si scorre verso il basso o si cambia pagina. I dati provengono di nuovo da GraphQL e dobbiamo analizzarli.

Per prima cosa facciamo una richiesta alla pagina 1 per ottenere il conteggio totale dei lavori che utilizziamo per calcolare il numero di pagine. Quindi raschiamo ogni pagina estraendo i dati del lavoro:

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

Questo ci consente di eliminare sistematicamente tutti i posti di lavoro per qualsiasi azienda. La chiave è calcolare le pagine in base al conteggio totale dei lavori e all'impaginazione tramite chiamate AJAX.

Recensioni di società di raschiatura

Le recensioni sono probabilmente i dati più preziosi su Glassdoor. Parliamo di come raccogliere tutte le recensioni per un'azienda.

Analogamente ai lavori, accediamo alla pagina delle recensioni aziendali:

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

Dobbiamo capire come vengono impaginate le recensioni. Glassdoor mostra un numero fisso di recensioni per pagina e dobbiamo analizzare tutte le pagine per ottenere dati completi.

Il numero di pagine di revisione può essere calcolato in anticipo estraendo a numberOfPages campo dai dati GraphQL. Quindi impagiamo ogni pagina e raccogliamo recensioni:

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

Qui stiamo estraendo il numero di pagine di revisione in anticipo e quindi eseguendo il looping su ciascuna pagina per creare la serie completa di recensioni.

Questa tecnica può racimolare tutte le recensioni di qualsiasi azienda su Glassdoor!

Raschiare gli stipendi

Oltre alle recensioni, anche i dati sugli stipendi sono molto utili. Glassdoor ha una sezione dedicata agli stipendi per ciascuna azienda. Diamo un'occhiata alla raschiatura dei registri salariali.

Iniziamo con l'URL della pagina degli stipendi:

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

Il nostro approccio generale comporterà ancora una volta:

  1. Calcolo del numero di pagine dal conteggio totale dello stipendio
  2. Impaginazione di ogni pagina raschiando i registri degli stipendi

Ecco un'implementazione:

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

Ciò ci consente di raggruppare sistematicamente tutti gli stipendi di un'azienda su più pagine.

Domande di intervista raschianti

Gli approfondimenti sulle interviste sono un'altra grande risorsa di dati su Glassdoor. Diamo un'occhiata a come raccogliere tutte le domande dell'intervista pubblicate per un'azienda.

La pagina delle interviste dell'azienda si trova all'indirizzo:

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

Le domande dell'intervista vengono caricate dinamicamente tramite richieste AJAX quando si scorre verso il basso o si cambia pagina.

Il nostro piano di gioco è familiare:

  1. Calcola il numero di pagine dal conteggio totale delle domande
  2. Estrai domande da ogni pagina

Ecco un'implementazione:

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

Quindi, in sintesi, calcoliamo le pagine totali in base al conteggio delle domande, impaginamo tramite chiamate AJAX ed estraiamo le domande, consentendoci di ottenere tutti gli approfondimenti sull'intervista per un'azienda.

Raschiare le foto dell'ufficio

Per completare l'estrazione dei dati da Glassdoor, raccogliamo anche le foto degli uffici dell'azienda che forniscono una visione visiva accurata.

È possibile accedere alla pagina delle foto di un'azienda all'indirizzo:

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

Si applica la nostra strategia di impaginazione standard: calcola le pagine dal conteggio totale delle foto, impagina tramite chiamate AJAX, estrai foto:

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

E con questo possiamo racimolare tutte le foto dell'ufficio disponibili per un'azienda!

Trattare con anti-raschiamento

Sebbene le tecniche discusse consentano di estrarre vari punti dati da Glassdoor, su larga scala gli scraper di solito vengono bloccati.

Glassdoor dispone di una serie di meccanismi anti-scraping per impedire l'estrazione esaustiva dei dati, tra cui:

  • Blocco IP
  • Fingerprinting del browser
  • Sistemi di rilevamento bot
  • rate limiting

Ecco alcuni suggerimenti per evitare blocchi durante la raschiatura di Glassdoor:

  • Usa i proxy: ruota diversi proxy residenziali per ciascuna richiesta in modo che il tuo scraper appaia come utenti diversi.

  • Tasso limite: assicurati di avere ritardi tra le richieste e lo scraping a un ritmo modesto.

  • Browser imitativo: imposta uno User-Agent valido, accetta intestazioni e Javascript abilitato per apparire come un vero browser.

  • Monitorare i blocchi: controlla se il tuo IP o i proxy vengono bloccati e cambia data center o provider di conseguenza.

  • Utilizza i servizi di raschiamento: Sfrutta API di scraping come ScraperAPI e Octoparse che dispongono di supporto integrato per aggirare i meccanismi anti-scraping.

Con le giuste precauzioni, è possibile estrarre dati da Glassdoor su larga scala senza essere bloccati.

Raschiare Glassdoor con ScraperAPI

ScraperAPI è un'API di scraping a pagamento che gestisce tutte le sfide anti-scraping e consente l'estrazione di dati su larga scala.

Supporta la scansione Ajax, i proxy e si integra direttamente con le librerie più diffuse come Python Requests.

Ecco come elimineremmo le recensioni aziendali utilizzando 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 

Qui ScraperAPI gestisce proxy, browser e altri aspetti permettendoci di concentrarci sull'estrazione dei dati.

Questo è un modo semplice per costruire raschiatori Glassdoor scalabili senza doversi preoccupare dei sistemi antigraffio.

Quando costruisci i raschiatori Glassdoor, è importante garantire che il tuo lavoro sia conforme alla legge. Ecco alcuni aspetti chiave da considerare:

  • Termini di Servizio – Studia i ToS di Glassdoor per comprendere le autorizzazioni e le restrizioni sull'utilizzo dei suoi dati. In genere è consentito prelevare periodicamente volumi ragionevoli per scopi non commerciali.

  • Dati Personali – Evita di rimuovere dati personali dell’utente da Glassdoor come nomi, ID e-mail, ecc., il che potrebbe sollevare problemi di privacy.

  • Copyrights – Le recensioni di Glassdoor e altri dati inviati dagli utenti sono coperti da copyright. Non riprodurre in massa i contenuti alla lettera del sito.

  • Limiti tariffari – Rispettare eventuali limiti di velocità imposti da Glassdoor e non sovraccaricare i propri server con un numero eccessivo di richieste.

  • Casi d'uso – Non utilizzare i dati di Glassdoor per scopi non etici come molestie nei confronti dei dipendenti, discriminazione, ecc.

L'adesione a questi principi contribuirà a garantire che il tuo raschiatore rimanga dalla parte giusta della legge.

Conclusione

In questa guida, abbiamo esplorato varie strategie e tecniche per estrarre i dati aziendali da Glassdoor utilizzando Python, tra cui:

  • Estrazione di informazioni generali, annunci di lavoro, stipendi, recensioni, domande sui colloqui e foto analizzando i dati dell'API GraphQL
  • Calcolo delle pagine di impaginazione dai conteggi totali e raschiatura sistematica di tutte le pagine
  • Gestione dei sistemi anti-scraping di Glassdoor con proxy e servizi come ScraperAPI
  • Garantire la conformità legale rispettando ToS, privacy, copyright e limiti di velocità

I metodi discussi possono essere adattati per costruire potenti scraper Glassdoor che raccolgono dati utili su larga scala in modo solido ed etico.

Buona raschiatura!

Tag:

Partecipa alla conversazione

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *