Jak zeskrobać dane nieruchomości z Zillow: Search JSON, Zestimate, PerimeterX

Zillow dostarcza dane o ofertach jako JSON ukryty na stronie — nigdy nie musisz analizować pojedynczego diva. Oto jak obsługiwać API wyszukiwania map-bounds, pokonać limit paginacji i przetrwać PerimeterX.

Zillow posiada ponad 110 milionów nieruchomości i przyciąga około 245 milionów odwiedzających miesięcznie, co czyni go domyślnym źródłem danych o nieruchomościach w USA — ceny, adresy, liczba łóżek, łazienki, zestimates i szacunkowe czynsze. Jest również chroniony przez PerimeterX i renderowany po stronie klienta, więc naiwne skrobaki otrzymują 403 i pustą stronę. Dobra wiadomość: Zillow udostępnia swoje dane jako JSON, jeśli wiesz, gdzie szukać, a jego wyszukiwanie jest napędzane przez współrzędne mapy, które możesz bezpośrednio wywołać. Oto całe podejście.

Nie analizuj HTML — Zillow dostarcza JSON

Nie ma potrzeby walczyć z selektorami CSS na stronie nieruchomości Zillow. Pełny zapis nieruchomości jest osadzony jako ukryte dane internetowe w tagu skryptu. Dwa miejsca obejmują prawie każdą stronę: <script id="__NEXT_DATA__"> zawiera pamięć podręczną Next.js, a niektóre strony zamiast tego używają <script id="hdpApolloPreloadedData"> (pamięć podręczna Apollo GraphQL). Pobierz dowolny z nich, przeanalizuj i masz czysty obiekt z zpid, price, livingArea, bedrooms, bathrooms, latLong, homeStatus, rentZestimate i więcej:

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)

Osadzony zapis jest znacznie bogatszy niż widoczna strona. Oprócz ceny i adresu otrzymujesz zestimate i rentZestimate — własne wyceny sprzedaży i wynajmu Zillow — plus homeStatus (na sprzedaż, sprzedane, do wynajęcia), daysOnZillow, powierzchnię działki i mieszkalną oraz dokładne szerokości i długości geograficzne. To wszystko, czego potrzebuje model porównawczy, pipeline oceny leadów lub dashboard rynku, dostarczone jako jeden czysty obiekt JSON na nieruchomość zamiast tuzina kruchych selektorów CSS, które łamią się przy kolejnej zmianie projektu.

API wyszukiwania działa na współrzędnych mapy

Wyszukiwanie Zillow nie jest oparte na słowach kluczowych — jest oparte na mapie. W tle, przesłanie wyszukiwania wysyła żądanie do zillow.com/async-create-search-page-state z obiektem searchQueryState, którego głównym polem jest mapBounds: cztery liczby (północ, południe, wschód, zachód), które rysują prostokąt na mapie. Podaj mu pole ograniczające, a zwróci każdą ofertę wewnątrz jako ustrukturyzowany JSON:

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})
Schemat przepływu skrobania Zillow na dużą skalę: zdefiniuj pole ograniczające mapy, wywołaj API wyszukiwania dla JSON, pobierz przez proxy rezydencjalne i podziel na kwadranty, aby pokonać limit wyników
Obsługuj Zillow za pomocą współrzędnych mapy: pole ograniczające jest zapytaniem, a rezydencjalne IP utrzymują ciszę PerimeterX.

Pokonaj limit 820 wyników

Zillow paginuje tylko 20 stron po około 41 pozycji, więc pojedyncze wyszukiwanie ogranicza się do około 820 wyników, niezależnie od liczby domów w okolicy. Gęste rynki ukrywają tysiące więcej. Rozwiązaniem jest rekurencyjne dzielenie kwadrantów: jeśli pole ograniczające zwraca maksymalną liczbę stron, podziel je na cztery mniejsze pola i przeszukaj każde; kontynuuj podział, dopóki każde pole nie zwróci mniej niż limit. Ta strategia zbliżania się może ujawnić setki tysięcy ofert z jednego metra, które płaskie wyszukiwanie nigdy by nie pokazało — i dzieli tylko tam, gdzie gęstość tego wymaga, więc nie marnujesz żądań na puste tereny wiejskie.

Jest koszt tej dokładności: każdy podział mnoży żądania, więc gęste metro może zamienić jedno wyszukiwanie w dziesiątki. Zaplanuj to — ogranicz głębokość rekurencji i zbliżaj się tylko tam, gdzie liczba wyników to uzasadnia, co algorytm robi za Ciebie, dzieląc tylko wtedy, gdy pole nadal osiąga maksymalną liczbę stron. Dla nocnego odświeżenia całego miasta, większość żądań trafia wtedy na garść gęstych skrzynek w centrum miasta, podczas gdy przedmieścia rozwiązują się w jednym przejściu, więc wydajesz na głębokość dokładnie tam, gdzie jest inwentarz i nigdzie indziej.

PerimeterX to powód, dla którego naiwne skrobaki zawodzą

