Redfin, yeni ABD MLS ilanlarının %70’ini, ilanlar sisteme düştükten sonraki beş dakika içinde güncelliyor. Gayrimenkul veri hattı kuran herkes için bu tür bir güncellik gerçekten altın değerinde — ve tam da bu yüzden bu kadar çok kazıyıcı Redfin’i hedef alıyor ve dakikalar içinde engelleniyor.
Thunderbit’te yıllardır veri çıkarma araçları üzerinde çalışıyorum ve şunu net söyleyebilirim: “Redfin’i kazımak” ile “Redfin’i engellenmeden kazımak” arasındaki fark, çoğu rehberin dağıldığı nokta. Size BeautifulSoup kodunu gösteriyorlar, Cloudflare’ın isteklerinizi nasıl boşa düşürdüğünü atlıyorlar ve 403 sayfasına bakıp neyin yanlış gittiğini anlamaya çalışırken sizi ortada bırakıyorlar. Bu rehber farklı. Sizi üç gerçek yaklaşımdan geçireceğim — HTML ayrıştırma, Redfin’in gizli API’si ve Thunderbit ile kodsuz yol — ayrıca gerçekten önemli olan anti-bot savunmalarına ciddi şekilde değineceğim. Sonunda, hangi yöntemin beceri seviyenize, ölçeğinize ve bakım yüküne ne kadar dayanabildiğinize uygun olduğunu net biçimde bileceksiniz.
Redfin kazıma için Thunderbit'i deneyin
Redfin Nedir ve Verileri Neden Önemlidir?
Redfin, maaşlı emlak danışmanlarıyla çalışan, teknoloji odaklı bir emlak aracılık şirketidir ve ilanları doğrudan MLS akışlarından çeker. ABD ve Kanada’da 42 eyalette 100’den fazla metropolü kapsar ve aylık yaklaşık 50 milyon ziyaretçiye hizmet verir. Sadece veri toplayan portallardan farklı olarak Redfin’in verileri danışman tarafından doğrulanır; tescilli Redfin Estimate AVM’si ise 95 milyondan fazla mülkü kapsar ve piyasadaki evler için ortanca hata oranı yalnızca %1,96’dır.

