Come raschiare i dati di Glassdoor con Python

Commenti: 0

Glassdoor è una delle migliori piattaforme che fornisce un'ampia gamma di informazioni sia per chi cerca lavoro sia per chi vuole assumerlo, tra cui informazioni sugli stipendi, recensioni dei datori di lavoro e domande di lavoro. In questa guida illustreremo il processo di scraping degli annunci di lavoro da Glassdoor utilizzando Python e Playwright. Playwright è essenziale in questo caso perché Glassdoor impiega forti misure anti-bot, che possono segnalare e bloccare le librerie di scraping tradizionali. Con Playwright, possiamo simulare un browser reale e includere dei proxy, aiutandoci a bypassare questi sistemi di rilevamento.

A causa dei solidi meccanismi antiscraping di Glassdoor, le richieste dirette con librerie come le richieste possono portare al blocco dell'IP o a problemi di CAPTCHA. Playwright ci permette di automatizzare un browser, rendendo le nostre interazioni più simili a quelle umane. Aggiungendo proxy e intestazioni del browser, possiamo evitare ulteriormente il rilevamento.

Requisiti

Per iniziare, è necessario installare Playwright e la libreria lxml per l'analisi dell'HTML. È possibile installarle come segue:


pip install playwright lxml
playwright install

Scraping degli annunci di lavoro di Glassdoor

Passeremo in rassegna ogni fase, dal caricamento della pagina con Playwright all'estrazione dei dettagli del lavoro e al salvataggio dei dati in un file CSV.

Fase 1. Impostazione del browser e richieste

Per prima cosa, configurare Playwright con un proxy per connettersi a Glassdoor. Questo aiuta a prevenire il blocco e consente al browser di caricare la pagina come se un utente reale stesse visitando il sito.


from playwright.async_api import async_playwright
from lxml.html import fromstring

async def scrape_job_listings():
    async with async_playwright() as p:
        browser = await p.chromium.launch(
            headless=False,
            proxy={"server": '', 'username': '', 'password': ''}
        )
        page = await browser.new_page()
        await page.goto('https link', timeout=60000)
        content = await page.content()
        await browser.close()
        return content

# Chiamare la funzione per recuperare il contenuto della pagina
html_content = await scrape_job_listings()

Fase 2. Parsing dell'HTML ed estrazione dei dati

Dopo aver caricato la pagina, usare lxml per analizzare il contenuto HTML ed estrarre le informazioni rilevanti sul lavoro. Ecco come analizzare il titolo del lavoro, la posizione, lo stipendio e altri dettagli per ogni annuncio di lavoro:


parser = fromstring(html_content)
job_posting_elements = parser.xpath('//li[@data-test="jobListing"]')

jobs_data = []
for element in job_posting_elements:
    job_title = element.xpath('.//a[@data-test="job-title"]/text()')[0]
    job_location = element.xpath('.//div[@data-test="emp-location"]/text()')[0]
    salary = ' '.join(element.xpath('.//div[@data-test="detailSalary"]/text()')).strip()
    job_link = element.xpath('.//a[@data-test="job-title"]/@href')[0]
    easy_apply = bool(element.xpath('.//div[@data-role-variant="featured"]'))
    company = element.xpath('.//span[@class="EmployerProfile_compactEmployerName__LE242"]/text()')[0]
    
    job_data = {
        'company': company,
        'job_title': job_title,
        'job_location': job_location,
        'job_link': job_link,
        'salary': salary,
        'easy_apply': easy_apply
    }
    jobs_data.append(job_data)

Fase 3. Salvataggio dei dati in un file CSV

Una volta estratti i dettagli del lavoro, possiamo salvarli in un file CSV per facilitare l'analisi dei dati.


import csv

