Scraping degli Annunci di Auto: Cars.com, Autotrader e CarGurus per Informazioni sui Prezzi

Le informazioni sui prezzi dei concessionari si trovano su Cars.com, Autotrader e CarGurus — le stesse auto, con prezzi diversi a seconda del CAP e pubblicate ovunque. Ecco come fare scraping, eliminare i duplicati tramite VIN e superare le barriere anti-bot.

Le informazioni sui prezzi dei concessionari non si trovano in un unico posto. La stessa auto usata è elencata contemporaneamente su Cars.com, Autotrader e CarGurus, con prezzi diversi a seconda del CAP dell'acquirente, e ogni sito protegge le sue pagine con misure anti-bot. Fare scraping bene è meno una questione di analisi di una pagina e più di tre cose: filtrare le ricerche per poter effettivamente raggiungere ogni annuncio, eliminare i duplicati dello stesso veicolo tra le fonti tramite VIN e superare le barriere senza una flotta di IP bruciati. Questa guida copre tutti e tre gli aspetti, con codice che puoi adattare a qualsiasi dei grandi siti di annunci.

Cosa ti offre un annuncio di auto

Ogni annuncio di veicolo è un record denso una volta analizzato: anno, marca, modello e allestimento; prezzo e chilometraggio; il VIN; tipo di carrozzeria, trazione, carburante, trasmissione, cilindri e porte; colore interno ed esterno; un numero di stock; la lista delle caratteristiche; immagini; e dettagli del concessionario oltre a una valutazione dell'affare sui siti che la calcolano. Questo è un dataset di valutazione completo per riga. I campi attorno ai quali costruisci la tua pipeline sono prezzo, chilometraggio, VIN e concessionario — tutto il resto è arricchimento.

Filtra prima: raggiungi ogni annuncio

I siti di annunci paginano in dimensioni di pagina fisse (comunemente 20 per pagina) e limitano quanto in profondità può andare una singola ricerca — spesso intorno a 1.000 risultati totali. Se una ricerca corrisponde a più auto di così, gli extra sono semplicemente irraggiungibili tramite paginazione. La soluzione è la segmentazione: dividi una ricerca ampia in ricerche più strette per marca, modello, intervallo di anni, fascia di prezzo o CAP in modo che ciascuna rimanga sotto il limite, quindi unisci i risultati. Cars.com, utilmente, codifica tutto questo nell'URL, quindi costruisci le ricerche in modo programmatico.

from urllib.parse import urlencode

def search_url(zip_code, make="", model="", max_price="", year_min=""):
    params = {
        "stock_type": "used",
        "makes[]": make,
        "models[]": model,
        "list_price_max": max_price,
        "year_min": year_min,
        "maximum_distance": "all",
        "zip": zip_code,
        "page_size": 20,
        "sort": "listed_at_desc",
    }
    return "https://www.cars.com/shopping/results/?" + urlencode(params)

print(search_url("10001", make="toyota", model="camry", year_min=2020))
Diagramma statistico dello scraping degli annunci di auto: 20 annunci per pagina, 1000 raggiungibili per ricerca, ritardi di 2-5 secondi, VIN come chiave di deduplicazione tra siti
Una singola ricerca si ferma vicino a 1.000 risultati — segmenta per marca, anno o CAP per raggiungere il resto, e dosa le richieste per rimanere sotto rilevamento.

Supera la barriera: proxy residenziali

Cars.com è dietro Cloudflare; altri siti automobilistici usano Imperva con hCaptcha o reCAPTCHA che si attivano sotto carico. Un IP di datacenter che martella le pagine degli annunci viene sfidato rapidamente. I proxy residenziali da ISP reali sembrano acquirenti ordinari, e ruotarli distribuisce le richieste in modo che nessun singolo indirizzo superi il limite di velocità. Mantieni un ritardo di 2-5 secondi tra le richieste — il ritmo è importante quanto l'IP. Per piccole estrazioni occasionali un pool di datacenter va bene; per il monitoraggio continuo su larga scala, i residenziali fanno la differenza tra un'esecuzione che termina e una che si blocca su un CAPTCHA.