MLS hızında güncellik, broker doğrulamalı kalite ve güçlü bir AVM birleşince; emlak yatırımcıları, danışmanlar, proptech girişimleri ve veri analistleri Redfin verilerine programatik erişim istemeye başlıyor. Bu iş için Python doğal seçimdir: scraping ekosistemi (requests, BeautifulSoup, Selenium, Playwright) olgunlaşmıştır, topluluk desteği çok geniştir ve pandas ile Jupyter’a doğrudan bağlanır.
Neden Redfin’i Python ile Kazımak?
Kullanım senaryoları, veriye ihtiyaç duyan kişiler kadar çeşitlidir. Farklı gruplar genelde Redfin verisini şöyle kullanır:
| Kitle | Temel Kazıma Hedefi | Örnek Kullanım |
|---|---|---|
| Emlak danışmanları | Lead üretimi, pazar içgörüsü | Hizmet bölgesindeki yeni ve süresi dolan ilanlar; rakip analizi için danışman dizini |
| Emlak yatırımcıları | Fırsat akışı, cap rate analizi | Kira getirisi taramaları, düşük fiyatlı mülk tespiti, günlük yeni ilan uyarıları |
| Proptech girişimleri | Ürün veri hatları | AVM eğitim verisi, pazar panoları, iBuyer edinim motorları |
| Veri analistleri | Pazar araştırması, BI | ZIP bazlı medyan fiyat eğilimleri, piyasada kalma süresi serileri, satış/ilan oranları |
| Toptancılar / flip yapanlar | Sorunlu mülk takibi | Fiyat indirimi tespiti, hacizler, piyasaya çıkmamış emsaller |
Daha geniş trend de bunu doğruluyor: emlak firmalarının %72’den fazlası artık fırsatları belirlemek ve riski yönetmek için kestirimci analitik kullanıyor. PropTech pazarının ise %16,4 CAGR ile 2025’te 47 milyar dolara ulaşması bekleniyor. Yapılandırılmış emlak verisi artık “olsa iyi olur” kategorisinde değil — temel ihtiyaç.
Kazıyabileceğiniz Tüm Redfin Veri Alanları (Tam Referans)
Tek bir satır kod yazmadan önce, gerçekte nelerin mevcut olduğunu bilmeniz gerekir. Redfin’in arama sonuçlarını, mülk detay sayfalarını ve danışman profillerini inceledim; ayrıca reteps/redfin ve RedfinPlus gibi açık kaynak Stingray sarmalayıcılarıyla da karşılaştırdım. Toplamda sayfa türleri arasında 117 farklı alan çıkıyor.
Bu tabloyu yer imlerine eklemeye değer. Kodlamaya başlamadan önce veri şemanızı bilmek, saatlerce sürebilecek deneme-yanılma sürecini kurtarır.
Arama Sonuçları Sayfası Alanları
Bunlar ilan kartlarında bulunan, çoğu zaman tam JS render olmadan da çıkarılabilen hafif alanlardır:
| Alan | Veri Türü | Notlar |
|---|---|---|
| Mülk ID | Sayı | Redfin iç int değeri, href içindeki /home/{id} yolundan ayrıştırılır |
| Liste fiyatı | Sayı | |
| Tam adres | Metin | |
| Oda / Banyo / m² | Sayı | Art arda üç değer |
| Mülk türü | Tekli Seçim | SFH, Condo, Townhouse, Multi |
| Durum | Metin | Active, Pending, Contingent |
| Piyasada kalma süresi | Sayı | |
| Fiyat indirimi göstergesi | Sayı | İlk liste fiyatına göre fark |
| Birincil fotoğraf | Görsel URL’si | Kart başına bir fotoğraf |
| Hot Home rozeti | Boolean | |
| Açık ev tarih/saat bilgisi | Metin | |
| Aracı kurum bilgisi | Metin |
Mülk Detay Sayfası Alanları
Asıl derin veri burada bulunur. Bu alanların çoğu JavaScript render’ı veya Stingray API gerektirir:
| Alan | Veri Türü | Notlar |
|---|---|---|
| Redfin Estimate (piyasadaki) | Sayı | /stingray/api/home/details/avm üzerinden |
| Redfin Estimate (piyasada olmayan) | Sayı | /stingray/api/home/details/owner-estimate üzerinden; %7,52 ortanca hata |
| Yapım yılı / renovasyon yılı | Sayı | |
| Arsa büyüklüğü | Sayı | |
| Site aidatı | Sayı | Uygunsa aylık |
| Yıllık emlak vergisi | Sayı | |
| Vergi değerlemesi | Sayı | |
| Satış geçmişi tablosu | Tablo | Fiyat, tarih, olay türü |
| Mülk açıklaması | Metin | Pazarlama paragrafı |
| Fotoğraf URL’leri (karusel) | Görsel URL’leri | İlan başına 20+ |
| Listeleyen danışmanın adı, telefonu, e-postası | Metin / Telefon / E-posta | Telefon çoğu zaman gizlenir |
| Okul puanları (ilkokul/ortaokul/lise) | Sayı | Bölge adı ile birlikte |
| Yürüme / Toplu taşıma / Bisiklet puanı | Sayı | |
| İklim riski puanları | Sayı | Sel, yangın, sıcaklık, rüzgâr |
| Benzer aktif / satılmış / yakın evler | URL’ler | Karusel verisi |
| Otopark, garaj, ısıtma, soğutma | Metin | Olanak grupları |
Danışman Profil Alanları
| Alan | Veri Türü | Notlar |
|---|---|---|
| Danışman adı, fotoğrafı, aracı kurum, biyografi | Metin / Görsel | |
| Telefon, iletişim formu | Telefon / Metin | Tıklayınca gösterilir |
| Aktif ilan sayısı | Sayı | |
| Son 12 ay satışları / toplam hacim | Sayı | |
| Ortalama ilan-satış oranı | Sayı | |
| Yıldız puanı / yorum sayısı | Sayı | |
| Deneyim yılı / lisans no | Metin / Sayı |
Thunderbit’in bir Redfin sayfasında AI Suggest Fields özelliğini kullandığınızda, bu sütunların çoğunu otomatik olarak tanır ve doğru veri türlerini atar — manuel CSS seçici eşleştirmesi gerekmez. Buna birazdan döneceğim.
Redfin’in Anti-Bot Savunmaları Nasıl Çalışıyor? (“Proxy Alın”dan Fazlası)
Burada özellikle durmak istiyorum; çünkü çoğu rehber engellenme sorununu geçiştirip hemen “sponsorumuzdan proxy alın” kısmına atlıyor. Bu yardımcı olmaz. Redfin’in kazıyıcıları tespit etmek için ne yaptığını anlamazsanız proxy kredilerini tüketir, yine de engellenirsiniz. ScrapeOps, Redfin’in anti-bot zorluğunu 10 üzerinden 7,5 olarak değerlendiriyor; Scraperly ise bunu orta seviye (3/5) olarak sınıflandırıyor — “Zillow’ın kurumsal WAF’ına göre daha az agresif, özel hız sınırlama ve JavaScript meydan okumalarına dayanıyor.”
Redfin katmanlı bir yapı kullanır: uçta Cloudflare (JS challenge, Turnstile, TLS/JA3 fingerprinting) ve üstte Redfin’e özgü uygulama katmanı hız sınırlayıcı. robots.txt içinde Crawl-delay yoktur; çünkü yaptırım WAF seviyesinde uygulanır.
Neden Basit requests + BeautifulSoup Redfin’de Başarısız Olur?
Varsayılan başlıklarla bir Redfin mülk sayfasına basit bir requests.get() gönderirseniz, genelde şunlardan biri olur:
- HTTP 403 — Cloudflare’ın JS challenge’ı çözülmediği için ilan yerine challenge sayfası gelir.
- Ara challenge sayfası — HTML gövdesinde mülk verisi değil, Cloudflare Turnstile bileşeni vardır.
- Kısmi HTML ile HTTP 200 —
root.__reactServerState.InitialContextaltında büyük bir gömülü JSON bloğu gelir, ama önceden render edilmiş kartlar, fiyat geçmişi ve okul puanları gelmez.
Redfin kendi React SSR çerçevesini kullanır (Next.js değil) ve hydration anahtarı Redfin’e özgüdür — ReactServerAgent.cache.dataCache altında gömülü ilan verileriyle birlikte root.__reactServerState.InitialContext. Bu, __NEXT_DATA__ ya da window.__INITIAL_STATE__ değildir.
Sessiz 403’lerin en yaygın nedeni ne? Eksik Sec-Fetch-* başlıkları. Redfin/Cloudflare özellikle Sec-Fetch-Site, Sec-Fetch-Mode, Sec-Fetch-Dest ve Sec-Fetch-User değerlerini doğrular. Bunlar yoksa anında işaretlenirsiniz.
Azaltma Planı: Gecikmeler, Başlıklar, Proxy’ler ve Oturumlar
İşte tüm savunmaların tek tek dökümü ve her biri için uygulanabilecek çözümler:
| Redfin Savunması | Ne Yapar | Tespit Sinyali | Azaltma Stratejisi |
|---|---|---|---|
| Cloudflare JS challenge | cf_clearance çerezi veren ara sayfa | 403 + Cloudflare HTML gövdesi | impersonate="chrome120" ile curl_cffi; ana sayfa üzerinden oturumu ısıtma; ABD residential proxy |
| Cloudflare Turnstile | Yüksek riskli oturumlarda etkileşimli CAPTCHA | 403 + Turnstile bileşeni | Gizlilik/stealth özellikli headless tarayıcı + residential proxy |
| Cloudflare Hata 1020 (ASN banı) | İşaretlenmiş IP/ASN’leri WAF seviyesinde engeller | 403 gövdesinde "Error 1020 Access Denied" | Residential/mobile proxy’ye geçin; datacenter ASN kullanmayın |
| TLS/JA3 fingerprinting | Tarayıcı olmayan TLS yığınlarını tespit eder | Kusursuz başlıklarla bile sessiz 403 | curl_cffi taklidi veya gerçek tarayıcı |
| HTTP/2 fingerprinting | HTTP/2 SETTINGS ve HPACK sırasını kontrol eder | Sessiz blok | curl_cffi, HTTP/2’yi Chrome gibi konuşur |
| Başlık doğrulama (UA, Sec-Fetch-*) | Tarayıcıyla tutarlı başlık seti | İlk istekte 403 | Sec-Fetch-Site/Mode/Dest/User dahil tam Chrome başlıkları, gerçekçi Referer |
| Çerez/oturum sürekliliği | cf_clearance, RF_BROWSER_ID takibi | Soğuk derin URL erişiminde challenge | Kalıcı Session; önce ana sayfadan ısıtın |
| Uygulama katmanı hız limiti | IP başına istek limiti | 429 | 2–5 saniye gecikme + jitter; üstel geri çekilme |
| Datacenter IP itibarı | Bilinen veri merkezi ASN’lerini engeller | Anında 1020/403 | Sadece ABD residential ya da mobile proxy |
| Eşzamanlılık tespiti | Bir IP’den çoklu paralel istekleri yakalar | Turnstile’ın aniden artması | IP başına en fazla 2 eşzamanlı istek |
Topluluk testlerinden pratik eşikler:
- Güvenli tempo: IP başına 2–3 saniyede 1 istek
- Tek bir datacenter IP’den sürdürülebilir şekilde 20–30 istek/dakikayı aşmak dakikalar içinde challenge tetikler
- Hafif hız limitleri, trafik durursa 5–15 dakika içinde kalkar
- Datacenter IP banları (AWS, GCP, Azure, OVH) saatler hatta günler sürebilir
Standart Python requests (urllib3 + OpenSSL), tarayıcılarla eşleşmeyen bir JA3 fingerprint üretir — bu da kusursuz başlıklarla bile sessizce engellenmesine yol açar. Sektördeki çözüm: Chrome’a uygun TLS + HTTP/2 konuşabilen impersonate="chrome120" ile curl_cffi.
Python ile Redfin Kazımanın Üç Yolu ve Hangisini Seçmeli?

