Python ile Zillow Nasıl Kazınır? (Engellenmeden)

Son güncelleme: April 15, 2026
Python ile Zillow Nasıl Kazınır? (Engellenmeden)

Zillow, 160 milyon ABD emlak kaydının üzerine kurulu dev bir veri kaynağıdır ve bu veriyi ölçekli biçimde dışarı almak, gayrimenkul verisiyle çalışanların en çok istediği ama en sinir bozucu işlerden biridir. Zillow’u kazımaya çalışıp da ilan verisi yerine bir CAPTCHA sayfasıyla karşılaştıysanız, yalnız değilsiniz.

Thunderbit’te geliştirdiğimiz kodsuz araçlar ve Python tabanlı yöntemler dahil olmak üzere Zillow kazıma için farklı yaklaşımları uzun süre inceledim ve test ettim. Bu rehber her iki yolu da kapsıyor. İster anti-bot stratejileriyle tam bir Python anlatımı isteyin, ister öğle arasına kadar 200 ilanı bir tabloya aktarmak isteyin, burada size uygun bir bölüm var. Zillow verisinin neden önemli olduğunu, sitenin arka planda nasıl çalıştığını, adım adım Python eğitimini, kazıyıcıların tam olarak neden bozulduğunu ve fiyat takibi için tekrar eden kazımaları nasıl otomatikleştireceğinizi anlatacağız.

Zillow Verisini Neden Kazımak Gerekir?

Zillow, ABD konut emlak verilerinin en büyük merkezidir. Aylık 210 milyon ziyaret alır ve yaklaşık 750.000+ aktif satılık ilan ile 1,9 milyon kiralık ilan barındırır. Platform, ABD’deki tüm emlak portal trafiğinin %50’sinden fazlasını tek başına alır — en yakın rakibinin iki katından bile fazla.

zillow_stats_998c14e590.png

Python koduna geçmeden önce şunu bilmek önemli: Zillow’u Python ile kazımak tek seçenek değil ve yanlış yöntemi seçmek saatlerinizi boşa harcatabilir. httpx ve BeautifulSoup gibi Python araçları orta seviye beceri ister; başlıklar ve proxy’lerin manuel yönetimini gerektirir; orta hızda çalışır (sayfa başına 1–3 saniye); sık bakım ister ama ücretsizdir. Selenium veya Playwright, JavaScript’i render ederek anti-bot tarafında daha iyi sonuç verir; ancak daha yavaştır (sayfa başına 5–15 saniye) ve yine yüksek bakım gerektirir. ScraperAPI veya ScrapFly gibi kazıma API’leri yerleşik anti-bot desteğiyle daha hızlıdır ve bakım ihtiyacı orta düzeydedir, fakat aylık 30–599 $ arası maliyet çıkarır. Zillow’un Bridge Interactive üzerinden sunduğu resmi API hızlı ve bakımı kolaydır, ancak sınırlıdır ve yaklaşık 500 $/ay tutar. Thunderbit gibi kodsuz araçlar ise yeni başlayanlar için uygundur, hızlıdır, AI uyumu sayesinde bakım gerektirmez ve genellikle freemium model sunar.

Sadece zaman tasarrufu bile büyük fark yaratır. 50+ posta kodu üzerinde manuel araştırma haftada 15–20 saati kolayca tüketebilir. Otomatik kazıma aynı işi dakikalar içinde yapar — harcanan zamanı %99,7 azaltır.

Zillow’u Kazımanın Tüm Yolları: Python, API ve Kodsuz Çözümler (Karşılaştırma)

Python koduna atlamadan önce, “Zillow’u Python ile kazımak” tek yol değil. Yanlış yöntemi seçmek saatlerinizi boşa harcar. Kendinize uygun olanı seçebilmeniz için yan yana bir karşılaştırma:

