Jak scrapovat Zillow pomocí Pythonu (a nenechat se zablokovat)

Poslední aktualizace April 15, 2026
Jak scrapovat Zillow pomocí Pythonu (a nenechat se zablokovat)

Zillow stojí na špici 160 milionů záznamů o nemovitostech v USA a dostat z něj data ve velkém měřítku je jedna z nejběžnějších — a zároveň nejvíc frustrujících — úloh při práci s realitními daty. Pokud jste někdy zkoušeli scrape zillow with python a místo seznamu nemovitostí na vás vyskočila CAPTCHA stránka, nejste v tom sami.

Strávil jsem spoustu času zkoumáním a testováním různých přístupů ke scrapování Zillow — jak v Pythonu, tak pomocí no-code nástrojů, které jsme v Thunderbit vyvinuli. Tenhle průvodce pokrývá obě cesty. Ať už chcete kompletní návod v Pythonu včetně anti-bot strategií, nebo jen potřebujete mít do oběda 200 inzerátů v tabulce, najdete tu přesně to, co potřebujete. Projdeme si, proč jsou data ze Zillow důležitá, jak je web technicky postavený, krok za krokem Python tutoriál, přesné důvody, proč scrapeři selhávají, i to, jak automatizovat opakované sběry pro sledování cen.

Proč vůbec scrapovat data ze Zillow?

Zillow je největší úložiště dat o rezidenčních nemovitostech v USA. Měsíčně si ho otevře 210 milionů návštěvníků a nabízí zhruba 750 000+ aktivních nabídek k prodeji a dalších 1,9 milionu nabídek k pronájmu. Platforma pokrývá víc než 50 % veškeré návštěvnosti realitních portálů v USA — víc než dvojnásobek oproti nejbližšímu konkurentovi.

zillow_stats_998c14e590.png

Než se pustíte do Pythonu, je dobré vědět, že scrape zillow with python není jediná možnost — a špatně zvolená cesta vás může stát hodiny. Python nástroje jako httpx a BeautifulSoup vyžadují středně pokročilé znalosti, ruční práci s hlavičkami a proxy, běží střední rychlostí (1–3 sekundy na stránku) a potřebují častou údržbu, i když jsou zdarma; Selenium nebo Playwright zlepšují práci proti botům tím, že vykreslují JavaScript, ale jsou pomalejší (5–15 sekund na stránku) a pořád náročné na údržbu; scraping API jako ScraperAPI nebo ScrapFly jsou rychlejší, mají vestavěnou anti-bot ochranu a střední nároky na údržbu, ale stojí 30–599 $ měsíčně; oficiální API Zillow přes Bridge Interactive je rychlé a nenáročné na údržbu, ale má omezený přístup a stojí zhruba 500 $ měsíčně; a no-code nástroje jako Thunderbit jsou vhodné pro začátečníky, rychlé, bez údržby díky AI adaptaci a většinou fungují ve freemium modelu.

Úspora času je sama o sobě obrovská. Ruční průzkum napříč více než 50 ZIP kódy může spolknout 15–20 hodin týdně. Automatizovaný scraping stejnou práci zvládne za minuty — tedy o 99,7 % méně času.

Všechny možnosti scrapování Zillow: Python vs. API vs. no-code (srovnání)

Než se pustíte do Pythonu, vězte, že „scrape Zillow pomocí Pythonu“ není jediná cesta. Špatná volba vám sežere hodiny. Tady je přehled vedle sebe, ať si můžete vybrat podle sebe:

MetodaÚroveň znalostíPráce proti botůmRychlostÚdržbaCena
Python + httpx/BeautifulSoupStředně pokročiláRuční (hlavičky, proxy)Střední (1–3 s/stránka)Vysoká (selektory se rozbíjejí)Zdarma
Python + Selenium/PlaywrightStředně pokročiláLepší (vykresluje JS)Pomalá (5–15 s/stránka)VysokáZdarma
Scraping API (ScraperAPI, ScrapFly)Středně pokročiláVestavěnáRychláStřední30–599 $/měsíc
Oficiální API Zillow (Bridge Interactive)Začátečník–středně pokročilýN/ARychláNízkácca 500 $/měsíc, omezený přístup
No-code nástroj (Thunderbit)ZačátečníkVestavěná (AI se přizpůsobí)RychláŽádná (AI stránku načte znovu)Freemium

