Come Estrarre Annunci di Lavoro da Indeed: Struttura, Blocchi e il Percorso SERP

Indeed è il più grande portale di lavoro sul web e un segnale attivo del mercato del lavoro. È anche protetto da Cloudflare con nomi di classi che ruotano settimanalmente. Ecco come estrarlo in modo duraturo — e quando evitare completamente il sito.

Indeed attira circa 542 milioni di visite al mese, il che rende i suoi annunci uno dei segnali attivi più puliti per il mercato del lavoro — domanda di assunzioni per ruolo, fasce salariali, quali aziende stanno assumendo. È anche un sito React protetto da Cloudflare i cui nomi di classi CSS visibili ruotano abbastanza spesso da rompere un scraper ingenuo entro poche settimane. Questa guida mostra come estrarre annunci di lavoro da Indeed in modo duraturo, come paginare e deduplicare, la realtà di Cloudflare e la verticale SERP dei lavori che ti permette di evitare completamente la lotta.

Leggi la pagina di ricerca, ancorati su attributi stabili

L'unità di dati di Indeed è la pagina dei risultati di ricerca: query più posizione ti danno una pagina di schede di lavoro. La trappola è selezionare sui nomi di classi hashati (cose come eu4oa1w0) che Indeed rigenera. Ancorati invece sugli attributi data-testid, che cambiano molto meno spesso:

import requests
from bs4 import BeautifulSoup

headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 "
                  "(KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9",
}
proxies = {"http": "http://USER:PASS@gate.quantumproxies.io:8000",
           "https": "http://USER:PASS@gate.quantumproxies.io:8000"}

url = "https://www.indeed.com/jobs?q=python&l=New+York%2C+NY"
html = requests.get(url, headers=headers, proxies=proxies, timeout=30).text
soup = BeautifulSoup(html, "html.parser")

jobs = []
for card in soup.select("div.job_seen_beacon"):
    title = card.find("a", class_="jcs-JobTitle")
    company = card.find("span", attrs={"data-testid": "company-name"})
    location = card.find("div", attrs={"data-testid": "text-location"})
    jobs.append({
        "title": title.get_text(strip=True) if title else None,
        "company": company.get_text(strip=True) if company else None,
        "location": location.get_text(strip=True) if location else None,
        "jk": title["href"].split("jk=")[-1][:16] if title else None,
    })
print(len(jobs), "jobs on page 1")

Ogni scheda porta una chiave di lavoro (jk) — un ID stabile che usi per deduplicare tra pagine e esecuzioni. Memorizza su jk, non sull'URL, perché lo stesso annuncio appare con diversi parametri di tracciamento.

Paginazione e siti per paese

Indeed pagina con un parametro start che incrementa di 10. E non è un solo sito — ogni paese è un sottodominio: www.indeed.com per gli Stati Uniti, uk.indeed.com per il Regno Unito, e così via. Abbina la tua uscita proxy al paese che stai interrogando in modo che la richiesta sia geograficamente coerente:

def crawl(query, location, country="www", pages=5):
    base = f"https://{country}.indeed.com/jobs"
    for start in range(0, pages * 10, 10):
        params = {"q": query, "l": location, "start": start}
        html = requests.get(base, params=params, headers=headers,
                            proxies=proxies, timeout=30).text
        # parse as above, yield rows
        yield html

# freshness filter: fromage accepts only 1, 3, 7 or 14 days
# .../jobs?q=python&l=NYC&fromage=7

Una particolarità da conoscere: il filtro "pubblicato entro" di Indeed (fromage) accetta solo 1, 3, 7 o 14 giorni — altri valori sono ignorati, quindi costruisci la tua logica di freschezza attorno a questi intervalli.

Pipeline per estrarre le pagine di ricerca di Indeed: URL di query attraverso un'uscita residenziale, analisi delle schede per data-testid, paginazione per start e deduplicazione per chiave di lavoro
Ancorati su data-testid e la chiave di lavoro; pagina per incrementi di start di 10 e deduplica per catturare l'intero set di risultati.

La realtà di Cloudflare

Indeed è dietro Cloudflare, quindi un IP di datacenter con una semplice richiesta spesso riceve una sfida invece dei risultati. Le soluzioni sono il solito stack anti-bot: un User-Agent del browser coerente e un set di intestazioni, e — la leva più grande — un'uscita residenziale che non è pre-segnata come automazione. Un proxy residenziale si presenta come la connessione di un vero utente, che è ciò che mantiene Cloudflare a servire la pagina. Quando appare una sfida, abbinare l'impronta digitale del browser è importante quanto l'IP; la nostra guida su come superare Cloudflare nel 2026 copre dove si trova la linea.