YöntemBeceri SeviyesiAnti-Bot YönetimiHızBakımMaliyet
Python + httpx/BeautifulSoupOrta seviyeManuel (başlıklar, proxy’ler)Orta (1–3 sn/sayfa)Yüksek (seçiciler bozulur)Ücretsiz
Python + Selenium/PlaywrightOrta seviyeDaha iyi (JS render eder)Yavaş (5–15 sn/sayfa)YüksekÜcretsiz
Kazıma API’si (ScraperAPI, ScrapFly)Orta seviyeYerleşikHızlıOrta30–599 $/ay
Zillow Resmi API’si (Bridge Interactive)Başlangıç–OrtaGeçerli değilHızlıDüşük~500 $/ay, sınırlı erişim
Kodsuz Araç (Thunderbit)BaşlangıçYerleşik (AI uyum sağlar)HızlıYok (AI sayfayı yeniden okur)Freemium

Hemen veri gerekiyorsa ve kod yazmak istemiyorsanız, Thunderbit ile başlayın. Altyapıyı anlamak ya da tam özelleştirme istiyorsanız, Python anlatımına devam edin.

2 Dakikada Çözüm: Thunderbit ile Zillow Kazıyın (Kodsuz)

Python derinliklerine dalmadan önce, hızlıca Zillow verisi almak isteyenler için en pratik yol şu: Python kurulumu yok, proxy ayarı yok, seçici bakımı yok. Thunderbit’te bu akışı özellikle teknik yük olmadan düzenli emlak verisi çekmek için geliştirdik.

Zorluk: Başlangıç Süre: ~2 dakika Gerekenler: Chrome tarayıcı, Thunderbit Chrome Eklentisi (ücretsiz katman yeterli)

1. Adım: Thunderbit’i Kurun ve Zillow’u Açın

Thunderbit uzantısını Chrome Web Store’dan yükleyin. Zillow arama sonuçları sayfasına gidin — örneğin Houston, TX konutlarını aratın.

2. Adım: "AI Suggest Fields"e Tıklayın

Thunderbit yan panelini açın ve "AI Suggest Fields"e tıklayın. Yapay zekâ sayfayı okur ve fiyat, adres, yatak odası, banyo, metrekare, Zestimate, ilan URL’si ve benzeri sütunları otomatik olarak önerir. Testlerimde genellikle manuel ayar yapmadan 20’den fazla alan tespit etti.

3. Adım: "Scrape"e Tıklayın

Scrape düğmesine basın. Veriler uzantı içinde yapılandırılmış bir tabloda görünür. Thunderbit, Zillow’un sayfalamasını otomatik olarak yönetir — hem tıklamalı hem sonsuz kaydırmalı yapılar için.

4. Adım: Alt Sayfa Kazıma ile Veriyi Zenginleştirin

Vergi geçmişi, okul puanları veya fiyat geçmişi gibi detay sayfası verilerine mi ihtiyacınız var? Tabloyu zenginleştirmek için "Scrape Subpages" özelliğini kullanın. Thunderbit her ilan URL’sini tek tek takip eder ve ek alanları çeker — ekstra koda gerek yok.

5. Adım: Dışa Aktarın

Google Sheets, Excel, Airtable veya Notion’a aktarın. Dışa aktarma ücretsizdir.

Thunderbit Zillow İçin Neden İyi Çalışır?

Buradaki asıl avantaj dayanıklılıktır. Thunderbit’in AI’si her kazımada sayfa yapısını yeniden okur. Zillow düzenini değiştirdiğinde — ki bu sık olur — kırılgan CSS seçicileri düzeltmek gerekmez. AI otomatik uyum sağlar. Bu, kodla yazılmış kazıyıcıların çoğu kullanıcıyı bezdiren “doğası gereği kırılgan” sorununu gerçekten çözer.

Zillow’dan Hangi Verileri Kazıyabilirsiniz? (20+ Alan)

Birçok rehber fiyat ve adresi alıp geçer. Oysa Zillow ilanlarında insanların düşündüğünden çok daha fazla çıkarılabilir veri vardır — işte referans tablo:

