Come estrarre dati immobiliari da Zillow: JSON di ricerca, Zestimate, PerimeterX

Zillow fornisce i dati delle sue inserzioni come JSON nascosto nella pagina — non è mai necessario analizzare un singolo div. Ecco come utilizzare l'API di ricerca dei confini della mappa, superare il limite di paginazione e sopravvivere a PerimeterX.

Zillow possiede più di 110 milioni di proprietà e attira circa 245 milioni di visitatori mensili, il che lo rende la fonte predefinita per i dati immobiliari negli Stati Uniti — prezzi, indirizzi, letti, bagni, zestimates e stime di affitto. È anche protetto da PerimeterX e viene reso lato client, quindi gli scraper ingenui ottengono un 403 e una pagina vuota. La buona notizia: Zillow ti fornisce i suoi dati come JSON se sai dove cercare, e la sua ricerca è guidata da coordinate mappa che puoi chiamare direttamente. Ecco l'intero approccio.

Non analizzare l'HTML — Zillow fornisce JSON

Non è necessario combattere con i selettori CSS su una pagina di proprietà di Zillow. Il record completo della proprietà è incorporato come dati web nascosti in un tag script. Due posizioni coprono quasi ogni pagina: <script id="__NEXT_DATA__"> contiene la cache di Next.js, e alcune pagine invece usano <script id="hdpApolloPreloadedData"> (la cache di Apollo GraphQL). Prendi uno dei due, analizzalo, e avrai un oggetto pulito con zpid, price, livingArea, bedrooms, bathrooms, latLong, homeStatus, rentZestimate e altro ancora:

import json, re, requests

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 (KHTML, like Gecko) Chrome/124.0 Safari/537.36",
           "accept-language": "en-US,en;q=0.9"}

def property_json(url):
    r = requests.get(url, headers=HEADERS, proxies=proxies, timeout=20)
    r.raise_for_status()                       # 403 => blocked, rotate IP
    m = re.search(r'id="__NEXT_DATA__"[^>]*>(.*?)</script>', r.text, re.S)
    if m:
        data = json.loads(m.group(1))
        cache = data["props"]["pageProps"]["componentProps"]["gdpClientCache"]
        return next(iter(json.loads(cache).values()))["property"]
    # fallback: Apollo cache
    m = re.search(r'id="hdpApolloPreloadedData"[^>]*>(.*?)</script>', r.text, re.S)
    cache = json.loads(json.loads(m.group(1))["apiCache"])
    return next(v["property"] for k, v in cache.items() if "ForSale" in k)

Il record incorporato è molto più ricco della pagina visibile. Oltre al prezzo e all'indirizzo, ottieni zestimate e rentZestimate — le valutazioni di vendita e affitto di Zillow — oltre a homeStatus (in vendita, venduto, in affitto), daysOnZillow, area del lotto e abitabile, e latitudine e longitudine precise. Questo è tutto ciò di cui un modello di comparazione, una pipeline di scoring dei lead o una dashboard di mercato ha bisogno, consegnato come un unico oggetto JSON pulito per proprietà invece di una dozzina di selettori CSS fragili che si rompono al prossimo redesign.

L'API di ricerca funziona su coordinate mappa

La ricerca di Zillow non è basata su parole chiave — è basata sulla mappa. Dietro le quinte, l'invio di una ricerca avvia una richiesta a zillow.com/async-create-search-page-state con un oggetto searchQueryState il cui campo principale è mapBounds: quattro numeri (nord, sud, est, ovest) che disegnano un rettangolo sulla mappa. Fornisci un riquadro e restituisce ogni inserzione all'interno, come JSON strutturato:

def search_area(bounds, page=1):
    url = "https://www.zillow.com/async-create-search-page-state"
    body = {
        "searchQueryState": {
            "pagination": {"currentPage": page},
            "mapBounds": bounds,   # {'north':..,'south':..,'east':..,'west':..}
            "filterState": {"sortSelection": {"value": "days"}},
        },
        "wants": {"cat1": ["listResults", "mapResults"], "cat2": ["total"]},
        "requestId": 2,
    }
    r = requests.put(url, json=body, headers=HEADERS, proxies=proxies, timeout=20)
    return r.json()["cat1"]["searchResults"]["listResults"]

# New Haven, CT bounding box
listings = search_area({"north": 41.366, "south": 41.230,
                        "east": -72.827, "west": -73.030})
Diagramma di flusso per estrarre dati da Zillow su larga scala: definisci un riquadro dei confini della mappa, chiama l'API di ricerca per JSON, recupera tramite un proxy residenziale e dividi i quadranti per superare il limite di risultati
Guida Zillow tramite coordinate mappa: il riquadro è la query e gli IP residenziali mantengono PerimeterX tranquillo.

Supera il limite di 820 risultati

Zillow paginizza solo 20 pagine di circa 41 elementi, quindi una singola ricerca si ferma a circa 820 risultati indipendentemente da quanti immobili ci siano nell'area. I mercati densi nascondono migliaia di altri. La soluzione è la suddivisione ricorsiva dei quadranti: se un riquadro restituisce il massimo delle pagine, dividilo in quattro riquadri più piccoli e cerca in ognuno; continua a suddividere finché ogni riquadro restituisce meno del limite. Questa strategia di zoom può far emergere centinaia di migliaia di inserzioni da una metropoli che la ricerca piatta non mostrerebbe mai — e suddivide solo dove la densità lo richiede, quindi non sprechi richieste su campagne vuote.