import requests, time, random

PROXY = "http://USER:PASS@gate.quantumproxies.io:8000"
proxies = {"http": PROXY, "https": PROXY}
HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"}

def fetch(url):
    r = requests.get(url, proxies=proxies, headers=HEADERS, timeout=20)
    r.raise_for_status()
    time.sleep(random.uniform(2, 5))   # polite, and harder to fingerprint
    return r.text

Se il target rende gli annunci con JavaScript o lancia CAPTCHA persistenti, un Scraper API che porta un'impronta di browser reale e risolve il livello anti-bot per te è meno fragile che mantenere la tua farm di browser. La nostra guida su come superare Cloudflare nel 2026 copre dove cade quella linea.

Ottieni proxy residenziali per i siti di annunci di auto

Elimina i duplicati tramite VIN tra le fonti

La colonna più utile nei dati automobilistici è il VIN. Poiché i concessionari pubblicano la stessa auto su ogni mercato, il tuo scraping grezzo è pieno di duplicati che sembrano annunci separati. Il VIN è un identificatore univoco globale per il veicolo fisico, quindi basarsi su di esso collassa quei duplicati in un unico record — e ti permette di confrontare come la stessa auto è prezzata su Cars.com, Autotrader e CarGurus, o da quale concessionario. Mantieni il prezzo più basso per VIN, o mantienili tutti etichettati per fonte, a seconda di cosa stai misurando.

def dedupe_by_vin(rows):
    best = {}
    for r in rows:
        vin = r.get("vin")
        if not vin:
            continue
        price = int(r["price"])
        if vin not in best or price < int(best[vin]["price"]):
            best[vin] = r          # keep the cheapest listing per car
    return list(best.values())
Diagramma di flusso di una pipeline di annunci di auto: costruisci un URL di ricerca filtrato, recupera tramite un proxy residenziale oltre Cloudflare, analizza i campi degli annunci, elimina i duplicati tramite VIN
Filtra, recupera tramite un'uscita residenziale, analizza, poi collassa i duplicati tramite VIN così confronti le auto invece di contare due volte gli annunci.

Prezzi geografici: la stessa auto, CAP diverso

I prezzi automobilistici sono locali. Lo stesso modello mostra prezzi e inventario diversi a seconda del CAP da cui cerchi, perché i concessionari e la domanda variano per regione. Per catturare quella diffusione, esplora un set di CAP e, dove il sito personalizza in base alla posizione del visitatore, instrada ogni richiesta tramite un'uscita nella regione corrispondente. Un pool residenziale con targeting per paese e città ti permette di vedere i prezzi come farebbe un acquirente locale — essenziale per l'arbitraggio, il benchmarking dei concessionari o la costruzione di un modello di valutazione che non sia distorto verso un unico mercato.

zips = ["10001", "90001", "60601", "77001"]  # NY, LA, Chicago, Houston
spread = {}
for z in zips:
    url = search_url(z, make="toyota", model="camry", year_min=2021)
    rows = parse_listings(fetch(url))          # exit geo-matched to the ZIP
    spread[z] = [int(r["price"]) for r in rows]

# now compare median price by market
for z, prices in spread.items():
    prices.sort()
    print(z, "median", prices[len(prices)//2])

Questo è lo stesso schema orientato alla localizzazione dietro il monitoraggio dei prezzi dei concorrenti e la raccolta di dati immobiliari — ovunque il prezzo dipenda da dove si trova l'acquirente, le uscite geo-targeted sono non negoziabili.

Fonti d'asta e all'ingrosso

I siti di annunci al dettaglio ti dicono cosa chiedono i concessionari; le piattaforme d'asta come Copart ti dicono per cosa le auto vengono effettivamente vendute a livello all'ingrosso — l'altra metà di un modello di prezzo. Questi siti sono più pesantemente difesi: Copart, ad esempio, utilizza la protezione web Imperva con fingerprinting comportamentale, e le sfide hCaptcha o reCAPTCHA appaiono sotto volumi di richiesta più alti. Anche la paginazione è più stretta — 20 veicoli per pagina con un limite rigido di circa 50 pagine, quindi una singola ricerca si ferma a circa 1.000 lotti. Raggiungere un inventario completo significa segmentare le query per marca, modello, intervallo di anni, cortile d'asta o condizione, esattamente come con i siti al dettaglio, e eseguire ogni segmento da solo.

Poiché queste piattaforme caricano risultati e paginazione con JavaScript e sfidano il traffico sospetto, vogliono IP residenziali e un intervallo di 2-5 secondi tra le richieste come minimo. I proxy di datacenter gestiscono piccole estrazioni occasionali; qualsiasi cosa sostenuta appartiene alle uscite residenziali. Il guadagno è un segnale reale: la cronologia delle offerte, lo stato di vendita e la condizione del lotto alimentano le previsioni della domanda e l'analisi export-import che i soli prezzi richiesti al dettaglio non possono darti.

Monitora, non fare solo uno scraping una tantum

Un dump una tantum invecchia istantaneamente in un mercato dove gli annunci cambiano ogni giorno. Il modello durevole è uno scraping programmato che cattura le tue ricerche target e confronta le esecuzioni consecutive — nuovi annunci, cali di prezzo e auto vendute. Chiave ogni riga tramite VIN in modo che un cambiamento di prezzo sullo stesso veicolo sia inequivocabile, registra l'ora di ogni snapshot, e hai una serie temporale che puoi analizzare: quanto velocemente si deprezzano modelli specifici, quali concessionari abbassano i prezzi, dove l'inventario si accumula. Instrada quelle esecuzioni programmate tramite IP residenziali rotanti in modo che un lavoro giornaliero dallo stesso indirizzo non guadagni lentamente un blocco.

Domande frequenti

Puoi fare scraping di Cars.com e Autotrader?

Sì — le pagine degli annunci mostrano dati sui veicoli disponibili pubblicamente. La sfida pratica è la protezione anti-bot: Cars.com utilizza Cloudflare e altri utilizzano Imperva con CAPTCHA. I proxy residenziali, intestazioni realistiche e un ritardo di 2-5 secondi tra le richieste mantengono uno scraping in esecuzione. Rispetta i termini di servizio di ogni sito ed evita di raccogliere dati personali.

Come evito di essere bloccato facendo scraping degli annunci di auto?

Ruota gli IP residenziali in modo che nessun singolo indirizzo faccia troppe richieste, dosa le richieste con un ritardo randomizzato di 2-5 secondi, invia un User-Agent di browser reale e segmenta le ricerche grandi in più piccole invece di paginare migliaia di risultati. Se i CAPTCHA persistono, passa a uno Scraper API che gestisce il livello anti-bot e il rendering JavaScript.

Perché ottengo auto duplicate quando faccio scraping?

I concessionari pubblicano lo stesso veicolo su più mercati, quindi un'auto fisica appare come diversi annunci. Elimina i duplicati sul VIN, che identifica univocamente il veicolo indipendentemente dal sito. Basarsi sul VIN trasforma i duplicati in un confronto di prezzo per la stessa auto tra le fonti piuttosto che in conteggi gonfiati.

I prezzi delle auto cambiano davvero in base alla posizione?

Sì. L'inventario e i prezzi variano per regione, e molti siti personalizzano i risultati in base al CAP del ricercatore. Per catturare la vera diffusione, cerca in più CAP e instrada ogni richiesta tramite un'uscita nella regione corrispondente utilizzando proxy residenziali geo-targeted, così vedi i prezzi locali invece di una visione nazionale distorta.

Fare scraping degli annunci automobilistici si riduce a raggiungere ogni auto (segmentare oltre il limite di ~1.000 risultati), superare la barriera anti-bot (ruotando gli IP residenziali, dosando con cortesia), eliminare i duplicati tramite VIN e catturare le differenze geografiche con uscite mirate alla posizione. Costruisci la pipeline attorno a prezzo, chilometraggio, VIN e concessionario, e avrai informazioni sui prezzi dei concessionari su ogni grande mercato contemporaneamente.

Inizia a fare scraping degli annunci di auto con QuantumProxies