Pokud potřebujete data hned a nechcete psát kód, začněte s Thunderbit. Pokud chcete pochopit technické pozadí nebo potřebujete plnou kontrolu, pokračujte v Python návodu.

Nejrychlejší cesta za 2 minuty: scrape Zillow s Thunderbit (bez kódu)

Než se ponoříme do Pythonu, tady je cesta pro každého, kdo potřebuje data ze Zillow rychle — bez nastavování Pythonu, bez proxy konfigurace, bez údržby selektorů. Tenhle workflow jsme v Thunderbit postavili přímo pro získávání strukturovaných realitních dat bez nutnosti řešit vývoj.

Obtížnost: Začátečník
Časová náročnost: ~2 minuty
Co budete potřebovat: Chrome, Thunderbit Chrome Extension (funguje i bez placení)

Krok 1: Nainstalujte Thunderbit a otevřete Zillow

Nainstalujte rozšíření Thunderbit z Chrome Web Store. Přejděte na stránku s výsledky vyhledávání na Zillow — například vyhledejte domy v Houstonu, TX.

Krok 2: Klikněte na „AI Suggest Fields“

Otevřete boční panel Thunderbit a klikněte na „AI Suggest Fields“. AI si přečte stránku a sama navrhne sloupce: cenu, adresu, počet ložnic, koupelen, metrů čtverečních, Zestimate, URL nabídky a další. Při testování obvykle rozpozná 20+ polí bez jakéhokoli ručního nastavování.

Krok 3: Klikněte na „Scrape“

Stiskněte tlačítko Scrape. Data se začnou plnit do strukturované tabulky přímo v rozšíření. Thunderbit automaticky zvládá stránkování na Zillow — jak klikací, tak nekonečný scroll.

Krok 4: Obohaťte data přes scraping podstránek

Chcete detaily jako historii daní, hodnocení škol nebo cenovou historii? Použijte „Scrape Subpages“ a obohaťte tabulku. Thunderbit projde každý odkaz na nabídku a stáhne dodatečná pole — bez dalšího kódu.

Krok 5: Exportujte data

Exportujte do Google Sheets, Excelu, Airtable nebo Notion. Export je zdarma.

Proč Thunderbit funguje na Zillow tak dobře

Hlavní výhoda je odolnost. AI v Thunderbitu si při každém scrapování znovu načte strukturu stránky. Když Zillow změní rozvržení webu (což se stává často), není potřeba opravovat křehké CSS selektory. AI se přizpůsobí automaticky. To skutečně řeší ten „přirozeně křehký“ problém kódovaných scraperů, který tolik uživatelů trápí.

Jaká data můžete ze Zillow vytěžit? (20+ polí)

Většina návodů vezme cenu a adresu a tím skončí. Nabídky na Zillow ale ve skutečnosti obsahují mnohem víc dat, než si lidé myslí — tady je přehled:

PoleKde se nacházíObtížnost získání
Nabídková cenaVýsledky vyhledávání + detailSnadné
Adresa / ZIPVýsledky vyhledávání + detailSnadné
ZestimateVýsledky vyhledávání + detailSnadné
Historie cen (každá událost)DetailTěžké (vnořené JSON)
Daňová historieDetailTěžké (vnořené JSON)
Ložnice / koupelny / plochaVýsledky vyhledávání + detailSnadné
Rok výstavbyDetailSnadné
Poplatek HOADetailStřední
Walk Score / Transit ScoreDetail (iframe)Těžké (vyžaduje vykreslení JS)
Hodnocení školDetailStřední
Velikost pozemkuDetailSnadné
Počet dní na ZillowVyhledáváníSnadné
Realitní makléř / kancelářVyhledávání + detailStřední
MLS #DetailSnadné
Typ nemovitostiVyhledávání + detailSnadné
Zeměpisná šířka / délka__NEXT_DATA__ JSONStřední
Popis nemovitostiDetailSnadné
URL fotekVyhledávání + detailStřední
Rent ZestimateDetailStřední
Srovnatelné prodeje v okolíDetailTěžké

„Těžká“ pole — historie cen, daňová historie, srovnatelné prodeje — jsou uložená ve vnořeném JSON na detailních stránkách. V části o Pythonu níže přesně ukážu, jak je vytáhnout. A pokud chcete přeskočit kód, Thunderbit přes AI Suggest Fields automaticky rozpozná většinu těchto sloupců a Scrape Subpages stáhne i detailní pole.

