Real estate data scraping - collect property listings with Python and proxies - DataImpulse
  • Published:
  • Last Updated:
  • Genel
  • 6 min read

Emlak verisi kazıma, gayrimenkul platformlarının, yatırımcıların ve proptech ekiplerinin dağınık çevrimiçi ilanları fiyatlar, adresler, yatak odaları, banyolar, metrekareler ve tüm pazardaki eğilimlerden oluşan yapılandırılmış bir veri kümesine dönüştürmesidir. Bu rehber, gayrimenkul ilanlarını Python ile sağlam biçimde nasıl kazıyacağınızı, sitelerin zaten gömdüğü yapılandırılmış verileri ayrıştırmayı ve farklı bölgelerde toplamayı sürdüren anti-bot ve proxy kurulumunu gösterir.

Ben, web verisi pipeline’ları oluşturan AI-Native Fractional CMO Andrii Byzov. Aşağıda şunları bulacaksınız: toplayabileceğiniz emlak verileri, net bir hukuki sınır ve arama sonuçlarıyla tek tek ilanlar için çalışan kodlar. Bunların yanında, coğrafi olarak doğru ve engellenmemiş veriler için residential proxy’ler de var.


Temel Bilgiler

  • İlan bilgilerinin çoğu herkese açıktır ve daha düşük risklidir: fiyat, yatak odası/banyo, sqft, tür. Ancak adresler, fotoğraflar, açıklamalar ve emlakçı adları kişisel veri veya telifli olabilir; yeniden kullanmadan önce değerlendirin.
  • Varsa kırılgan CSS yerine gömülü JSON’u ayrıştırın. Birçok emlak sitesi ilan verilerini JSON-LD (schema.org) olarak sunar; mevcut olduğunda bunu ayrıştırın, olmadığında HTML kartlarına geri dönün.
  • Bazı siteler konuma göre kişiselleştirme yapar: sonuçlar, kullanılabilirlik, dil veya para birimi. Bu nedenle coğrafi hedefli proxy’ler belirli bir pazara uygun sonuçlar elde etmenize yardımcı olur.
  • Büyük portallar güçlü savunmalar kullanır. Zillow, Realtor.com, Rightmove ve benzerleri datacenter IP’leri hızla hız sınırına takar ve işaretler; dönen residential proxy’ler yardımcı olur, ancak hiçbir araç erişimi veya kurallara uyumu garanti etmez.
  • Emlakçı ve mülk sahibi iletişim bilgileri kişisel veridir. Bunları pipeline’ın dışında tutun; insanlar hakkında değil, gayrimenkul hakkında bilgi toplayın.

Hangi Emlak Verilerini Kazıyabilirsiniz?

Bir gayrimenkul ilanı zengin ve yapılandırılmış bir veridir. Genellikle toplamaya değer alanlar ve dikkatle ele alınması gerekenler şunlardır:

  • Daha düşük riskli gayrimenkul bilgileri: fiyat, yatak odası sayısı, banyo sayısı, metrekare, arsa büyüklüğü, gayrimenkul türü, yapım yılı, ilan durumu, piyasada kalınan gün sayısı ve fiyat geçmişi.
  • Dikkatle ele alın veya kaçının: kesin adresler, fotoğraflar ve tam açıklamalar (çoğunlukla teliflidir) ile emlakçıların/mülk sahiplerinin iletişim bilgileri (kişisel veri). Herkese açık olması, bu veriyi otomatik olarak yeniden kullanılabilir yapmaz.

Emlak Kazıma Yasal mı?