AlanNerede BulunurÇıkarma Zorluğu
İlan FiyatıArama + DetayKolay
Adres / Posta KoduArama + DetayKolay
ZestimateArama + DetayKolay
Fiyat Geçmişi (her olay)DetayZor (iç içe JSON)
Vergi GeçmişiDetayZor (iç içe JSON)
Yatak / Banyo / MetrekareArama + DetayKolay
Yapım YılıDetayKolay
Site Aidatı (HOA)DetayOrta
Yürüme Puanı / Toplu Taşıma PuanıDetay (iframe)Zor (JS render gerekir)
Okul PuanlarıDetayOrta
Arsa BüyüklüğüDetayKolay
Zillow’da Geçen Gün SayısıAramaKolay
İlan Sahibi / Emlak OfisiArama + DetayOrta
MLS NoDetayKolay
Mülk TürüArama + DetayKolay
Enlem / Boylam__NEXT_DATA__ JSONOrta
Açıklama MetniDetayKolay
Fotoğraf URL’leriArama + DetayOrta
Rent ZestimateDetayOrta
Yakındaki Benzer SatışlarDetayZor

“Zor” alanlar — fiyat geçmişi, vergi geçmişi, karşılaştırmalı satışlar — detay sayfalarındaki iç içe JSON içinde yer alır. Aşağıdaki Python bölümü bunları tam olarak nasıl çıkaracağınızı gösteriyor. Kodu atlamak isterseniz, Thunderbit’in AI Suggest Fields özelliği bu sütunların çoğunu otomatik algılar; Subpage Scraping ise detay sayfası alanlarını kendiliğinden toplar.

Zillow Kazımak İçin Python Ortamını Kurma

Zorluk: Orta seviye Süre: Kurulum için ~5 dakika, tüm eğitim için ~30 dakika Gerekenler: Python 3.8+, Chrome tarayıcı (sayfaları incelemek için), bir metin editörü veya IDE

Gerekli kütüphaneleri kurun:

pip install httpx beautifulsoup4 pandas lxml

Her birinin görevi şöyle:

  • httpxrequests’e göre daha iyi performans sunan ve async desteği olan HTTP istemcisi
  • beautifulsoup4 + lxml — HTML ayrıştırma
  • pandas — Veriyi CSV/Excel’e aktarma
  • İsteğe bağlı: JavaScript ağırlıklı sayfaları render etmeniz gerekiyorsa selenium veya playwright

Kazımadan Önce Zillow’un Sayfa Yapısını Anlamak

zillow_structure_046e848770.png

Kod yazmadan önce anlamanız gereken en önemli şey bu. Zillow bir Next.js uygulaması — bu, Zillow çalışanlarının teknik yazılarından doğrulanıyor. Yani istediğiniz verilerin çoğu görünür HTML öğelerinde değil. <script id="__NEXT_DATA__"> içindeki JSON bloğuna gömülü.

Herhangi bir Zillow mülk sayfasını açın, F12’ye basın, Elements sekmesine gidin ve __NEXT_DATA__ arayın. Karşınıza ilan verisinin tamamını içeren dev bir JSON nesnesi çıkacak: fiyatlar, koordinatlar, mülk bilgileri, fiyat geçmişi, vergi kayıtları, okul puanları ve daha fazlası.

Bu neden önemli? Zillow’un CSS sınıf adları hash’lenmiştir (styled-components tarafından üretilir) ve her dağıtımda değişir. StyledPropertyCardHomeDetailsList-c11n-8-109-3__sc-1j0som5-0 gibi bir sınıf adı gelecek hafta tamamen farklı bir hash’e sahip olur. CSS seçicileri kullanan her kazıyıcı düzenli olarak bozulur.

__NEXT_DATA__ JSON yaklaşımı çok daha stabildir; çünkü HTML yapısına hiç bağımlı değildir.

Arama sonuçları için temel JSON yolları:

Yolİçerik
props.pageProps.searchPageState.cat1.searchResults.listResultsArama sonuçları dizisi
props.pageProps.searchPageState.cat1.searchResults.mapResultsHarita görünümü sonuçları
props.pageProps.searchPageState.cat1.searchList.totalPagesToplam sayfa sayısı

Detay sayfalarında bazıları __NEXT_DATA__, bazıları ise alternatif bir hdpApolloPreloadedData script etiketi kullanır. Aşağıdaki kod her iki yapıyı da ele alır.