Nastavení Python prostředí pro scraping Zillow

Obtížnost: Středně pokročilá
Časová náročnost: ~5 minut na nastavení, ~30 minut na celý tutorial
Co budete potřebovat: Python 3.8+, Chrome (pro kontrolu stránky), textový editor nebo IDE

Nainstalujte potřebné knihovny:

pip install httpx beautifulsoup4 pandas lxml

K čemu slouží:

  • httpx — HTTP klient s lepším výkonem než requests a podporou async
  • beautifulsoup4 + lxml — parsování HTML
  • pandas — export dat do CSV/Excelu
  • Volitelně: selenium nebo playwright, pokud potřebujete vykreslovat stránky s těžkým JavaScriptem

Než začnete scrapovat: pochopení struktury stránky Zillow

zillow_structure_046e848770.png

Tohle je nejdůležitější věc, které je potřeba porozumět ještě před psaním kódu. Zillow je aplikace v Next.js — potvrdili to inženýrské příspěvky zaměstnanců Zillow. To znamená, že většina dat, která potřebujete, není v běžném HTML. Je uložená ve formě JSON blobu v tagu <script id="__NEXT_DATA__">.

Otevřete libovolnou stránku nemovitosti na Zillow, stiskněte F12, přejděte na Elements a vyhledejte __NEXT_DATA__. Najdete obrovský JSON objekt obsahující všechna data o nabídce — ceny, souřadnice, detaily nemovitosti, cenovou historii, daňové záznamy, hodnocení škol a další.

Proč je to důležité? CSS třídy Zillow jsou hashované (generované styled-components) a mění se s každým nasazením. Třída jako StyledPropertyCardHomeDetailsList-c11n-8-109-3__sc-1j0som5-0 bude příští týden úplně jiná. Každý scraper založený na CSS selektorech se proto bude pravidelně rozbíjet.

Přístup přes JSON __NEXT_DATA__ je mnohem stabilnější, protože vůbec nezávisí na HTML struktuře.

Klíčové JSON cesty pro výsledky vyhledávání:

CestaObsah
props.pageProps.searchPageState.cat1.searchResults.listResultsPole výsledků vyhledávání
props.pageProps.searchPageState.cat1.searchResults.mapResultsVýsledky na mapě
props.pageProps.searchPageState.cat1.searchList.totalPagesCelkový počet dostupných stránek

U detailních stránek některé používají __NEXT_DATA__ a jiné alternativní tag hdpApolloPreloadedData. Níže uvedený kód zvládá oba případy.

Krok za krokem: jak scrapovat Zillow v Pythonu

Krok 1: Nastavte HTTP hlavičky, abyste se vyhnuli okamžitému zablokování

Když pošlete na Zillow obyčejný httpx.get(), nevrátí se vám data s nabídkami, ale CAPTCHA stránka. Zillow používá PerimeterX (HUMAN Security) společně s Cloudflare — obě řešení mají podle benchmarků pro scraping obtížnost 8/10. Systém kontroluje TLS fingerprint, HTTP hlavičky a reputaci IP adresy.

Tady jsou minimální hlavičky, které v roce 2025 fungují:

import httpx

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
                   "(KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,"
              "image/avif,image/webp,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br",
    "Sec-Ch-Ua": '"Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"',
    "Sec-Ch-Ua-Platform": '"Windows"',
    "Sec-Fetch-Dest": "document",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-Site": "none",
    "Sec-Fetch-User": "?1",
    "Upgrade-Insecure-Requests": "1",
}

Hlavičky Sec-Ch-Ua jsou zásadní. Spousta návodů je vynechává — a právě proto jejich kód proti PerimeterX nefunguje.

Krok 2: Scrape výsledků vyhledávání na Zillow

URL výsledků na Zillow mají předvídatelný formát. Pro Houston, TX:

  • Stránka 1: https://www.zillow.com/houston-tx/
  • Stránka 2: https://www.zillow.com/houston-tx/2_p/
  • Stránka 3: https://www.zillow.com/houston-tx/3_p/

Každá stránka obsahuje asi 41 nabídek. Zillow omezuje výsledky na 20 stránek (~820 nabídek). Pro větší datasety je potřeba rozdělit oblast podle geografie (víc o tom níže).