Rakip rehberler arasında üç yaklaşımı yan yana karşılaştıran bir kaynak bulamadım. İşte karar matrisi:
| Kriter | HTML Ayrıştırma (BS4 + Selenium) | Gizli Stingray API | Thunderbit (Kodsuz) |
|---|---|---|---|
| Kurulum zorluğu | Orta (Python ortamı + tarayıcı sürücüsü) | Yüksek (uç noktaları tersine mühendislik) | Düşük (Chrome eklentisi kurulumu) |
| Anti-bot riski | Yüksek (DOM istekleri en görünür olanlardır) | Orta (API benzeri istekler daha temiz görünür) | En düşük (gerçek tarayıcı oturumunuzu kullanır) |
| Veri yapısı kalitesi | Orta (yapısız HTML → manuel ayrıştırma) | Mükemmel (önceden yapılandırılmış JSON) | Yüksek (AI alanları ve türleri otomatik algılar) |
| Bakım yükü | Yüksek — tek bir tasarım değişikliği seçicileri bozar | Orta — uç noktalar habersiz değişebilir | En düşük — AI düzen değişimlerine uyum sağlar |
| Ölçek | Düşük-orta (proxy ile yüzlerce) | Orta-yüksek (binlerce, daha temiz istekler) | Orta (bulut kazıma ile toplu 50 sayfa) |
| En uygun kullanım | Tam kontrol isteyen geliştiriciler | Temiz JSON’a ihtiyacı olan geliştiriciler | Geliştirici olmayanlar, hızlı projeler, sürekli veri ihtiyacı olan ekipler |
Bakım tarafı özellikle önemli. Redfin, iki farklı kart DOM nesli yayınladı — eski (homecardV2Price) ve mevcut (span.bp-Homecard__Price--value). Topluluk GitHub sorun geçmişi, CSS seçici kırılmalarının yaklaşık her 6–12 ayda bir yaşandığını gösteriyor. Bu olduğunda BeautifulSoup kazıyıcısı bir gecede bozulabilir. AI tabanlı alan algılama ise uyum sağlar.
Başlamadan Önce
- Zorluk: Orta (Yöntem 1 & 2), Başlangıç (Yöntem 3)
- Gerekli Süre: Yöntem 1 veya 2 için ~30 dakika; Yöntem 3 için ~5 dakika
- İhtiyacınız Olanlar:
- Python 3.8+ ve pip (Yöntem 1 & 2)
- Chrome tarayıcı (tüm yöntemler)
- Thunderbit Chrome Eklentisi (Yöntem 3)
- Büyük ölçekli kazıma için ABD residential proxy’ler (Yöntem 1 & 2)
Redfin verisini AI ile kazıyın Get Started Free
Yöntem 1: HTML Ayrıştırma Kullanarak Python ile Redfin Kazıma (BeautifulSoup + Selenium)
Bu, “tam kontrol” yoludur. Seçicileri siz yazarsınız, tarayıcıyı siz yönetirsiniz, hataları siz çözersiniz.
En öğretici yaklaşımdır. Aynı zamanda en kırılgan olanıdır.
Adım 1: Python Ortamınızı Kurun
Bir sanal ortam oluşturun ve gerekli kütüphaneleri yükleyin:
python -m venv redfin-scraper
source redfin-scraper/bin/activate # Windows'ta: redfin-scraper\Scripts\activate
pip install requests beautifulsoup4 selenium webdriver-manager pandas curl_cffi
Burada curl_cffi kritik önemdedir — HTTP isteklerinizin, Cloudflare’ın anında blokladığı standart Python requests fingerprint’i yerine gerçek bir Chrome TLS fingerprint’i taklit etmesini sağlar.
Adım 2: Tarayıcı Başlıklarını ve Oturumu Yapılandırın
Yeni başlayanların çoğu burada tökezler. Redfin/Cloudflare’ın açıkça doğruladığı Sec-Fetch-* başlıkları dahil tam Chrome başlık setine ihtiyacınız var:
from curl_cffi import requests as curl_requests
HEADERS = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/120.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Sec-Fetch-Site": "none",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-User": "?1",
}
session = curl_requests.Session(impersonate="chrome120")
session.headers.update(HEADERS)
# Oturumu ısıtın — cf_clearance ve RF_BROWSER_ID çerezlerini toplayın
session.get("https://www.redfin.com/")
Oturumu ısıtma adımı kritik önemdedir — derin bir mülk URL’sine soğuk giriş yapmak (önceki çerezler ve Referer olmadan) Cloudflare tarafından daha düşük puanlanır.
Her zaman ana sayfadan başlayın.
Adım 3: Redfin Arama Sonuçlarını Kazıyın
Oturum ısındıktan sonra, bir şehir arama sayfasını çekip ilan kartlarını ayrıştırabilirsiniz. Güncel nesil seçiciler (2024–2026):
import time
import random
from bs4 import BeautifulSoup
base_url = "https://www.redfin.com/city/17151/CA/San-Francisco"
listings = []
for page_num in range(1, 6): # Sayfa 1-5
url = f"{base_url}/page-{page_num}" if page_num > 1 else base_url
resp = session.get(url)
if resp.status_code != 200:
print(f"{page_num}. sayfada engellendi: HTTP {resp.status_code}")
break
soup = BeautifulSoup(resp.text, "html.parser")
cards = soup.select("[data-rf-test-id='property-card'], a.bp-Homecard")
for card in cards:
price_el = card.select_one("span.bp-Homecard__Price--value")
addr_el = card.select_one("a.bp-Homecard__Address")
stats = card.select("span.bp-Homecard__LockedStat--value")
listing = {
"price": price_el.text.strip() if price_el else None,
"address": addr_el.text.strip() if addr_el else None,
"beds": stats[0].text.strip() if len(stats) > 0 else None,
"baths": stats[1].text.strip() if len(stats) > 1 else None,
"sqft": stats[2].text.strip() if len(stats) > 2 else None,
"url": "https://www.redfin.com" + addr_el["href"] if addr_el else None,
}
listings.append(listing)
# 2-5 saniye arası rastgele gecikme
time.sleep(random.uniform(2, 5))
print(f"{len(listings)} ilan kazındı")
Artık San Francisco’daki her bir ilan için fiyat, adres, oda/banyo/metrekare ve detay URL’sini içeren büyüyen bir sözlük listesi görmelisiniz. 0 kart görürseniz HTTP durum kodunu kontrol edin — 403 varsa Cloudflare sizi yakalamıştır ve büyük olasılıkla residential proxy gerekir.
Adım 4: Tekil Mülk Detay Sayfalarını Kazıyın
Arama sonuçları size temel bilgileri verir. Detay sayfaları ise Redfin Estimate, yapım yılı, site aidatı, satış geçmişi, danışman bilgileri ve fotoğrafları sağlar. Bu sayfalar JavaScript render gerektirir; bu yüzden Selenium’a geçin:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time
options = webdriver.ChromeOptions()
options.add_argument("--headless=new")
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_argument("user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
for listing in listings[:10]: # İlk 10 kaydı zenginleştir
driver.get(listing["url"])
time.sleep(random.uniform(3, 6)) # JS render için bekle
try:
estimate_el = driver.find_element(By.CSS_SELECTOR, "[data-rf-test-name='avmLdpPrice']")
listing["redfin_estimate"] = estimate_el.text.strip()
except:
listing["redfin_estimate"] = None
try:
year_built = driver.find_element(By.XPATH, "//span[contains(text(),'Year Built')]/following-sibling::span")
listing["year_built"] = year_built.text.strip()
except:
listing["year_built"] = None
driver.quit()
Bu adımın sonunda ilk 10 ilanınız Redfin Estimate değerleri ve yapım yılı verileriyle zenginleştirilmiş olmalı. Bu tür gömülü olanak alanlarında XPath seçiciler CSS’ye göre daha dayanıklıdır, ancak yine de kırılgandır — herhangi bir DOM yeniden düzenlemesi bunları bozabilir.
Adım 5: Engelleri ve Hataları Yönetin
Üstel geri çekilme ile yeniden deneme mantığı uygulayın:
import time
def fetch_with_retry(session, url, max_retries=3):
for attempt in range(max_retries):
resp = session.get(url)
if resp.status_code == 200:
return resp
elif resp.status_code in (403, 429, 503):
wait = (2 ** attempt) + random.uniform(1, 3)
print(f"Engellendi ({resp.status_code}). {wait:.1f}s sonra tekrar deneniyor...")
time.sleep(wait)
else:
print(f"Beklenmeyen durum: {resp.status_code}")
break
return None
Engellendiğinizi gösteren işaretler: gövdede Cloudflare HTML ile birlikte HTTP 403, HTTP 429 (açık hız limiti), boş yanıt gövdesi veya sayfa içeriğinde “Error 1020 Access Denied”. Bunlara sürekli takılıyorsanız, artık residential proxy ekleme veya API yaklaşımına geçme zamanı gelmiştir.
Yöntem 2: Gizli Stingray API ile Python Kullanarak Redfin Kazıma
Bu benim favori yaklaşımım. Redfin’in ön yüzü, /stingray/api/home/details/* altında dahili bir JSON API ile konuşur ve yanıtlar temiz, tipli JSON olarak gelir — HTML ayrıştırmaya gerek yoktur.
Redfin’in Gizli API Uç Noktaları Nasıl Bulunur?
Chrome DevTools → Network sekmesi → Fetch/XHR filtresi → herhangi bir Redfin mülk sayfasına gidin. Şu tür uç noktalara istekler görürsünüz:
api/home/details/initialInfo— URL → propertyId, listingId çözümlemesiapi/home/details/aboveTheFold— fiyat, oda, banyo, m², fotoğraflar, durum, danışman, MLS#api/home/details/belowTheFold— olanaklar, aidat, vergiler, otopark, yapım yılı, arsa, geçmişapi/home/details/avm— piyasadaki Redfin Estimateapi/home/details/owner-estimate— piyasada olmayan Redfin Estimateapi/home/details/descriptiveParagraph— pazarlama açıklaması
Kiralık sayfalar için rentalId (36 karakterlik bir UUID), <meta property="og:image"> etiketi URL’sinden çıkarılır.
Stingray API Üzerinden Mülk Verisi Kazıma
Kritik bir ayrıntı var: Stingray JSON yanıtlarının önünde anti-CSRF önlemi olarak gerçek {}&& dizgesi bulunur. Ayrıştırmadan önce bunu kaldırmanız gerekir:
import json
from curl_cffi import requests as curl_requests
session = curl_requests.Session(impersonate="chrome120")
session.headers.update(HEADERS)
# Oturumu ısıt
session.get("https://www.redfin.com/")
# Çerezleri ve property ID'yi almak için mülk sayfasını çek
property_url = "https://www.redfin.com/CA/San-Francisco/123-Main-St-94102/home/12345678"
page_resp = session.get(property_url)
# Stingray API'ye istek at
api_url = "https://www.redfin.com/stingray/api/home/details/aboveTheFold?propertyId=12345678"
api_resp = session.get(api_url, headers={"Referer": property_url})
# Anti-CSRF önekini kaldır
payload = json.loads(api_resp.text.replace("{}&&", "", 1))
# Yapılandırılmış veriyi çıkar
listing_data = payload.get("payload", {})
print(json.dumps(listing_data, indent=2))
Yanıtta tipli alanlar bulunur: fiyat tam sayı olarak, oda/banyo sayısal olarak, fotoğraf URL’leri dizi halinde, danışman bilgileri ise iç içe nesneler şeklindedir. BeautifulSoup yok, CSS seçici yok, tahmin yok.
Gizli API Yaklaşımının Artıları ve Sınırları
Artılar:
- Önceden yapılandırılmış JSON — HTML ayrıştırmaya göre çok daha temiz
- İstek başına daha hızlı (daha küçük yük, render maliyeti yok)
- Daha düşük engellenme riski (doğru başlıklarla API benzeri istekler daha doğal görünür)
Sınırlamalar:
- Uç noktalar habersiz değişebilir — resmi dokümantasyon yoktur
robots.txt, genel kullanıcı ajanı için/stingray/yolunu açıkça yasaklar- Yeni uç noktaları bulmak için tersine mühendislik gerekir
- Cloudflare’dan kaçınmak için yine oturum ısıtma ve doğru başlıklar gerekir
Kodsuz Alternatif: Thunderbit ile Redfin Kazıma
Redfin verisine ihtiyacınız varsa ama Python scriptlerini sürdürmek istemiyorsanız — ya da sadece beş dakika içinde sonuç almak istiyorsanız — buradan başlayın. Thunderbit tam da bunun için geliştirildi: herhangi bir web sitesinden kod yazmadan yapılandırılmış veri çıkarma.
Adım 1: Thunderbit’i Kurun ve Redfin’e Gidin
Chrome Web Store’dan Thunderbit Chrome Eklentisini yükleyin. Redfin’i açın ve bir arama sonuçları sayfasına gidin — örneğin San Francisco satılık evleri.
Adım 2: “AI Suggest Fields”e Tıklayın
Tarayıcı araç çubuğundaki Thunderbit simgesine tıklayın, ardından "AI Suggest Fields" seçeneğini kullanın. Yapay zekâ Redfin sayfasını okuyarak otomatik olarak "Address", "Price", "Beds", "Baths", "SqFt", "Property Type" ve "Listing Photo" gibi sütunlar önerir — veri türleri de doğru şekilde atanır.
İhtiyacınız olmayan sütunları kaldırabilir ya da "+ Add Column" düğmesiyle özel sütunlar ekleyip ne istediğinizi sade İngilizce ile tarif edebilirsiniz (ör. "listing agent name" veya "days on market").
Kurulmuş sütunlarınızla doldurmaya hazır bir tablo önizlemesi görmelisiniz.
Adım 3: “Scrape”e Tıklayın ve Verilerin Akışını İzleyin
"Scrape" düğmesine tıklayın. Thunderbit görünür ilanları işler ve tabloyu doldurur. Sayfalandırılmış sonuçlarda, sayfalama işlemini otomatik olarak yönetir — döngü mantığı yazmanız gerekmez.
Testlerimde 50 satırlık bir tablo yaklaşık 45 saniyede doluyor. Dışa aktarmaya hazır, yapılandırılmış veri.
Thunderbit Redfin’in Anti-Bot Korumasını Nasıl Aşar?
Thunderbit kendi tarayıcınız içinde çalıştığı için mevcut Redfin çerezlerinizi, oturumunuzu ve tarayıcı fingerprint’inizi devralır. Cloudflare için bu, Redfin’de gezen normal bir kullanıcı gibi görünür — çünkü teknik olarak öyledir. Headless tarayıcı yok, datacenter IP yok, uyumsuz TLS fingerprint yok. Halka açık sayfalar için Thunderbit’in bulut kazıma modu aynı anda 50 sayfayı işleyebilir.
Bu, bir sunucudaki Python scriptinden requests fırlatmakla temelden farklı bir yaklaşımdır.
Tarayıcı oturumunuz zaten güvenilir kabul edilir.
Thunderbit ile Redfin Alt Sayfalarını Kazıma
Arama sonuçlarını kazıdıktan sonra "Scrape Subpages" seçeneğine tıklayarak yapay zekânın her mülk detay URL’sine gitmesini ve tablonuzu Redfin Estimate, yapım yılı, site aidatı, danışman bilgileri, mülk fotoğrafları ve satış geçmişi gibi ek alanlarla zenginleştirmesini sağlayın.
Bu, 1. yaklaşımdaki 40 satırlık Selenium döngüsünün karşılığıdır — farkı, tek tıkla ve sıfır bakım ile yapılmasıdır.
Redfin DOM’unu homecardV2Price yerine span.bp-Homecard__Price--value olarak değiştirdiğinde, AI uyum sağlar. Python seçicileriniz ise uyum sağlamaz.
Redfin alt sayfalarını AI ile kazıyın Get Started Free
CSV’nin Ötesinde: Redfin Verisini Google Sheets, Airtable ve Notion’a Aktarma
Çoğu rehber df.to_csv() satırında durur. Tek seferlik analiz için bu yeterlidir. Ama bir emlak ekibindeyseniz, masaüstünde tozlanan statik dosyalar değil; işbirliğine açık, yaşayan verilere ihtiyacınız vardır.
Python ile Dışa Aktarma (gspread + Airtable API)
gspread ile Google Sheets:
import gspread
import pandas as pd
from gspread_dataframe import set_with_dataframe
df = pd.DataFrame(listings)
gc = gspread.service_account(filename="service_account.json")
sh = gc.open("Redfin Listings")
ws = sh.worksheet("Sheet1")
ws.clear()
set_with_dataframe(ws, df, include_index=False, resize=True)
# Mülk fotoğraflarını IMAGE() formülüyle satır içine yerleştir
image_col = df.columns.get_loc("image_url") + 1
for row_idx, url in enumerate(df["image_url"], start=2):
ws.update_cell(row_idx, image_col, f'=IMAGE("{url}")')
Dikkat: Sheets’te çalışma sayfası başına 10 milyon hücre sınırı vardır ve API, proje başına dakikada 300 okuma + 300 yazma isteğine izin verir. Birkaç düzineden fazla satır için hücre hücre döngü yerine ws.batch_update() kullanın.
pyairtable ile Airtable:
Kritik 2024 değişikliği: Airtable 1 Şubat 2024’te eski API anahtarlarını kullanımdan kaldırdı. Artık Personal Access Token (PAT) kullanmanız gerekiyor — hâlâ api_key=... gösteren tüm rehberler bozulmuştur.
from pyairtable import Api
api = Api("patXXXXXXXXXXXXXX.yyyyyyyyyyyyyyyyyyyy")
table = api.table("appBaseId123", "Redfin Listings")
records = [
{
"Address": row["address"],
"Price": row["price"],
"Beds": row["beds"],
"Photo": [{"url": row["image_url"]}], # Airtable çekip kendi CDN'inde barındırır
}
for row in listings
]
created = table.batch_create(records, typecast=True)
Airtable’ın hız limiti base başına saniyede 5 istektir; ihlal edilirse 30 saniyelik kilit uygulanır. Ek dosya alanı [{"url": ...}] yükünü kabul eder — Airtable sunucuları URL’yi çeker, kendi CDN’ine taşır ve küçük görselleri otomatik üretir.
Thunderbit ile Dışa Aktarma (Google Sheets, Airtable, Notion’a Tek Tık)
Thunderbit, Google Sheets, Airtable ve Notion’a yerleşik tek tıkla aktarım sunar — ve gerçekten gurur duyduğum kısmı şu: mülk fotoğrafları Notion ve Airtable içinde satır içi görsel olarak yüklenir ve gösterilir. Ne =IMAGE() formülü hilesi, ne de bozuk CDN bağlantıları. “Export to Airtable”a tıklarsınız ve ekibiniz telefonlarından gezinebileceği küçük görselli bir emlak veritabanına sahip olur.
Görsel öncelikli ilan elemesi yapan emlak ekipleri için bu, kullanışlı bir araç ile CSV satırlarından oluşan bir yığın arasındaki farktır.
Redfin’i Kazımak Yasal mı? ToS, robots.txt ve İçtihatlar Ne Diyor?
Avukat değilim; bu hukuki tavsiye değildir. Ama veri çıkarma alanında yıllar geçirdikten sonra şunu söyleyebilirim: “yasal mı?” sorusunu herkes sorar, çoğu rehber ise kaçınır.
Redfin’in robots.txt Dosyası
Redfin’in robots.txt dosyası oldukça ayrıntılıdır. Öne çıkanlar:
- Tamamen engellenen botlar:
peer39_crawler/1.0,AmazonAdBot,FireCrawlAgent— Redfin, LLM çağındaki popüler kazıma servislerini özellikle isimlendiriyor - Genel
User-agent: *için yasaklanan önemli yollar:/stingray/(iç API alanının tamamı),/myredfin/,/api/v1/rentals/,/api/v1/properties/,/owner-estimate/ - Hiçbir kullanıcı ajanı için
Crawl-delay:yok - 50+ sitemap tanımlı — URL listelemek için en temiz ve WAF dostu yol sitemap’lerdir
Redfin’in Kullanım Şartları
2.3.5 maddesi şöyle der: “Önceden açık yazılı izin almadan, herhangi bir amaçla veya herhangi bir yöntemle Hizmetleri otomatik olarak tarayamaz veya sorgulayamazsınız...”
Bu bir browsewrap sözleşmesidir — kabul, tıklama ile değil kullanıma devam ederek oluşur. ABD mahkemeleri, gerçek bildirim almamış kullanıcılara karşı browsewrap sözleşmelerini uygulama konusunda tarihsel olarak temkinli davranmıştır (bkz. Nguyen v. Barnes & Noble, 9. Cir. 2014).
İlgili İçtihatlar (Kısa)
- Van Buren v. United States (Yüksek Mahkeme, 2021): CFAA’nın “yetkili erişimi aşma” ifadesi için “kapı açık ya da kapalı” testi kullanılır. İstenmeyen bir amaç için açık kapıyı kullanmak federal hackleme sayılmaz.
- hiQ Labs v. LinkedIn (9. Cir., 2022): Kamuya açık veriyi kazımak CFAA ihlali değildir. Ancak hiQ, sözleşme ihlali iddiasıyla sonuçta 500.000 dolar ödedi — çünkü LinkedIn hesabı açmış ve “I agree” demişti.
- Meta Platforms v. Bright Data (N.D. Cal., Ocak 2024): Mahkeme Bright Data lehine özet hüküm verdi — oturum açılmamış halde kamu verisini kazımak, Bright Data’yı Meta’nın ToS’una bağlı bir “kullanıcı” yapmadı.
- X Corp. v. Bright Data (N.D. Cal., Mayıs 2024): Yargıç Alsup, X’in taleplerini reddetti; kamu içeriğinin kopyalanmasını kontrol etmeye çalışan eyalet hukuku iddialarının Telif Hakkı Yasası tarafından bertaraf edildiğine hükmetti.
Pratik Rehber
- Yalnızca herkese açık verileri kazıyın — asla hesap açıp sonra kazımayın (bu, clickwrap sözleşme riskini doğurur)
- Hız limitlerine uyun — agresif hacimler, chattels’a tecavüz iddialarını güçlendirir
- Ham veriyi veya fotoğrafları büyük ölçekte yeniden yayımlamayın — CoStar v. Zillow davası (Temmuz 2025’te açıldı, olası zarar 1 milyar doların üzerinde) fotoğraf telifinin ciddi olduğunu hatırlatıyor
- Thunderbit’in tarayıcı tabanlı yaklaşımı — kendi doğrulanmış oturumunuzda çalışması — başsız bir veri merkezi botundan ziyade “insan gibi manuel gezinmenin makine hızındaki hali”ne daha yakındır; bu da lisanslı API dışında en savunulabilir pozisyondur
İpuçları ve Sık Yapılan Hatalar
Veri çıkarma araçları geliştirirken ve binlerce kullanıcının emlak sitelerini kazımasını izlerken öğrendiğim birkaç zor ders:
- Oturumunuzu mutlaka ısıtın. Herhangi bir derin URL’den önce
redfin.com/adresine gidin. Soğuk derin URL istekleri, Cloudflare challenge’larını en sık tetikleyen sebeptir. - User-Agent dizelerini gerçekçi şekilde döndürün. Tek bir tanesiyle yetinmeyin — 5–10 güncel Chrome/Firefox UA arasında dönüşüm yapın. Ama aşırı agresif döndürmeyin (her istekte farklı UA şüpheli görünür).
- Mülk ID’ye göre tekrarları kaldırın. Redfin’in sayfalandırması zaman zaman üst üste biner. Her ilan URL’sinden
/home/{id}kısmını ayrıştırıp zenginleştirmeden önce deduplikasyon yapın. - Mümkünse yoğun saatlerde kazıma yapmayın. Deneyimlerime göre ABD saatiyle gece geç / sabah erken saatlerde WAF denetimi daha azdır.
- 429 alırsanız üstel geri çekilin. Hemen tekrar denemeyin — hafif hız limitinden sert IP banına böyle geçersiniz.
- Büyük ölçekli projelerde (1.000+ sayfa) residential proxy bütçesi ayırın. Datacenter IP’leri (AWS, GCP, Azure, OVH), Cloudflare’ın ASN itibar sistemi tarafından kara listeye alınmıştır. Neredeyse hemen Error 1020 alırsınız.
Redfin Kazımak İçin Doğru Yöntemi Seçmek
Peki hangi yaklaşımı seçmelisiniz? Bu, kim olduğunuza ve neye ihtiyacınıza bağlı.
HTML Ayrıştırma (BeautifulSoup + Selenium): Tam kontrol isteyen, CSS seçicileri sürdürmeyi göze alan ve Redfin DOM’u değiştiğinde yeniden kurulum yapmaktan çekinmeyen geliştiriciler için en iyisidir. Kodunuzu 6–12 ayda bir gözden geçirmeniz gerekir.
Gizli Stingray API: Temiz, yapılandırılmış JSON isteyen ve belgelenmemiş uç noktaları tersine mühendislikle çözebilen geliştiriciler için en iyisidir. HTML ayrıştırmadan daha az bakım ister; ancak uç noktalar habersiz değişebilir. /stingray/ yolunun robots.txt içinde açıkça yasaklandığını unutmayın.
Thunderbit (Kodsuz): Geliştirici olmayanlar, hızlı projeler ve geliştirici kaynağı olmadan sürekli Redfin verisine ihtiyaç duyan ekipler için en iyisidir. AI düzen değişikliklerine uyum sağlar, alt sayfa kazıma veriyi tek tıkla zenginleştirir ve Google Sheets, Airtable veya Notion’a dışa aktarma yerleşik olarak gelir. Tek seferlik CSV dökümü değil, yaşayan bir mülk veritabanına ihtiyaç duyan bir emlak ekibiyseniz, bu en az sürtünmeli yoldur.
Hangi yolu seçerseniz seçin: başlamadan önce Redfin’in anti-bot savunmalarını anlayın, hangi alanlara ihtiyacınız olduğunu bilin, ekibinizin iş akışına uyan bir dışa aktarma formatı seçin ve hukuki yönergelerin doğru tarafında kalın.
Kodsuz yolu denemeye hazır mısınız? Thunderbit’in ücretsiz planı, Redfin kazımasını test etmenize ve sonuçları dakikalar içinde görmenize olanak tanır. Python yaklaşımları için yukarıdaki kod parçaları çalışır bir başlangıç noktasıdır — sadece proxy ve biraz sabır eklemeniz gerekir.
Sürekli Redfin verisi için Thunderbit'i deneyin
SSS
Redfin’in herkese açık bir API’si var mı?
Hayır. Redfin resmi bir herkese açık API sunmuyor. Gizli Stingray API (/stingray/api/home/details/*) yapılandırılmış JSON döndürür ve Redfin’in kendi ön yüzü tarafından kullanılır; ancak resmî değildir, belgelenmemiştir, habersiz değişebilir ve Redfin’in robots.txt dosyasında açıkça yasaklanmıştır. PyPI üzerindeki reteps/redfin gibi açık kaynak sarmalayıcılar Python erişimi sağlar; fakat risklerini bilerek kullanın.
Redfin’i Python olmadan kazıyabilir miyim?
Evet. Thunderbit anti-bot dayanıklılığı için tarayıcı oturumunuzu devralan bir AI Chrome eklentisidir — kurun, Redfin’e gidin, “AI Suggest Fields”e tıklayın ve veriyi Excel, Google Sheets, Airtable veya Notion’a aktarın. Alternatifleri incelemek isterseniz piyasada başka kodsuz kazıma araçları ve hazır veri seti sağlayıcıları da var.
Redfin web sitesi düzenini ne sıklıkla değiştiriyor?
Topluluk GitHub sorun geçmişi, CSS seçici kırılmalarının yaklaşık her 6–12 ayda bir yaşandığını gösteriyor. Redfin iki farklı kart DOM nesli yayınladı — eski (homecardV2Price, homeAddressV2) ve mevcut (bp-Homecard__Price--value, bp-Homecard__Address). Olgun kazıyıcılar ikisini de sırayla dener.
Thunderbit gibi AI tabanlı araçlar otomatik uyum sağlar çünkü alanları CSS seçiciler yerine içerikten algılar.
Redfin kazımak için en iyi proxy türü hangisi?
Büyük ölçekli kazıma için ABD residential proxy’ler — topluluk benchmark’ları başarı oranını yaklaşık %80 gösteriyor. Datacenter proxy’ler Cloudflare Hata 1020’ye neredeyse anında takılır; AWS, GCP, Azure ve OVH IP aralıkları kara listededir. Mobile proxy’ler en yüksek başarı oranına sahiptir ama maliyeti 5–10 kat daha fazladır.
Küçük ölçekli kişisel kazıma için (<100 sayfa), doğru başlıklar + curl_cffi taklidi + 2–5 saniyelik gecikmeler proxy olmadan da işe yarayabilir.
Redfin’den satılmış veya piyasada olmayan mülk verilerini kazıyabilir miyim?
Evet. Satılmış mülk verileri ve piyasada olmayan Redfin Estimate (ortanca hata 7,52%) aynı kazıma yöntemleriyle detay sayfalarında mevcuttur. Alanlar aktif ilanlardan farklıdır: piyasada olmayan sayfalar satış fiyatını, satış tarihini, mülk geçmişini ve owner-estimate uç noktasını sunar; fakat güncel liste fiyatı, piyasada kalma süresi ve açık ev bilgisi içermez. Piyasada olmayan tahminler için Stingray API uç noktası api/home/details/avm değil api/home/details/owner-estimate’tır.
Redfin kazıma için Thunderbit'i deneyin Get Started Free
Daha Fazla Bilgi