C'è un costo per questa accuratezza: ogni suddivisione moltiplica le richieste, quindi una metropoli densa può trasformare una ricerca in dozzine. Pianifica il budget — limita la profondità della ricorsione e zooma solo dove il conteggio dei risultati lo giustifica, cosa che l'algoritmo fa per te suddividendo solo quando un riquadro raggiunge ancora il massimo delle pagine. Per un aggiornamento notturno di un'intera città, la maggior parte delle richieste si concentra sui pochi riquadri densi del centro mentre le periferie si risolvono in un solo passaggio, quindi spendi in profondità esattamente dove si trova l'inventario e da nessun'altra parte.

PerimeterX è il motivo per cui gli scraper ingenui falliscono

Il blocco di Zillow non è principalmente basato sulla velocità; è PerimeterX (ora HUMAN) che profila la richiesta. Gli IP dei data center, le intestazioni del browser mancanti e il timing non umano attivano un 403 o una sfida — è ciò che un assert status == 200 sta realmente controllando. La soluzione è una richiesta coerente e affidabile: proxy residenziali USA in modo che l'IP di uscita sembri un acquirente di casa, intestazioni del browser realistiche e backoff esponenziale che ruota su un nuovo IP su ogni 403 invece di riprovare quello bruciato. La nostra analisi di come PerimeterX rileva l'automazione copre i segnali in dettaglio; la stessa postura si applica a Walmart, che utilizza lo stesso fornitore.

Quando PerimeterX si stringe o preferisci non mantenere una flotta di browser, un Scraper API rende la pagina, ruota gli IP residenziali e risolve la sfida per te, restituendo lo stesso JSON nascosto senza il sovraccarico operativo.

Estrai dati da Zillow dietro PerimeterX con IP residenziali

Pannello statistico che mostra le 110 milioni di proprietà di Zillow, 245 milioni di visitatori mensili, limite di ricerca di 820 risultati e 600 mila risultati tramite suddivisione dei quadranti
La scala è enorme, ma una ricerca si ferma a 820 — ingegnerizzare attorno a quel limite è il vero lavoro.

Quando utilizzare i registri della contea invece

Zillow è eccellente per le inserzioni, le foto e le stime, ma è una fonte secondaria. Per proprietà autorevoli, storia delle vendite e valori stimati, gli uffici degli assessori e dei registratori delle contee pubblicano registri pubblici — spesso tramite i loro portali o esportazioni di dati in blocco. Se il tuo caso d'uso riguarda titoli, comparazioni o dati fiscali piuttosto che inserzioni live, i registri a livello di contea sono più puliti, più permissivi da raccogliere e completamente privi di PerimeterX. Usa Zillow per il segnale di mercato e i registri della contea per la verità sul campo.

È legale estrarre dati da Zillow?

Queste sono informazioni generali, non consigli legali. I dati delle inserzioni pubblicamente disponibili — prezzi, indirizzi, attributi delle proprietà — sono ampiamente considerati leciti da raccogliere a ritmi rispettosi. Tuttavia, i risultati di Zillow possono includere dati personali: nomi di agenti, numeri di telefono e dettagli dei broker. Questi sono protetti dal GDPR e da leggi simili, quindi evita di raccoglierli e conservarli senza una base legale. Raccogli i fatti sulla proprietà, non le persone.

Domande frequenti

Posso estrarre dati da Zillow?

Sì — i dati delle inserzioni visibili pubblicamente possono essere raccolti. Zillow incorpora ogni record di proprietà come JSON in un tag script (__NEXT_DATA__ o la cache di Apollo), e la sua ricerca funziona su un'API di confini mappa che puoi chiamare direttamente. L'ostacolo non è l'accesso ma PerimeterX, quindi hai bisogno di IP residenziali e intestazioni coerenti per evitare i 403.

Zillow ha un'API?

Zillow offre circa 20 API ufficiali, tra cui Dettagli delle Proprietà e Dati del Quartiere, ma richiedono chiavi, hanno limiti di utilizzo e non coprono ogni campo o caso d'uso in blocco. Molti team estraggono invece le pagine pubbliche proprio perché il JSON nascosto contiene già il prezzo, letti, bagni, area, zestimate e stima di affitto di cui hanno bisogno.

Perché il mio scraper di Zillow riceve un 403?

Un 403 su Zillow è quasi sempre PerimeterX, non un limite di velocità. Gli IP dei data center, le intestazioni del browser mancanti o incoerenti e il timing delle richieste robotiche lo attivano. Passa a proxy residenziali USA, invia intestazioni realistiche, aggiungi spaziatura simile a quella umana e ruota su un nuovo IP su ogni 403 con backoff esponenziale piuttosto che martellare quello bloccato.

Come posso estrarre più di 820 inserzioni di Zillow da un'area?

Una singola ricerca si ferma a circa 820 risultati (20 pagine di 41). Per andare più a fondo, dividi il riquadro dei confini della mappa in quattro quadranti e cerca in ognuno; suddividi ricorsivamente qualsiasi quadrante che raggiunge ancora il limite. Questo approccio di zoom suddivide solo le aree dense, quindi cattura l'intero inventario di una metropoli senza sprecare richieste su regioni sparse.

Salta l'HTML e leggi il JSON incorporato, guida la ricerca tramite confini mappa, dividi i quadranti per superare il limite e instrada tutto tramite IP residenziali puliti per stare davanti a PerimeterX. Fai questo e Zillow diventa un feed immobiliare strutturato invece di un muro di 403.

Ottieni JSON da Zillow senza combattere con PerimeterX