Tady je kód pro scrapování výsledků vyhledávání extrakcí dat z JSON __NEXT_DATA__:

from bs4 import BeautifulSoup
import json
import time
import random

def scrape_zillow_search(url):
    """Scrape listing data from a Zillow search results page."""
    response = httpx.get(url, headers=headers, timeout=15)

    if response.status_code != 200:
        print(f"Got status {response.status_code} for {url}")
        return []

    soup = BeautifulSoup(response.text, "lxml")
    script_tag = soup.find("script", {"id": "__NEXT_DATA__"})

    if not script_tag:
        print("No __NEXT_DATA__ found — likely blocked by CAPTCHA")
        return []

    next_data = json.loads(script_tag.string)

    try:
        results = (
            next_data["props"]["pageProps"]["searchPageState"]
            ["cat1"]["searchResults"]["listResults"]
        )
    except KeyError:
        print("Unexpected JSON structure — Zillow may have changed its format")
        return []

    listings = []
    for item in results:
        listing = {
            "zpid": item.get("zpid"),
            "address": item.get("addressStreet"),
            "city": item.get("addressCity"),
            "state": item.get("addressState"),
            "zipcode": item.get("addressZipcode"),
            "price": item.get("unformattedPrice") or item.get("price"),
            "beds": item.get("beds"),
            "baths": item.get("baths"),
            "sqft": item.get("area"),
            "zestimate": item.get("zestimate"),
            "days_on_zillow": item.get("daysOnZillow"),
            "listing_url": item.get("detailUrl"),
            "img_src": item.get("imgSrc"),
            "property_type": item.get("hdpData", {}).get("homeInfo", {}).get("homeType"),
            "latitude": item.get("latLong", {}).get("latitude"),
            "longitude": item.get("latLong", {}).get("longitude"),
        }
        listings.append(listing)

    return listings

Pro scrapování více stránek použijte smyčku s prodlevami:

all_listings = []
base_url = "https://www.zillow.com/houston-tx/"

for page in range(1, 6):  # Prvních 5 stránek
    url = base_url if page == 1 else f"{base_url}{page}_p/"
    print(f"Scraping page {page}...")

    page_listings = scrape_zillow_search(url)
    all_listings.extend(page_listings)

    # Náhodná prodleva 3–7 sekund
    delay = random.uniform(3, 7)
    time.sleep(delay)

print(f"Total listings scraped: {len(all_listings)}")

Měli byste vidět, jak se strukturovaná data o nabídkách hromadí v all_listings. Pokud dostáváte prázdné výsledky, podívejte se na sekci „Proč scrapeři selhávají“ níže.

Krok 3: Scrape detailních stránek nemovitostí na Zillow

Výsledky vyhledávání vám dají základ. Detailní stránky obsahují hlubší data: cenovou historii, daňovou historii, hodnocení škol, informace o makléři a popisy nemovitostí. Každá URL nabídky z kroku 2 vede na detailní stránku.

Detailní stránky Zillow používají dva možné datové formáty. Tady je kód, který zvládá oba:

def scrape_zillow_detail(url):
    """Scrape detailed property data from a Zillow listing page."""
    response = httpx.get(url, headers=headers, timeout=15)

    if response.status_code != 200:
        return None

    soup = BeautifulSoup(response.text, "lxml")

    # Nejprve zkuste __NEXT_DATA__ (nejčastější varianta)
    script_tag = soup.find("script", {"id": "__NEXT_DATA__"})
    if script_tag:
        next_data = json.loads(script_tag.string)
        try:
            cache_str = next_data["props"]["pageProps"]["componentProps"]["gdpClientCache"]
            cache = json.loads(cache_str)
            first_key = next(iter(cache))
            prop = cache[first_key]["property"]
            return extract_property_fields(prop)
        except (KeyError, StopIteration):
            pass

    # Záloha: hdpApolloPreloadedData
    apollo_tag = soup.find("script", {"id": "hdpApolloPreloadedData"})
    if apollo_tag:
        raw = json.loads(apollo_tag.string)
        api_cache = json.loads(raw["apiCache"])
        for key, value in api_cache.items():
            if "ForSale" in key or "property" in str(value)[:100]:
                prop = value.get("property", value)
                return extract_property_fields(prop)

    return None


