Come fare scraping delle inserzioni di Craigslist: Veicoli, Affitti e Lavori

Craigslist è una miniera d'oro di dati protetta da limiti di frequenza IP aggressivi. Ecco la struttura degli URL per città, la matematica del paging a 120 per pagina, il collegamento RSS che la maggior parte delle persone ignora e la configurazione del proxy che ti tiene fuori dalla lista dei ban.

Craigslist contiene un'enorme quantità di dati pubblici utilizzabili — auto usate, affitti di appartamenti, lavori, articoli in vendita, servizi — distribuiti su centinaia di siti cittadini. È anche un muro per principianti di CAPTCHA e ban IP, perché Craigslist limita severamente le richieste per indirizzo IP. La buona notizia: la struttura degli URL del sito è semplice e prevedibile, c'è un collegamento RSS che la maggior parte delle guide ignora, e il problema del blocco è quasi interamente un problema di igiene IP. Questa guida copre il modello di URL per città, la matematica del paging, il parsing, il percorso RSS e la configurazione del proxy che tiene uno scraper fuori dalla lista dei ban. Fai scraping per uso personale o di ricerca, rispetta i termini di Craigslist e considera queste informazioni generali piuttosto che consigli legali.

Il modello di URL è tutto

Craigslist si divide per sottodominio di città e codice di categoria, e tutto il resto sono parametri di query. Impara la forma una volta e puoi mirare a qualsiasi città e sezione: https://{city}.craigslist.org/search/{category}?query={q}. I codici di categoria sono brevi — sss per tutto in vendita, cto per auto da privati, apa per appartamenti, ggg per lavori. Aggiungi min_price, max_price e altri filtri come parametri. La paginazione utilizza il parametro s, e ogni pagina mostra 120 risultati — quindi la seconda pagina è s=120, la terza è s=240, e così via.

import requests
from bs4 import BeautifulSoup

PROXY = "http://USER:PASS@rotating.quantumproxies.io:8000"
PROXIES = {"http": PROXY, "https": PROXY}
UA = ("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
      "(KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36")

def build_url(city, category, query, page=0, min_price=None, max_price=None):
    base = f"https://{city}.craigslist.org/search/{category}"
    params = [f"query={query}"]
    if min_price: params.append(f"min_price={min_price}")
    if max_price: params.append(f"max_price={max_price}")
    if page:      params.append(f"s={page * 120}")   # 120 results per page
    return base + "?" + "&".join(params)

url = build_url("minneapolis", "cto", "bmw", page=0, max_price=8000)
r = requests.get(url, headers={"User-Agent": UA}, proxies=PROXIES, timeout=20)

Parsing delle inserzioni

Le righe dei risultati di ricerca sono contrassegnate con un set stabile di classi — il blocco dell'inserzione è .result-info, con .result-title, .result-price e .result-date all'interno. Proteggi ogni campo, perché non tutte le inserzioni hanno un prezzo:

def parse_listings(html):
    soup = BeautifulSoup(html, "html.parser")
    out = []
    for row in soup.select(".result-info"):
        title_el = row.select_one(".result-title")
        price_el = row.select_one(".result-price")
        date_el  = row.select_one(".result-date")
        if not title_el:
            continue
        out.append({
            "title": title_el.get_text(strip=True),
            "url":   title_el.get("href"),
            "price": price_el.get_text(strip=True) if price_el else None,
            "date":  date_el.get("datetime") if date_el else None,
        })
    return out

listings = parse_listings(r.text)
print(len(listings), "listings on this page")

Per record più ricchi — chilometraggio di un'auto, camere da letto di un affitto — segui l'URL di ogni inserzione e analizza la pagina dei dettagli. Questo raddoppia il numero di richieste, quindi è esattamente dove il ritmo e la rotazione iniziano a contare.

Diagramma che scompone un URL di ricerca Craigslist in sottodominio di città, codice di categoria, query e parametro di paginazione s
Gli URL di Craigslist sono completamente prevedibili: sottodominio di città, codice di categoria, quindi query e il parametro s a passi di 120.

Il collegamento RSS che la maggior parte delle guide ignora

Craigslist non ha un'API pubblica generale, ma espone un feed RSS per i risultati di ricerca — aggiungi &format=rss a qualsiasi URL di ricerca e ottieni un feed XML strutturato invece di HTML da analizzare. È più leggero, meno probabile che attivi le euristiche anti-bot rispetto al caricamento ripetuto della pagina completa dei risultati, ed è ideale per il monitoraggio: interroga una ricerca salvata a intervalli regolari e confronta per nuovi elementi. Restituisce meno campi rispetto alla pagina HTML (titolo, link, timestamp), quindi usalo per il monitoraggio della freschezza e torna all'HTML quando hai bisogno di prezzo e dettagli.