with open('glassdoor_job_listings.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.DictWriter(file, fieldnames=['company', 'job_title', 'job_location', 'job_link', 'salary', 'easy_apply'])
    writer.writeheader()
    writer.writerows(jobs_data)

Codice completo


import csv
from playwright.async_api import async_playwright
from lxml.html import fromstring

async def scrape_job_listings():
    # Impostazione del browser Playwright con proxy per evitare il rilevamento
    async with async_playwright() as p:
        browser = await p.chromium.launch(
            headless=False,
            proxy={"server": '', 'username': '', 'password': ''}
        )
        page = await browser.new_page()
        await page.goto('https://www.glassdoor.com/Job/united-states-software-engineer-jobs-SRCH_IL.0,13_IN1_KO14,31.htm', timeout=60000)
        
        # Recuperare il contenuto della pagina e chiudere il browser
        content = await page.content()
        await browser.close()
        
        # Analizzare il contenuto con lxml
        parser = fromstring(content)
        job_posting_elements = parser.xpath('//li[@data-test="jobListing"]')
        
        # Estrarre i dati per ogni annuncio di lavoro
        jobs_data = []
        for element in job_posting_elements:
            job_title = element.xpath('.//a[@data-test="job-title"]/text()')[0]
            job_location = element.xpath('.//div[@data-test="emp-location"]/text()')[0]
            salary = ' '.join(element.xpath('.//div[@data-test="detailSalary"]/text()')).strip()
            job_link = "https://www.glassdoor.com" + element.xpath('.//a[@data-test="job-title"]/@href')[0]
            easy_apply = bool(element.xpath('.//div[@data-role-variant="featured"]'))
            company = element.xpath('.//span[@class="EmployerProfile_compactEmployerName__LE242"]/text()')[0]
            
            job_data = {
                'company': company,
                'job_title': job_title,
                'job_location': job_location,
                'job_link': job_link,
                'salary': salary,
                'easy_apply': easy_apply
            }
            jobs_data.append(job_data)
    
        # Salvare i dati in un file CSV
        with open('glassdoor_job_listings.csv', 'w', newline='', encoding='utf-8') as file:
            writer = csv.DictWriter(file, fieldnames=['company', 'job_title', 'job_location', 'job_link', 'salary', 'easy_apply'])
            writer.writeheader()
            writer.writerows(jobs_data)

# Eseguire la funzione di scraping
import asyncio
asyncio.run(scrape_job_listings())

Spiegazione del codice completo:

  1. Impostazione del browser con proxy: Il codice avvia una sessione del browser con Playwright, incorporando un proxy per imitare il comportamento di navigazione umano. L'impostazione headless=False consente alla finestra del browser di rimanere aperta, il che può aiutare ulteriormente a eludere il rilevamento dei bot.
  2. Navigazione alla pagina degli annunci di lavoro: Lo script visita l'URL degli annunci di lavoro di Glassdoor per le offerte di lavoro di ingegneria del software negli Stati Uniti.
  3. Estrazione del contenuto: I dati sulle offerte di lavoro vengono estratti utilizzando lxml per il parsing HTML. Vengono acquisiti il titolo del lavoro, la posizione, lo stipendio, il link al lavoro, il nome della società e se si tratta di un lavoro di facile applicazione.
  4. Salvataggio in CSV: dopo aver estratto tutti i dati, lo script li salva in un file CSV, glassdoor_job_listings.csv, con colonne per ogni attributo.

Rispetto dei termini di servizio di Glassdoor

Quando si effettua lo scraping di Glassdoor o di qualsiasi altro sito web, è essenziale seguire pratiche di scraping responsabili:

  • Rispettare i limiti di velocità: Evitare di sovraccaricare il server implementando ritardi tra le richieste.
  • Utilizzare proxy a rotazione: Ridurre al minimo il rischio di essere bannati ruotando i proxy e gli IP.
  • Rispettare i termini di servizio: Esaminare regolarmente i termini di servizio del sito web ed evitare azioni che li violino.

Quando saprete come raschiare i dati di Glassdoor utilizzando Python e Playwright, migliorerete facilmente la vostra capacità di raccogliere annunci di lavoro. Questa tecnica, se combinata con l'uso di proxy e intestazioni appropriate, è efficace per eliminare il rischio di essere bloccati da Glassdoor. È inoltre necessario prendere nota delle politiche di scraping etico per evitare di mandare in tilt i server di Glassdoor. Rispettando queste misure, ora potete raccogliere ed elaborare informazioni utili sull'occupazione da Glassdoor per il vostro uso personale o per quello della vostra azienda.

Commenti:

0 Commenti