def extract_property_fields(prop):
    """Extract structured fields from a Zillow property JSON object."""
    return {
        "zpid": prop.get("zpid"),
        "zestimate": prop.get("zestimate"),
        "rent_zestimate": prop.get("rentZestimate"),
        "description": prop.get("description"),
        "year_built": prop.get("yearBuilt"),
        "lot_size": prop.get("lotSize"),
        "hoa_fee": prop.get("monthlyHoaFee"),
        "mls_id": prop.get("mlsid"),
        "broker_name": prop.get("brokerName") or prop.get("attributionInfo", {}).get("brokerName"),
        "price_history": [
            {
                "date": event.get("date"),
                "event": event.get("event"),
                "price": event.get("price"),
            }
            for event in prop.get("priceHistory", [])
        ],
        "tax_history": [
            {
                "year": record.get("time"),
                "tax_paid": record.get("taxPaid"),
                "value": record.get("value"),
            }
            for record in prop.get("taxHistory", [])
        ],
        "schools": [
            {
                "name": school.get("name"),
                "rating": school.get("rating"),
                "distance": school.get("distance"),
            }
            for school in prop.get("schools", [])
        ],
    }

Projděte URL nabídek se zpožděním:

detail_data = []
for listing in all_listings[:10]:  # Začněte s 10 pro test
    detail_url = listing.get("listing_url")
    if not detail_url:
        continue

    if not detail_url.startswith("http"):
        detail_url = f"https://www.zillow.com{detail_url}"

    print(f"Scraping detail: {detail_url}")
    detail = scrape_zillow_detail(detail_url)

    if detail:
        detail_data.append({**listing, **detail})

    time.sleep(random.uniform(3, 8))

Po tomto kroku byste měli mít seznam slovníků, který obsahuje jak data z výsledků vyhledávání, tak detailní data pro každou nemovitost.

Krok 4: Zpracujte stránkování a scrapujte více stránek

Pro oblasti s více než 820 nabídkami (limit 20 stránek) je potřeba území rozdělit geograficky. Interní API Zillow přijímá parametr mapBounds. Strategie je jednoduchá: rozdělit mapu na kvadranty a každý scrapovat zvlášť.

def split_bounds(bounds):
    """Split map bounds into 4 quadrants."""
    mid_lat = (bounds["north"] + bounds["south"]) / 2
    mid_lng = (bounds["east"] + bounds["west"]) / 2

    return [
        {"north": bounds["north"], "south": mid_lat, "east": bounds["east"], "west": mid_lng},
        {"north": bounds["north"], "south": mid_lat, "east": mid_lng, "west": bounds["west"]},
        {"north": mid_lat, "south": bounds["south"], "east": bounds["east"], "west": mid_lng},
        {"north": mid_lat, "south": bounds["south"], "east": mid_lng, "west": bounds["west"]},
    ]

Pro většinu použití — například sledování 50–200 nabídek v jedné konkrétní oblasti — stačí běžné stránkování přes URL. Rozdělení na kvadranty je spíš pro scraping celých měst nebo států.

Krok 5: Exportujte data ze Zillow

Všechno uložte do CSV pomocí pandas:

import pandas as pd

df = pd.DataFrame(detail_data)
df.to_csv("zillow_houston_listings.csv", index=False)
print(f"Exported {len(df)} listings to zillow_houston_listings.csv")

Export do JSON:

with open("zillow_houston_listings.json", "w") as f:
    json.dump(detail_data, f, indent=2)

Pokud chcete krok exportu přeskočit úplně, Thunderbit zdarma exportuje do Google Sheets, Airtable i Notion — hodí se to, když potřebujete data hned v týmu nebo v sdíleném formátu.

Proč se scrapeři na Zillow rozbíjejí (a jak stavět odolnější)

Tohle je průvodce přežitím.

Podle mých zkušeností se scrapeři na Zillow rozbíjejí ze tří konkrétních důvodů — a na každý existuje konkrétní řešení.

PerimeterX a CAPTCHA: proč vaše požadavky vrací prázdná data

PerimeterX integrace na Zillow sleduje víc signálů najednou: TLS fingerprint, HTTP hlavičky, reputaci IP i vzorce požadavků. Když rozpozná automatizaci, místo dat s nabídkou vrátí CAPTCHA stránku „Press & Hold“.