import feedparser

# Any Craigslist search becomes a feed with &format=rss
feed_url = build_url("sfbay", "apa", "loft", max_price=3500) + "&format=rss"
raw = requests.get(feed_url, headers={"User-Agent": UA}, proxies=PROXIES, timeout=20)
feed = feedparser.parse(raw.content)

for entry in feed.entries[:5]:
    print(entry.updated, entry.title, entry.link)

Perché Craigslist ti banna e come evitare di essere bannato

Craigslist impila diverse difese, ma condividono una radice: traccia le richieste per indirizzo IP e blocca gli indirizzi che colpiscono troppo duramente. Le misure specifiche sono il rate limiting IP, le sfide CAPTCHA sul traffico sospetto, il monitoraggio User-Agent, il tracciamento delle sessioni e i ban temporanei IP. Ognuna di esse è sconfitta apparendo come molti visitatori ordinari piuttosto che una macchina implacabile.

Poiché i ban sono basati su IP, l'IP di uscita sta facendo la maggior parte del lavoro. Un pool di proxy residenziali pulito sembra connessioni domestiche reali, e la rotazione per richiesta distribuisce un crawl multi-città così sottilmente che i contatori per IP di Craigslist non si attivano mai. Se stai raccogliendo dati in molte città, la nostra guida su come risolvere i limiti di frequenza 429 copre il lato del ritmo e del budget di concorrenza, e la checklist anti-ban lega tutto insieme.

Fai scraping di Craigslist su IP residenziali puliti

Scalare attraverso le città

Il vero potere dei dati di Craigslist è il confronto tra città — la stessa auto usata o affitto prezzato in una dozzina di metropoli. Cicla la tua lista di città, associa un'uscita rotante fresca per città, limita la concorrenza e memorizza la città accanto a ogni record. Per la ricerca su veicoli e affitti in particolare, gli stessi schemi alimentano una pipeline di comparazione; vedi le nostre guide su scraping delle inserzioni di auto e dati immobiliari per trasformare le inserzioni grezze in segnali di mercato.

Checklist che mappa le difese anti-scraping di Craigslist come il rate limiting IP e i CAPTCHA a soluzioni come la rotazione residenziale e il ritmo
Ogni difesa di Craigslist è un problema di IP e ritmo — ruota le uscite residenziali e rimani sotto 1-2 richieste al secondo.

Domande frequenti

Puoi fare scraping di Craigslist?

Sì — le pagine di ricerca e inserzioni pubbliche sono scrappabili, e Craigslist espone anche un feed RSS per le ricerche. L'ostacolo è il rate limiting aggressivo per IP, non il parsing. Ruota gli IP residenziali, regola il ritmo delle richieste a 1-2 al secondo, e puoi raccogliere dati su veicoli, affitti, lavori e in vendita in modo affidabile. Rispetta i termini di Craigslist e fai scraping solo di dati pubblici.

Craigslist ha un'API?

Non esiste un'API pubblica generale per i dati, ma ogni URL di ricerca può restituire un feed RSS aggiungendo &format=rss. Questo ti dà un feed XML strutturato con titoli, link e timestamp — perfetto per monitorare nuove inserzioni — mentre le pagine HTML contengono i campi più completi come prezzo e descrizione.

Come evito di essere bannato per IP facendo scraping di Craigslist?

Craigslist banna per frequenza IP, quindi le soluzioni riguardano tutte la distribuzione e il rallentamento del carico: ruota gli IP residenziali per richiesta, mantieni 1-2 richieste al secondo con jitter, ruota il tuo User-Agent, usa una sessione fresca per città e rallenta immediatamente quando vedi un CAPTCHA o 403. Un IP del datacenter che martella una città viene bannato più velocemente.

Come funziona la paginazione di Craigslist?

Craigslist mostra 120 risultati per pagina e pagine con il parametro di query s come offset. La prima pagina omette s, la seconda pagina è s=120, la terza s=240, e così via. Incrementa a passi di 120 fino a quando una pagina restituisce meno di 120 risultati, il che segna la fine.

Craigslist è facile da leggere e facile da essere bannati — e il secondo problema riguarda interamente l'igiene IP. Comprendi il modello di URL, usa RSS per il monitoraggio, pagina a passi di 120 e instrada tutto attraverso IP residenziali rotanti a un ritmo umano. Fai questo e i CAPTCHA semplicemente smettono di apparire.

Inizia con proxy residenziali rotanti