Adım Adım: Python ile Zillow Nasıl Kazınır?

1. Adım: Anında Bloklanmamak İçin HTTP Başlıklarını Kurun

Zillow’a çıplak bir httpx.get() göndermek size ilan verisi değil, CAPTCHA sayfası döndürür. Zillow, Cloudflare ile birlikte PerimeterX (HUMAN Security) kullanır — her ikisi de kazıma benchmark’larında 10 üzerinden 8 zorluk olarak değerlendirilir. Sistem TLS parmak izinizi, HTTP başlıklarınızı ve IP itibarınızı kontrol eder.

2025 itibarıyla çalışan minimum başlıklar şunlardır:

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",
}

Sec-Ch-Ua başlıkları kritik önemdedir. Birçok rehber bunları atlar — işte o yüzden bu örnekler PerimeterX karşısında çalışmaz.

2. Adım: Zillow Arama Sonuçlarını Kazıyın

Zillow arama URL’leri öngörülebilir bir kalıp izler. Houston, TX için:

    1. sayfa: https://www.zillow.com/houston-tx/
    1. sayfa: https://www.zillow.com/houston-tx/2_p/
    1. sayfa: https://www.zillow.com/houston-tx/3_p/

Her sayfada yaklaşık 41 ilan bulunur. Zillow sonuçları 20 sayfa ile sınırlar (~820 ilan). Daha büyük veri kümeleri için coğrafyayı bölmeniz gerekir (birazdan anlatacağız).

İşte __NEXT_DATA__ JSON’undan veri çekerek arama sonuçlarını kazıyan kod:

from bs4 import BeautifulSoup
import json
import time
import random

def scrape_zillow_search(url):
    """Zillow arama sonuçları sayfasından ilan verisini kazır."""
    response = httpx.get(url, headers=headers, timeout=15)

    if response.status_code != 200:
        print(f"{url} için {response.status_code} durumu alındı")
        return []

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

    if not script_tag:
        print("__NEXT_DATA__ bulunamadı — büyük olasılıkla CAPTCHA ile engellendi")
        return []

    next_data = json.loads(script_tag.string)

    try:
        results = (
            next_data["props"]["pageProps"]["searchPageState"]
            ["cat1"]["searchResults"]["listResults"]
        )
    except KeyError:
        print("Beklenmeyen JSON yapısı — Zillow formatı değiştirmiş olabilir")
        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

Birden fazla sayfayı kazımak için, gecikme ekleyerek döngü kurun:

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

for page in range(1, 6):  # İlk 5 sayfa
    url = base_url if page == 1 else f"{base_url}{page}_p/"
    print(f"{page}. sayfa kazınıyor...")

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

    # 3–7 saniye arasında rastgele gecikme
    delay = random.uniform(3, 7)
    time.sleep(delay)

print(f"Toplam kazınan ilan sayısı: {len(all_listings)}")

all_listings içinde yapılandırılmış ilan verisinin biriktiğini görmelisiniz. Boş sonuç alırsanız aşağıdaki “Kazıyıcılar Neden Bozulur?” bölümüne bakın.

3. Adım: Zillow İlan Detay Sayfalarını Kazıyın

Arama sonuçları temel bilgileri verir. Detay sayfalarında daha derin veriler bulunur: fiyat geçmişi, vergi geçmişi, okul puanları, emlakçı bilgileri ve mülk açıklamaları. 2. adımda aldığınız her ilan URL’si bir detay sayfasına yönlendirir.

Zillow detay sayfaları iki farklı veri formatı kullanabilir. Aşağıdaki kod her ikisini de işler:

def scrape_zillow_detail(url):
    """Zillow ilan sayfasından detaylı mülk verisini kazır."""
    response = httpx.get(url, headers=headers, timeout=15)

    if response.status_code != 200:
        return None

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

    # Önce __NEXT_DATA__ dene (en yaygın)
    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

    # Alternatif: 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):
    """Zillow mülk JSON nesnesinden yapılandırılmış alanları çıkarır."""
    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", [])
        ],
    }