Přesný scénář selhání: Pošlete požadavek s výchozími Python hlavičkami. HTML odpovědi obsahuje challenge skripty PerimeterX místo dat o nemovitosti — a váš BeautifulSoup nenajde žádný tag __NEXT_DATA__.

Řešení: Použijte kompletní hlavičky napodobující prohlížeč z kroku 1. Pokud posíláte víc než pár desítek požadavků, potřebujete také rotaci proxy (viz níže). Pro větší zátěž zvažte knihovnu jako curl_cffi s impersonate="chrome" — je to v podstatě jediný Python HTTP klient, který umí věrně napodobit TLS fingerprint skutečného Chromu.

Dynamické CSS selektory: proč BeautifulSoup vrací None

Pokud používáte CSS selektory jako .list-card-price nebo názvy tříd s hash hodnotami, scraper se rozbije pokaždé, když Zillow nasadí novou verzi.

Zillow používá styled-components, které generují třídy jako StyledPropertyCardHomeDetailsList-c11n-8-109-3__sc-1j0som5-0. Hash část se s každým buildem mění.

Řešení: Nepoužívejte CSS selektory vůbec. Extrahujte data z JSON blobu __NEXT_DATA__, jak ukazuje kód výše. Tenhle přístup je stabilní už roky, protože JSON struktura se mění mnohem méně často než HTML.

Když už musíte parsovat HTML, hledejte data-test atributy (např. data-test="property-card") nebo používejte částečné shody tříd, třeba [class*="PropertyCard"]. Spolehlivější je ale stále extrakce z JSON.

Rotace proxy a exponenciální backoff: kód, který přežije ban IP adresy

IP adresy datacenter Zillow okamžitě blokuje. Pro spolehlivý přístup potřebujete residential proxy. Bezpečné tempo: 1 požadavek každé 3–8 sekund na IP, maximálně zhruba 500 požadavků za hodinu.

Tady je retry dekorátor s exponenciálním backoffem a jitterem:

import random
import time

def backoff_with_jitter(attempt, base_delay=2, max_delay=60):
    """AWS-style full jitter exponential backoff."""
    delay = min(max_delay, base_delay * (2 ** attempt))
    return random.uniform(0, delay)

def fetch_with_retry(url, max_retries=5):
    for attempt in range(max_retries):
        try:
            response = httpx.get(url, headers=headers, timeout=15)
            if response.status_code == 200:
                return response
            if response.status_code in (403, 429):
                delay = backoff_with_jitter(attempt, base_delay=5)
                print(f"Blocked ({response.status_code}). Retrying in {delay:.1f}s...")
                time.sleep(delay)
                continue
        except Exception as e:
            if attempt == max_retries - 1:
                raise
            time.sleep(backoff_with_jitter(attempt))
    return None

A jednoduchý pool pro rotaci proxy:

class ProxyPool:
    def __init__(self, proxies):
        self.proxies = proxies
        self.index = 0
        self.failures = {}

    def get_next(self):
        proxy = self.proxies[self.index % len(self.proxies)]
        self.index += 1
        return {"http://": proxy, "https://": proxy}

    def report_failure(self, proxy):
        self.failures[proxy] = self.failures.get(proxy, 0) + 1
        if self.failures[proxy] > 3:
            self.proxies.remove(proxy)

# Použití:
pool = ProxyPool(proxies=[
    "http://user:pass@residential1.example.com:8080",
    "http://user:pass@residential2.example.com:8080",
])

U poskytovatelů proxy nabízí DataImpulse residential proxy zhruba za 1 $/GB (nejlevnější varianta), zatímco IPRoyal a Smartproxy jsou solidní střední volba za 4–7 $/GB.

Alternativa bez údržby

Pokud Zillow scrapujete pravidelně a už vás unavuje opravování rozbitých selektorů nebo správa proxy poolu, AI v Thunderbitu znovu načte strukturu stránky při každém scrapování. Žádné selektory k údržbě, žádná konfigurace proxy. Skutečně řeší problém křehkosti, kvůli kterému bývá kódovaný scraping neustálým zdrojem starostí.

Jak automatizovat scrapování Zillow: plánování a sledování cen

Tohle chce každý realitní investor, se kterým jsem mluvil, a žádný jiný průvodce scrapováním Zillow to takhle podrobně neřeší: opakovaný automatický scraping pro sledování cen.