Herkese açık gayrimenkul bilgilerini toplamak genel olarak savunulabilir bir uygulamadır; fiyat istihbaratı ve proptech bu şekilde çalışır. Ancak verinin herkese açık olması, onu otomatik olarak kişisel olmayan veya yeniden kullanılabilir veri yapmaz: gizlilik, telif hakkı, veritabanı hakları, sözleşmeler ve yerel hukuku değerlendirin. Pratik sınır şudur: oturum açmanın arkasındaki verileri kazımayın, kişisel verileri (emlakçı/mülk sahibi bilgileri) dışarıda bırakın, telifli fotoğrafları veya açıklamaları yeniden yayımlamayın, her sitenin koşullarına ve robots.txt dosyasına uyun, erişim kontrollerini ya da CAPTCHA’ları aşmaya çalışmayın. Büyük portallar otomatik erişimi kısıtlar; bu nedenle onlar için resmi bir API, lisanslı veri akışı veya yazılı izin tercih edin. Kapsamlı çerçeve için web scraping’in yasal olup olmadığı rehberimize bakın. Bu metin genel bilgilendirme amaçlıdır, hukuki tavsiye değildir.


Adım 1: Ortamınızı Kurun

Emlak kazıyıcının ihtiyaç duyduğu kütüphaneleri kurun. Statik, JSON-LD uyumlu siteler requests ile çalışır; Zillow gibi JavaScript ağırlıklı portallar için headless bir tarayıcı gerekir.



# Core libraries for real estate data scraping
# requests -> fetch pages | beautifulsoup4 + lxml -> parse HTML/JSON
pip install requests beautifulsoup4 lxml

# Many listing sites are JavaScript-heavy and well defended (e.g. Zillow).
# For those, add a headless browser:
pip install playwright && playwright install chromium







Adım 2: İlanlar Sayfasını Getirin

İlanların hedef pazara uygun olması için doğru HTTP headers kullanarak ve residential proxy üzerinden yönlendirerek bir arama sonuçları sayfasını, yani bir şehrin satılık evler URL’sini alın.



import requests

HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                         "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
           "Accept-Language": "en-US,en;q=0.9"}

# Route through residential proxies for geo-accurate listings (see Step 5)
proxies = {"http":  "http://LOGIN:[email protected]:823",
           "https": "http://LOGIN:[email protected]:823"}

def get_html(url):
    r = requests.get(url, headers=HEADERS, proxies=proxies, timeout=30)
    r.raise_for_status()
    return r.text

html = get_html("https://example-realestate.com/homes/for_sale/CityName/")
















Adım 3: Gömülü JSON’dan İlanları Çıkarın

Mevcut olduğunda gayrimenkul ilanlarını kazımanın en güvenilir yolu, sitenin zaten gömdüğü yapılandırılmış verileri okumaktır. Birçok emlak platformu, bir ilanın fiyatını, adresini ve URL’sini içeren application/ld+json (schema.org) verisini kullanır; bu veri, yeniden tasarımlarla değişen CSS sınıf adlarının aksine stabildir. Her site bunu sunmaz, bazıları veriyi JS uygulama durumunda tutar; bu nedenle her birini kontrol edin ve Adım 4’teki kartları ayrıştırmaya geri dönün.



import json
from bs4 import BeautifulSoup

LISTING_TYPES = ("Residence", "Product", "RealEstateListing", "Offer",
                 "SingleFamilyResidence", "Apartment", "House")

def listings_from_jsonld(html):
    """Where available, sites embed listing data as JSON-LD (schema.org).
    Parsing it is more stable than CSS classes — but not every site has it,
    so fall back to the cards in Step 4 when this returns nothing."""
    soup = BeautifulSoup(html, "lxml")
    nodes, out = [], []
    for tag in soup.find_all("script", type="application/ld+json"):
        try:
            data = json.loads(tag.string or "{}")
        except json.JSONDecodeError:
            continue
        stack = data if isinstance(data, list) else [data]
        while stack:                      # flatten @graph / ItemList / nested
            n = stack.pop()
            if not isinstance(n, dict):
                continue
            if "@graph" in n:
                stack.extend(n["@graph"])
            if n.get("@type") == "ItemList":
                stack.extend(x.get("item", x) for x in n.get("itemListElement", []))
            nodes.append(n)
    for n in nodes:
        types = n.get("@type", "")
        types = types if isinstance(types, list) else [types]
        if any(t in LISTING_TYPES for t in types):
            offers = n.get("offers") or {}
            if isinstance(offers, list):
                offers = offers[0] if offers else {}
            out.append({"name": n.get("name"),
                        "price": offers.get("price") or n.get("price"),
                        "address": n.get("address"),
                        "url": n.get("url")})
    return out