Blokowanie Zillow nie opiera się głównie na szybkości; to PerimeterX (obecnie HUMAN) profiluje żądanie. IP z centrów danych, brakujące nagłówki przeglądarki i nieludzkie tempo wywołują 403 lub wyzwanie — to właśnie sprawdza assert status == 200. Rozwiązaniem jest spójne, zaufane żądanie: amerykańskie proxy rezydencjalne, aby wyjściowe IP wyglądało jak kupujący dom, realistyczne nagłówki przeglądarki i wykładnicze wycofanie, które rotuje na nowe IP przy każdym 403 zamiast ponawiać próbę na spalonym. Nasza analiza jak PerimeterX wykrywa automatyzację obejmuje sygnały w głębi; ta sama postawa dotyczy Walmart, który używa tego samego dostawcy.

Gdy PerimeterX się zaostrza lub wolisz nie utrzymywać floty przeglądarek, Scraper API renderuje stronę, rotuje rezydencjalne IP i usuwa wyzwanie za Ciebie, zwracając ten sam ukryty JSON bez operacyjnych obciążeń.

Zeskrob Zillow za PerimeterX z rezydencjalnymi IP

Panel statystyk pokazujący 110 milionów nieruchomości Zillow, 245 milionów odwiedzających miesięcznie, limit wyszukiwania 820 wyników i 600 tysięcy wyników poprzez dzielenie kwadrantów
Skala jest ogromna, ale jedno wyszukiwanie ogranicza się do 820 — inżynieria wokół tego limitu to prawdziwa praca.

Kiedy używać rejestrów hrabstwa zamiast tego

Zillow jest doskonały dla ofert, zdjęć i szacunków, ale jest źródłem wtórnym. Dla autorytatywnych informacji o własności, historii sprzedaży i wartości ocenianych, biura oceny i rejestracji hrabstw publikują publiczne rejestry — często za pośrednictwem własnych portali lub masowych eksportów danych. Jeśli Twoim celem jest tytuł, porównania lub dane podatkowe, a nie oferty na żywo, rejestry na poziomie hrabstwa są czystsze, bardziej dopuszczalne do zbierania i całkowicie wolne od PerimeterX. Użyj Zillow dla sygnału rynkowego, a rejestrów hrabstwa dla prawdy terenowej.

Czy skrobanie Zillow jest legalne?

To ogólna informacja, a nie porada prawna. Publicznie dostępne dane o ofertach — ceny, adresy, atrybuty nieruchomości — są powszechnie uważane za dozwolone do zbierania w rozsądnych stawkach. Wyniki Zillow mogą jednak zawierać dane osobowe: nazwiska agentów, numery telefonów i szczegóły brokerów. Są one chronione przez RODO i podobne przepisy, więc unikaj zbierania i przechowywania ich bez prawnego uzasadnienia. Zbieraj fakty dotyczące nieruchomości, nie ludzi.

Często zadawane pytania

Czy mogę zeskrobać dane z Zillow?

Tak — publicznie widoczne dane o ofertach można zbierać. Zillow osadza każdy zapis nieruchomości jako JSON w tagu skryptu (__NEXT_DATA__ lub pamięć podręczna Apollo), a jego wyszukiwanie działa na API map-bounds, które możesz bezpośrednio wywołać. Przeszkodą nie jest dostęp, ale PerimeterX, więc potrzebujesz rezydencjalnych IP i spójnych nagłówków, aby uniknąć 403.

Czy Zillow ma API?

Zillow oferuje około 20 oficjalnych API, w tym Property Details i Neighborhood Data, ale wymagają one kluczy, mają limity użytkowania i nie obejmują każdego pola ani przypadku użycia masowego. Wiele zespołów skrobie publiczne strony zamiast tego, ponieważ ukryty JSON już zawiera cenę, łóżka, łazienki, powierzchnię, zestimate i szacunkowy czynsz, których potrzebują.

Dlaczego mój skrobak Zillow otrzymuje 403?

403 na Zillow to prawie zawsze PerimeterX, a nie limit szybkości. IP z centrów danych, brakujące lub niespójne nagłówki przeglądarki i robotyczne tempo żądań wywołują to. Przełącz się na amerykańskie proxy rezydencjalne, wysyłaj realistyczne nagłówki, dodaj ludzkie odstępy i rotuj na nowe IP przy każdym 403 z wykładniczym wycofaniem zamiast uderzać w zablokowane.

Jak zeskrobać więcej niż 820 ofert Zillow z jednego obszaru?

Pojedyncze wyszukiwanie ogranicza się do około 820 wyników (20 stron po 41). Aby pójść głębiej, podziel pole ograniczające mapy na cztery kwadranty i przeszukaj każdy; rekurencyjnie podziel każdy kwadrant, który nadal osiąga limit. To podejście zbliżania się dzieli tylko gęste obszary, więc uchwyca pełny inwentarz metra bez marnowania żądań na rzadkie regiony.

Pomiń HTML i odczytaj osadzony JSON, obsługuj wyszukiwanie za pomocą map bounds, podziel kwadranty, aby pokonać limit, i kieruj wszystko przez czyste rezydencjalne IP, aby wyprzedzić PerimeterX. Zrób to, a Zillow stanie się ustrukturyzowanym źródłem danych o nieruchomościach zamiast ścianą 403.

Uzyskaj JSON Zillow bez walki z PerimeterX