Pro uživatele Pythonu: cron job a detekce změn ceny

Nastavte cron job, který spustí scraper jednou týdně a označí změny cen:

import pandas as pd
from datetime import datetime

def detect_price_changes(new_data, historical_file, threshold=0.05):
    """Compare new scrape with historical data, flag changes > threshold."""
    try:
        old = pd.read_csv(historical_file)
    except FileNotFoundError:
        new_data.to_csv(historical_file, index=False)
        print("First run — saved baseline data.")
        return pd.DataFrame()

    merged = new_data.merge(old, on="zpid", suffixes=("_new", "_old"))
    merged["price_change_pct"] = (
        (merged["price_new"] - merged["price_old"]) / merged["price_old"]
    )
    alerts = merged[merged["price_change_pct"].abs() > threshold]

    # Přidání nových dat s časovou značkou
    new_data["scraped_at"] = datetime.now().isoformat()
    new_data.to_csv(historical_file, mode="a", header=False, index=False)

    return alerts

Přidejte to do crontabu pro týdenní spuštění každý pondělí v 6:00:

0 6 * * 1 cd /path/to/scraper && python zillow_monitor.py

Praktický příklad: sledujte 50 nabídek v Austinu, TX, jednou týdně. Každé pondělí script stáhne aktuální ceny, porovná je s předchozím týdnem a vyexportuje CSV s každou cenovou změnou větší než 5 %.

Pro nefajnové kodery: Thunderbit Scheduled Scraper

Thunderbit Scheduled Scraper vám umožní napsat interval obyčejnou řečí („každé pondělí v 9 ráno“), vložit URL vyhledávání na Zillow a kliknout na Schedule. Data se při každém spuštění automaticky exportují do Google Sheets. Žádný Python, žádný cron, žádný server k údržbě. Hodí se to hlavně pro realitní makléře nebo provozní týmy, které potřebují pravidelné sledování cen bez podpory vývojářů.

Tipy pro zodpovědné scrapování Zillow

Pár poznámek, jak se držet na správné straně hranice:

  • Scrapujte jen veřejně dostupná data. Nepřistupujte na stránky za loginem nebo ověřením.
  • Používejte rozumnou rychlost požadavků. Mezi requesty nechte 3–8 sekund. Nespamujte server.
  • Nescrapujte osobní nebo soukromá uživatelská data. Jména agentů a kanceláří u nabídek jsou veřejná; data účtů uživatelů ne.
  • Ukládejte a používejte data eticky. Průzkum trhu, investiční analýza a generování leadů jsou legitimní využití. Spam ne.
  • Právní kontext: Rozhodnutí hiQ v. LinkedIn stanovilo, že scraping veřejně dostupných dat neporušuje CFAA. Podobné principy potvrdilo i rozhodnutí Meta v. Bright Data (2024). Přesto podmínky Zillow omezují automatizovaný přístup a Zillow to vymáhá hlavně přes IP blokace a CAPTCHA, ne soudní cestou. Vždy si ověřte aktuální doporučení a respektujte robots.txt.

Vyberte si správný způsob scrapování Zillow pomocí Pythonu

Nejlepší cesta závisí na vaší situaci:

Potřebujete data hned a nechcete psát kód? Thunderbit vás dostane ze stránky s výsledky Zillow do strukturované tabulky asi za 2 minuty. AI se přizpůsobuje změnám layoutu, zvládá stránkování a export je zdarma. Nainstalujte si Chrome Extension a vyzkoušejte ho na stránce Zillow.

Chcete plnou kontrolu? Použijte Python kód z tohoto průvodce. Pro stabilitu extrahujte data z JSON __NEXT_DATA__, ne z CSS selektorů. Nastavte správné hlavičky napodobující prohlížeč. Používejte residential proxy a exponenciální backoff pro spolehlivost.

Potřebujete škálovat? Scraping API jako ScrapFly (99% úspěšnost na Zillow) nebo ScraperAPI za vás vyřeší proxy i CAPTCHA infrastrukturu, za 30–599 $ měsíčně podle objemu.

Sledujete ceny v čase? Nastavte cron job s detekcí změn cen, nebo použijte Thunderbit Scheduled Scraper jako řešení bez údržby.