İlan URL’leri arasında gecikme vererek döngü kurun:

detail_data = []
for listing in all_listings[:10]:  # Önce test için 10 tane
    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"Detay kazınıyor: {detail_url}")
    detail = scrape_zillow_detail(detail_url)

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

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

Bu adımdan sonra, her mülk için hem arama seviyesi hem de detay seviyesi verileri içeren sözlüklerden oluşan bir listeniz olmalı.

4. Adım: Birden Fazla Sayfa Kazımak İçin Sayfalamayı Yönetin

820’den fazla ilan olan alanlarda (20 sayfa sınırı) coğrafyayı bölmeniz gerekir. Zillow’un iç API’si mapBounds parametrelerini kabul eder. Strateji şudur: haritayı dört parçaya bölün ve her birini ayrı kazıyın.

def split_bounds(bounds):
    """Harita sınırlarını 4 çeyreğe böler."""
    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"]},
    ]

Çoğu kullanım senaryosu — belirli bir bölgede 50–200 ilanı izlemek gibi — için standart URL sayfalaması yeterlidir. Çeyreklere bölme yaklaşımı şehir geneli veya eyalet geneli kazımalar içindir.

5. Adım: Kazıdığınız Zillow Verisini Dışa Aktarın

Her şeyi pandas ile CSV’ye kaydedin:

import pandas as pd

df = pd.DataFrame(detail_data)
df.to_csv("zillow_houston_listings.csv", index=False)
print(f"{len(df)} ilan zillow_houston_listings.csv dosyasına aktarıldı")

JSON dışa aktarımı için:

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

Dışa aktarma adımını tamamen atlamak isterseniz, Thunderbit veriyi Google Sheets, Airtable ve Notion’a ücretsiz aktarır — özellikle veriyi hemen ekipçe kullanılabilir bir formata almak istiyorsanız faydalıdır.

Zillow Kazıyıcıları Neden Bozulur? (ve Nasıl Dayanıklı Hale Getirilir)

Bu bölüm hayatta kalma rehberidir.

Deneyimlerime göre Zillow’daki kazıyıcılar üç temel nedenle bozulur — ve her birinin net bir çözümü vardır.

PerimeterX ve CAPTCHA’lar: Neden İstekleriniz Boş Veri Döndürüyor?

Zillow’un PerimeterX entegrasyonu aynı anda birden fazla sinyali kontrol eder: TLS parmak izi, HTTP başlıkları, IP itibarı ve istek örüntüleri. Otomasyon tespit ettiğinde, ilan verisi yerine bir “Press & Hold” CAPTCHA sayfası döndürür.

Tam hata senaryosu: Varsayılan Python başlıklarıyla istek gönderirsiniz. Yanıt HTML’sinde mülk verisi yerine PerimeterX challenge script’leri vardır — ve BeautifulSoup çözümlemeniz __NEXT_DATA__ etiketi bulamaz.

Çözüm: 1. adımda verilen tam tarayıcı taklidi başlıklarını kullanın. Birkaç düzineden fazla istek atıyorsanız proxy rotasyonu da gerekir (aşağıda anlatılıyor). Ağır kazıma için impersonate="chrome" ile curl_cffi gibi bir kütüphane düşünün — gerçek bir Chrome TLS parmak izine en çok yaklaşabilen Python HTTP istemcisidir.

Dinamik CSS Seçiciler: Neden BeautifulSoup None Döndürüyor?

.list-card-price gibi CSS seçiciler veya hash’li sınıf adları kullanıyorsanız, Zillow yeni kod yayınladığı anda kazıyıcınız bozulur.

Zillow, StyledPropertyCardHomeDetailsList-c11n-8-109-3__sc-1j0som5-0 gibi sınıf adları üreten styled-components kullanır. Hash kısmı her derlemede değişir.

Çözüm: CSS seçicilerini hiç kullanmayın. Yukarıdaki kodda gösterildiği gibi veriyi __NEXT_DATA__ JSON bloğundan çıkarın. Bu yaklaşım yıllardır stabildir; çünkü JSON yapısı HTML işaretlemesine göre çok daha az değişir.