print(listings_from_jsonld(html)[:3])









































Adım 4: İlan Kartlarını Ayrıştırın (Geri Dönüş)

Bir site temiz JSON-LD sunmadığında arama sonucu kartlarını doğrudan ayrıştırın: fiyat, adres, yatak odaları, banyolar, sqft ve ilan bağlantısı. Seçiciler siteye göre değişir ve sık sık güncellenir; bu yüzden DevTools’ta doğrulayın.



def parse_listing_cards(html):
    """Fallback: parse the search-results cards directly. Selectors differ by
    site and change often — confirm the current ones in DevTools."""
    soup = BeautifulSoup(html, "lxml")
    cards = []
    for card in soup.select("[data-test='property-card']"):
        def t(sel):
            el = card.select_one(sel)
            return el.get_text(strip=True) if el else None
        cards.append({
            "price":   t("[data-test='property-price']"),
            "address": t("[data-test='property-address']"),
            "beds":    t("[data-test='property-beds']"),
            "baths":   t("[data-test='property-baths']"),
            "sqft":    t("[data-test='property-sqft']"),
            "url":     (card.select_one("a[href]") or {}).get("href"),
        })
    return cards


















Adım 5: Sayfalamayı Yönetin

Tek bir sonuç sayfası veri kümesi değildir. Sonuçlar bitene veya sınıra ulaşana kadar sayfalar arasında döngü kurun; hız sınırına takılmamak için istekleri uygun aralıklarla gönderin.



import time, random

def scrape_all_pages(base_url, max_pages=10):
    """Page through search results until empty or max_pages."""
    all_listings = []
    for page in range(1, max_pages + 1):
        html = get_html(f"{base_url}?page={page}")
        cards = parse_listing_cards(html)
        if not cards:        # no more results -> stop
            break
        all_listings.extend(cards)
        time.sleep(random.uniform(1, 3))   # pace requests
    return all_listings













Adım 6: Coğrafi Olarak Doğru, Engellenmemiş Veriler için Proxy Kullanın

Proxy olmadan emlak web scraping’ini zorlaştıran iki unsur vardır. Birincisi konumdur: bazı siteler sonuçları, kullanılabilirliği, dili veya para birimini bölgeye göre kişiselleştirir; belirli bir pazara uygun sonuçlar için o konumdaki bir IP’den sorgu yaparsınız. İkincisi engellemedir: büyük portallar datacenter IP’leri hızla işaretler ve agresif hız sınırları uygular. DataImpulse residential proxy’leri ($1/GB, dönen, şehir/eyalet hedeflemeli 195 ülke) her ikisine de yardımcı olur. Doğru pazardaki gerçek kullanıcı IP’leri IP tabanlı engelleri azaltır; ancak erişim garanti edilmez ve yine de her sitenin kurallarına uymalısınız. İstekleri bunlar üzerinden yönlendirin ve topladığınız verileri dışa aktarın.



import time, random, json, csv

# Listings differ by region: route through a proxy in the target market so
# prices, availability, and currency match what a local user sees.
proxies = {
    "http":  "http://LOGIN__cr.us;sid.re1:[email protected]:823",
    "https": "http://LOGIN__cr.us;sid.re1:[email protected]:823",
}

listings = scrape_all_pages("https://example-realestate.com/homes/for_sale/CityName/")

with open("listings.json", "w", encoding="utf-8") as f:
    json.dump(listings, f, indent=2, ensure_ascii=False)
if listings:
    with open("listings.csv", "w", newline="", encoding="utf-8") as f:
        w = csv.DictWriter(f, fieldnames=listings[0].keys())
        w.writeheader(); w.writerows(listings)

















Sık Sorulan Sorular