La scorciatoia: la verticale SERP dei lavori

Se quello che vuoi realmente sono i dati del mercato del lavoro — non l'HTML di Indeed specificamente — c'è un percorso più pulito. La verticale dei lavori di Google aggrega annunci da Indeed e molti altri portali, e un SERP API restituisce quella verticale dei lavori come JSON analizzato: titolo, azienda, posizione, data di pubblicazione e fonte, senza selettori CSS da mantenere e senza dover affrontare Cloudflare. Scambi un po' di controllo a livello di campo per un feed strutturato stabile su molti portali contemporaneamente, che per le analisi aggregate delle assunzioni è di solito l'affare migliore. È la stessa logica dietro la costruzione di un aggregatore di portali di lavoro su un feed SERP piuttosto che un scraper per sito.

Estrai la verticale dei lavori come JSON pulito

A cosa servono i dati

Oltre alla ricerca di lavoro, questi dati guidano l'analisi reale: benchmarking salariale per ruolo e città, tracciamento della domanda per competenze specifiche nel tempo, segnali di assunzione dei concorrenti (un rivale che sta formando un nuovo team è un'indicazione strategica), e arricchimento — abbinare i ruoli aperti di un'azienda con i dati firmografici per l'outbound. Abbinalo ai dati salariali di Glassdoor e ottieni un quadro retributivo più completo rispetto a ciascuna fonte da sola.

Confronto tra estrarre direttamente da Indeed e ottenere gli stessi dati di lavoro dalla verticale SERP dei lavori di Google come JSON strutturato
Estrarre da Indeed offre il controllo completo sui campi; la verticale SERP dei lavori offre JSON strutturato su molti portali senza manutenzione dei selettori.

Domande frequenti

È legale estrarre annunci di lavoro da Indeed?

Gli annunci di lavoro sono dati pubblici, e raccogliere annunci visibili pubblicamente è generalmente difendibile, ma i termini di Indeed limitano l'accesso automatizzato e dovresti evitare dati personali e rispettare i limiti di velocità. Molti team evitano la questione dei termini utilizzando la verticale aggregata dei lavori SERP invece di estrarre direttamente da Indeed. Queste sono informazioni generali, non consigli legali — rivedi i termini attuali prima di un grande progetto.

Perché il mio scraper di Indeed continua a rompersi?

Due motivi. Primo, Indeed ruota i suoi nomi di classi CSS hashati, quindi i selettori ancorati a essi falliscono entro settimane — ancorati invece sugli attributi data-testid e sulla chiave di lavoro. Secondo, Cloudflare inizia a sfidare il tuo IP una volta che è stato segnalato; un'uscita residenziale e un'impronta digitale del browser coerente mantengono la vera pagina in caricamento. Risolvi entrambi e lo scraper si stabilizza.

Come faccio a estrarre lavori da più paesi?

Indeed serve ogni paese dal proprio sottodominio (www.indeed.com, uk.indeed.com, de.indeed.com, e così via). Interroga il sottodominio corretto e instrada attraverso un'uscita proxy in quel paese in modo che la richiesta sia geograficamente coerente — altrimenti potresti ottenere risultati non corrispondenti o reindirizzati. La verticale SERP dei lavori accetta anche un parametro paese se preferisci non gestire i sottodomini.

La verticale SERP dei lavori di Google è migliore di estrarre da Indeed?

Per le analisi aggregate del mercato del lavoro, di solito sì. La verticale dei lavori restituisce annunci da Indeed e molti altri portali come JSON strutturato, senza selettori rotanti e senza dover affrontare la sfida di Cloudflare. Perdi alcuni campi specifici di Indeed, ma guadagni un feed multi-sorgente stabile e molta meno manutenzione. Estrarre direttamente da Indeed solo quando hai bisogno di campi che vivono sulle pagine di Indeed.

Indeed premia l'approccio durevole: ancorati su attributi stabili, deduplica per chiave di lavoro, pagina per decine, e bussa con un IP residenziale in modo che Cloudflare ti serva. E quando hai solo bisogno del segnale del mercato del lavoro piuttosto che dell'HTML esatto di Indeed, la verticale SERP dei lavori te lo consegna come JSON. Scegli il percorso che corrisponde a quanto controllo sui campi hai effettivamente bisogno.

Ottieni IP residenziali che superano Cloudflare