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.

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öntem | Beceri Seviyesi | Anti-Bot Yönetimi | Hız | Bakım | Maliyet |
|---|---|---|---|---|---|
| Python + httpx/BeautifulSoup | Orta seviye | Manuel (başlıklar, proxy’ler) | Orta (1–3 sn/sayfa) | Yüksek (seçiciler bozulur) | Ücretsiz |
| Python + Selenium/Playwright | Orta seviye | Daha iyi (JS render eder) | Yavaş (5–15 sn/sayfa) | Yüksek | Ücretsiz |
| Kazıma API’si (ScraperAPI, ScrapFly) | Orta seviye | Yerleşik | Hızlı | Orta | 30–599 $/ay |
| Zillow Resmi API’si (Bridge Interactive) | Başlangıç–Orta | Geçerli değil | Hı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:
| Alan | Nerede Bulunur | Çıkarma Zorluğu |
|---|---|---|
| İlan Fiyatı | Arama + Detay | Kolay |
| Adres / Posta Kodu | Arama + Detay | Kolay |
| Zestimate | Arama + Detay | Kolay |
| Fiyat Geçmişi (her olay) | Detay | Zor (iç içe JSON) |
| Vergi Geçmişi | Detay | Zor (iç içe JSON) |
| Yatak / Banyo / Metrekare | Arama + Detay | Kolay |
| Yapım Yılı | Detay | Kolay |
| Site Aidatı (HOA) | Detay | Orta |
| Yürüme Puanı / Toplu Taşıma Puanı | Detay (iframe) | Zor (JS render gerekir) |
| Okul Puanları | Detay | Orta |
| Arsa Büyüklüğü | Detay | Kolay |
| Zillow’da Geçen Gün Sayısı | Arama | Kolay |
| İlan Sahibi / Emlak Ofisi | Arama + Detay | Orta |
| MLS No | Detay | Kolay |
| Mülk Türü | Arama + Detay | Kolay |
| Enlem / Boylam | __NEXT_DATA__ JSON | Orta |
| Açıklama Metni | Detay | Kolay |
| Fotoğraf URL’leri | Arama + Detay | Orta |
| Rent Zestimate | Detay | Orta |
| Yakındaki Benzer Satışlar | Detay | Zor |
“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:
- httpx —
requests’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

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.listResults | Arama sonuçları dizisi |
props.pageProps.searchPageState.cat1.searchResults.mapResults | Harita görünümü sonuçları |
props.pageProps.searchPageState.cat1.searchList.totalPages | Toplam 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:
-
- sayfa:
https://www.zillow.com/houston-tx/
- sayfa:
-
- sayfa:
https://www.zillow.com/houston-tx/2_p/
- sayfa:
-
- sayfa:
https://www.zillow.com/houston-tx/3_p/
- sayfa:
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