Data tam jsou. Jediná otázka je, kolik inženýrského času chcete strávit jejich získáním. Více o získávání webových dat do tabulek najdete v našem průvodci scrapováním dat z webů do Excelu nebo v přehledu statistik Zillow, kde najdete nejnovější data o platformě. Můžete se také podívat na návody na Thunderbit YouTube Channel.

Vyzkoušejte Thunderbit pro scraping Zillow Get Started Free

Často kladené otázky

Dá se Zillow scrapovat v Pythonu zdarma?

Ano — httpx, BeautifulSoup i pandas jsou zdarma a open-source. Cenou za to je čas: hlavičky, rotaci proxy i údržbu selektorů si musíte řešit sami. Počítejte s 4–8 hodinami na prvotní nastavení a 4–10 hodinami měsíčně na údržbu, když Zillow změní web. Thunderbit navíc nabízí bezplatný tarif, pokud chcete úplně obejít programování.

Má Zillow oficiální API?

Zillow v září 2021 zrušilo své bezplatné veřejné API. Přístup teď vede přes Bridge Interactive, který vyžaduje schválení, stojí přibližně 500 $ měsíčně a cílí na licencované realitní profesionály. Pro většinu uživatelů — investory, analytiky, makléře dělající průzkum trhu — je scraping praktická alternativa. Zillow ale stále publikuje bezplatná výzkumná data ke stažení ve formě CSV na zillow.com/research/data/, včetně Zillow Home Value Index a Zillow Observed Rent Index.

Jak se vyhnout blokaci při scrapování Zillow?

Tři věci: (1) používejte realistické browser hlavičky včetně Sec-Ch-Ua — to je hlavička, kterou většina návodů vynechává a kterou PerimeterX kontroluje jako jednu z prvních; (2) rotujte residential proxy — datacenter IP adresy jsou blokované okamžitě; (3) extrahujte data z JSON __NEXT_DATA__ místo HTML selektorů, abyste se vyhnuli rozbití při změně layoutu. Držte se tempa 1 požadavek na 3–8 sekund na IP. Nebo použijte nástroj jako Thunderbit, který ochranu proti botům řeší automaticky.

Jaký je nejlepší způsob, jak scrapeovat Zillow bez kódování?

Nejrychlejší cesta je Thunderbit AI Web Scraper. Nainstalujte si Chrome Extension, otevřete stránku s výsledky na Zillow, klikněte na „AI Suggest Fields“ pro automatické rozpoznání sloupců a pak na „Scrape“. Do Google Sheets, Excelu, Airtable nebo Notion exportujete bez jediného řádku kódu. AI si stránku pokaždé načte znovu, takže se nerozbije, když Zillow změní rozložení.

Jak často Zillow mění strukturu webu a jak to ovlivňuje scrapery?

Zillow nasazuje změny často — někdy i týdně. Protože používá styled-components, CSS třídy se při každém nasazení mění a scrapeři postavení na CSS selektorech se pravidelně rozbíjejí. Nejodolnější přístup v Pythonu je extrakce z JSON blobu __NEXT_DATA__, který mění strukturu mnohem méně často. Pro řešení bez údržby AI v Thunderbitu znovu načte strukturu stránky při každém scrapování a automaticky se přizpůsobí změnám layoutu.

Zjistěte více

Shuai Guan
Shuai Guan
CEO ve společnosti Thunderbit | Expert na automatizaci dat s využitím AI Shuai Guan je CEO společnosti Thunderbit a absolvent inženýrského oboru na University of Michigan. Na základě téměř deseti let zkušeností v oblasti technologií a architektury SaaS se zaměřuje na převádění složitých modelů AI do praktických nástrojů pro extrakci dat bez nutnosti programování. Na tomto blogu sdílí nezkreslené a v praxi ověřené poznatky o web scrapingu a automatizačních strategiích, které vám pomohou vytvářet chytřejší datově řízené pracovní postupy. Když zrovna neoptimalizuje datové workflow, věnuje stejný důraz na detail také své vášni pro fotografii.
Obsah

Získej data z webu jen tím, že si o ně řekneš

Řekni, co potřebuješ, obyčejnou angličtinou. Nebo ještě lépe – neříkej nic.

Vyzkoušet Thunderbit zdarma
Získej data pomocí AI
Snadno přenes data do Google Sheets, Airtable nebo Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week