HTML ayrıştırmak zorundaysanız, data-test özniteliklerine bakın (ör. data-test="property-card") veya [class*="PropertyCard"] gibi alt dize eşleşmeleri kullanın. Ama en güvenilir yol JSON çıkarımıdır.

Proxy Rotasyonu ve Exponential Backoff: IP Ban’lerinden Kurtulan Kod

Zillow, veri merkezi IP’lerini hemen kara listeye alır. Güvenilir erişim için residential proxy gerekir. Güvenli hız: IP başına 3–8 saniyede 1 istek, saatte yaklaşık 500 isteğin altında kalmak.

İşte jitter içeren exponential backoff kullanan bir yeniden deneme dekoratörü:

import random
import time

def backoff_with_jitter(attempt, base_delay=2, max_delay=60):
    """AWS tarzı tam jitter'lı 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"Engellendi ({response.status_code}). {delay:.1f}s sonra tekrar deneniyor...")
                time.sleep(delay)
                continue
        except Exception as e:
            if attempt == max_retries - 1:
                raise
            time.sleep(backoff_with_jitter(attempt))
    return None

Basit bir proxy rotasyon havuzu da şöyle olabilir:

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)

# Kullanım:
pool = ProxyPool(proxies=[
    "http://user:pass@residential1.example.com:8080",
    "http://user:pass@residential2.example.com:8080",
])

Proxy sağlayıcıları için DataImpulse yaklaşık 1 $/GB ile en uygun seçeneklerden birini sunarken, IPRoyal ve Smartproxy de 4–7 $/GB bandında sağlam orta seviye seçeneklerdir.

Sıfır Bakım Alternatifi

Eğer Zillow’u düzenli olarak kazıyor ve bozuk seçicilerle veya proxy havuzlarıyla uğraşmaktan yorulduysanız, Thunderbit’in AI’si her kazımada sayfa yapısını yeniden okur. Bakım gerektiren seçiciler yoktur, proxy yapılandırması yoktur. Kodla yazılmış kazıyıcıları sürekli sorun çıkaran kırılganlıktan gerçekten kurtarır.

Zillow Kazımayı Otomatikleştirin: Zamanlama ve Fiyat Takibi

Konuştuğum her emlak yatırımcısı bunu istiyor ve başka hiçbir Zillow kazıma rehberi bunu kapsamıyor: fiyat takibi için tekrar eden otomatik kazımalar.

Python Kullananlar İçin: Cron Job ve Fiyat Değişimi Tespiti

Kazıyıcınızı haftalık çalıştıran ve fiyat değişimlerini işaretleyen bir cron job kurun:

import pandas as pd
from datetime import datetime

def detect_price_changes(new_data, historical_file, threshold=0.05):
    """Yeni kazımayı geçmiş veriyle karşılaştırır, eşiği aşan değişimleri işaretler."""
    try:
        old = pd.read_csv(historical_file)
    except FileNotFoundError:
        new_data.to_csv(historical_file, index=False)
        print("İlk çalıştırma — başlangıç verisi kaydedildi.")
        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]

    # Yeni veriyi zaman damgasıyla ekle
    new_data["scraped_at"] = datetime.now().isoformat()
    new_data.to_csv(historical_file, mode="a", header=False, index=False)

    return alerts

Bunu haftalık Pazartesi 06:00 çalışacak şekilde crontab’a ekleyin:

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

Pratik bir örnek: Austin, TX’deki 50 ilanı haftalık izleyin. Her Pazartesi script mevcut fiyatları çeker, geçen haftaki verilerle karşılaştırır ve %5’ten fazla fiyat düşüşlerini gösteren bir CSV üretir.

Kod Yazmayanlar İçin: Thunderbit Scheduled Scraper

Thunderbit’in Scheduled Scraper özelliği, aralığı düz bir dille (“her Pazartesi saat 9’da”) tanımlamanıza, Zillow arama URL’lerinizi girmenize ve Schedule’a tıklamanıza olanak tanır. Veriler her çalıştırmada otomatik olarak Google Sheets’e gider. Python yok, cron yok, bakım gerektiren sunucu yok. Bu özellikle sürekli fiyat takibi yapmak isteyen emlak danışmanları veya operasyon ekipleri için çok kullanışlıdır.

Zillow’u Sorumlu Şekilde Kazımak İçin İpuçları

Sınırda kalmak yerine doğru tarafta kalmak için birkaç not:

  • Yalnızca herkese açık verileri kazıyın. Giriş duvarlarının veya kimlik doğrulamanın arkasındaki sayfalara erişmeyin.
  • Makul istek hızları kullanın. İstekler arasında 3–8 saniye bırakın. Sunucuyu zorlamayın.
  • Kişisel/özel kullanıcı verilerini kazımayın. İlanlardaki emlakçı adları ve ofis bilgileri herkese açıktır; kullanıcı hesap verileri değildir.
  • Veriyi etik şekilde saklayın ve kullanın. Piyasa araştırması, yatırım analizi ve potansiyel müşteri üretimi meşru kullanım alanlarıdır. Spam değildir.
  • Hukuki bağlam: hiQ v. LinkedIn kararı, herkese açık verilerin kazınmasının CFAA’yı ihlal etmediğini ortaya koydu. Meta v. Bright Data (2024) kararı da benzer ilkeleri destekledi. Bununla birlikte Zillow’un kullanım şartları otomatik erişimi sınırlar ve bunu çoğunlukla hukuk yoluyla değil IP ban ve CAPTCHA ile uygular. Güncel yönlendirmeleri mutlaka kontrol edin ve robots.txt dosyasına saygı gösterin.

Python ile Zillow Kazımak İçin Doğru Yolu Seçin

En iyi yaklaşımınız durumunuza bağlıdır:

Hızlıca, kodsuz veri mi lazım? Thunderbit, sizi yaklaşık 2 dakikada bir Zillow arama sayfasından yapılandırılmış bir tabloya götürür. AI, düzen değişikliklerine uyum sağlar, sayfalamayı yönetir ve dışa aktarmayı ücretsiz yapar. Chrome Extension eklentisini kurun ve bir Zillow arama sayfasında deneyin.

Tam kontrol mü istiyorsunuz? Bu rehberdeki Python kodunu kullanın. Kararlılık için CSS seçiciler yerine __NEXT_DATA__ JSON’undan veri alın. Uygun tarayıcı taklidi başlıkları ekleyin. Güvenilirlik için residential proxy rotasyonu ve exponential backoff kullanın.

Ölçeği büyütüyor musunuz? ScrapFly gibi kazıma API’leri (%99 başarı oranı iddiasıyla) veya ScraperAPI, proxy ve CAPTCHA altyapısını sizin yerinize yönetir; hacme göre aylık 30–599 $ maliyet çıkarır.

Zaman içinde fiyat mı takip edeceksiniz? Fiyat değişimi tespit scriptiyle bir cron job kurun ya da bakım gerektirmeyen bir yaklaşım için Thunderbit’in Scheduled Scraper özelliğini kullanın.

Veri orada duruyor. Asıl soru, onu çıkarmak için ne kadar mühendislik zamanı harcamak istediğiniz. Web verisini tablolara aktarma konusunda daha fazlası için web sitesinden Excel’e veri çekme rehberimize veya en güncel platform verileri için Zillow istatistikleri özetimize bakabilirsiniz. Ayrıca Thunderbit YouTube Kanalı üzerindeki eğitimleri de izleyebilirsiniz.

Zillow Kazıma için Thunderbit’i Deneyin Get Started Free

Sık Sorulan Sorular

Zillow’u Python ile ücretsiz kazıyabilir misiniz?

Evet — httpx, BeautifulSoup ve pandas’ın hepsi ücretsiz ve açık kaynaklıdır. Takas ettiğiniz şey zamandır: başlıkları, proxy rotasyonunu ve seçici bakımını kendiniz yönetmeniz gerekir. Zillow sitesini değiştirdiğinde ilk kurulum için 4–8 saat, aylık bakım için 4–10 saat ayırmanız beklenir. Kod yükünü tamamen kaldırmak isterseniz Thunderbit’in ücretsiz katmanı da vardır.

Zillow’un resmi bir API’si var mı?

Zillow, ücretsiz herkese açık API’sini Eylül 2021’de sonlandırdı. Şimdi erişim Bridge Interactive üzerinden sağlanıyor; onay gerektiriyor, yaklaşık 500 $/ay tutuyor ve lisanslı emlak profesyonellerine yönelik. Çoğu kullanıcı için — yatırımcılar, araştırmacılar, piyasa analizi yapan danışmanlar — pratik alternatif kazımadır. Zillow ayrıca zillow.com/research/data/ adresinde Zillow Home Value Index ve Zillow Observed Rent Index dahil olmak üzere ücretsiz araştırma verilerini CSV olarak sunar.

Zillow’u kazırken engellenmeyi nasıl önlerim?

Üç şey: (1) Sec-Ch-Ua dahil gerçekçi tarayıcı başlıkları kullanın — çoğu rehberin atladığı ve PerimeterX’in ilk kontrol ettiği başlık budur; (2) residential proxy rotasyonu yapın — veri merkezi IP’leri anında kara listeye alınır; (3) düzen değişimlerinden etkilenmemek için HTML seçicileri yerine __NEXT_DATA__ JSON’undan veri çıkarın. İstek hızını IP başına 3–8 saniyede 1 istek seviyesinde tutun. Ya da anti-bot korumasını otomatik yöneten Thunderbit gibi bir araç kullanın.

Kod yazmadan Zillow kazımanın en iyi yolu nedir?

Thunderbit’in AI Web Scraper aracı en hızlı yoldur. Chrome Extension eklentisini kurun, bir Zillow arama sayfasına gidin, sütunları otomatik tespit etmek için "AI Suggest Fields"e tıklayın, ardından "Scrape"e basın. Veriyi Google Sheets, Excel, Airtable veya Notion’a kod yazmadan aktarın. AI her seferinde sayfayı yeniden okuduğu için Zillow düzenini güncellediğinde bozulmaz.

Zillow web sitesi yapısını ne sıklıkla değiştiriyor ve bu kazıyıcıları nasıl etkiliyor?

Zillow sık sık — bazen haftalık — güncelleme yayınlar. Styled-components kullandıkları için CSS sınıf adları her dağıtımda değişir ve CSS seçicilere dayalı kazıyıcılar düzenli olarak bozulur. Python için en dayanıklı yaklaşım, yapısı çok daha az değişen __NEXT_DATA__ JSON bloğundan veri çekmektir. Sıfır bakım yaklaşımı için Thunderbit’in AI’si her kazımada sayfa yapısını yeniden okur ve düzen değişikliklerine otomatik uyum sağlar.

Daha Fazla Bilgi

Shuai Guan
Shuai Guan
Thunderbit CEO’su | AI Veri Otomasyonu Uzmanı Shuai Guan, Thunderbit’in CEO’su ve University of Michigan Mühendislik mezunudur. Teknoloji ve SaaS mimarisi alanındaki yaklaşık on yıllık deneyiminden güç alarak, karmaşık yapay zeka modellerini pratik, kod yazmadan kullanılabilen veri çıkarma araçlarına dönüştürme konusunda uzmanlaşmıştır. Bu blogda, daha akıllı ve veriye dayalı iş akışları kurmanıza yardımcı olmak için web kazıma ve otomasyon stratejileri üzerine filtresiz, sahada sınanmış içgörüler paylaşıyor. Veri iş akışlarını optimize etmediği zamanlarda ise aynı detay odaklı yaklaşımını fotoğrafçılık tutkusuna da yansıtıyor.
İçindekiler

Sadece sorarak bir web sayfasını çek

Ne istediğini düz İngilizceyle söyle. Hatta daha iyisi, hiçbir şey söyleme.

Thunderbit’i dene ücretsiz
Yapay Zeka ile Veri Çıkar
Verileri Google Sheets, Airtable veya Notion’a kolayca aktar
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week