Emlak verisi kazıma yasal mı?

Herkese açık, kişisel olmayan gayrimenkul verilerini (fiyat, adres, yatak odası, sqft) toplamak genel olarak savunulabilir ve proptech alanında standarttır. Kişisel verilerden (emlakçı/mülk sahibi iletişim bilgileri) kaçının, oturum açmanın arkasındaki verileri kazımayın, telifli fotoğrafları veya açıklamaları yeniden yayımlamayın ve site koşullarıyla robots.txt dosyasına uyun. Büyük portallar otomatik erişimi kısıtlar; bu nedenle ticari kullanım için izin alın veya hukuki danışmanlık alın. Bu metin genel bilgilendirme amaçlıdır, hukuki tavsiye değildir. Web scraping yasallığı rehberimize bakın.

Gayrimenkul ilanlarını kazımanın en iyi yolu nedir?

Sitelerin zaten gömdüğü yapılandırılmış verileri ayrıştırın. Çoğu emlak platformu ilanları sayfa HTML’sinde JSON-LD (schema.org) olarak sunar; bu, her yeniden tasarımda değişen CSS sınıf adlarını takip etmekten çok daha stabildir. Yalnızca temiz bir JSON mevcut olmadığında ilan kartlarını ayrıştırmaya geri dönün.

Emlak sitelerini kazımak için proxy’ye ihtiyacım var mı?

Yüksek hacim için genellikle evet. Büyük portallar (Zillow, Realtor.com, Rightmove) datacenter IP’leri hızla hız sınırına takar ve işaretler; bazı ilanlar da konuma bağlıdır. Hedef pazardaki dönen residential proxy’ler konuma doğru verilerin dönmesine yardımcı olur ve IP tabanlı engelleri azaltır; ancak erişimi garanti etmez veya kazımayı kurallara uygun hâle getirmez.

Zillow veya Realtor.com’u doğrudan kazıyabilir miyim?

Herkese açıktırlar ancak güçlü biçimde korunurlar, JavaScript ile render edilirler ve koşulları otomatik erişimi kısıtlar. Bu portallar için savunmalarını aşmaya çalışmak yerine resmi bir API, lisanslı veri akışı veya yazılı izin tercih edin. Herkese açık veri topluyorsanız yalnızca herkese açık gayrimenkul bilgilerini alın, oturum açmayın, erişim kontrollerini aşmayın ve istekleri uygun aralıklarla gönderin. Zillow için en iyi proxy’ler rehberimize bakın.

Hangi emlak verilerini toplayabilirim?

Çoğunlukla herkese açık gayrimenkul bilgileri: fiyat, yatak odaları, banyolar, metrekare, arsa büyüklüğü, tür, durum, piyasada kalınan gün sayısı ve fiyat geçmişi. Ancak herkese açık olması veriyi otomatik olarak kişisel olmayan veya yeniden kullanılabilir veri yapmaz: kesin adresler, fotoğraflar, açıklamalar ve emlakçı/mülk sahibi bilgileri gizlilik veya telif bakımından önem taşıyabilir; bu nedenle saklamadan veya yeniden yayımlamadan önce değerlendirin.


Sonuç

Emlak verisi kazıma, dağınık ilanları kullanılabilir bir veri kümesine dönüştürür. Güvenilir yaklaşım şudur: mümkün olduğunda gömülü JSON-LD’yi okuyun, mümkün olmadığında kartları ayrıştırmaya geri dönün, sonuç sayfaları arasında ilerleyin ve verilerin konuma doğru ve engellenmemiş olması için her şeyi coğrafi hedefli residential proxy’ler üzerinden yönlendirin. Herkese açık, kişisel olmayan gayrimenkul bilgileriyle sınırlı kalırsanız savunulabilir bir çizgide kalırsınız. Altyapı için emlak verileri için en iyi proxy’ler ve daha kapsamlı web scraping için en iyi proxy’ler rehberlerine bakın.

Son güncelleme: 25 Haziran 2026.



Share article: