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

Web scraping data properti adalah cara platform properti, investor, dan tim proptech mengubah listing online yang tersebar menjadi dataset terstruktur: harga, alamat, jumlah kamar tidur, kamar mandi, luas bangunan, dan tren di seluruh pasar. Panduan ini menunjukkan cara melakukan web scraping listing properti dengan Python secara andal, yaitu dengan mengurai data terstruktur yang sudah disematkan situs, serta menyiapkan anti-bot dan proxy agar pengumpulan data tetap berjalan di berbagai wilayah.

Saya Andrii Byzov, seorang CMO paruh waktu yang berfokus pada AI dan membangun pipeline data web. Berikut ini: data properti yang dapat Anda kumpulkan, batasan hukum yang jelas, dan kode yang berfungsi untuk hasil pencarian serta listing individual, dengan proxy residential untuk data yang akurat secara geografis dan tidak diblokir.


Fakta Utama

  • Sebagian besar fakta listing bersifat publik dan berisiko lebih rendah: harga, jumlah kamar tidur/kamar mandi, sqft, tipe, tetapi alamat, foto, deskripsi, dan nama agen dapat bersifat pribadi atau dilindungi hak cipta, jadi lakukan penilaian sebelum digunakan kembali.
  • Uraikan JSON yang disematkan bila tersedia, bukan CSS yang rapuh. Banyak situs web properti menyajikan data listing sebagai JSON-LD (schema.org); uraikan data tersebut jika tersedia dan gunakan kartu HTML sebagai alternatif jika tidak tersedia.
  • Beberapa situs melakukan personalisasi berdasarkan lokasi: hasil, ketersediaan, bahasa, atau mata uang, sehingga proxy dengan geo-targeting membantu menyesuaikan dengan pasar tertentu.
  • Portal besar memiliki pertahanan ketat. Zillow, Realtor.com, Rightmove, dan situs serupa cepat membatasi laju akses serta menandai IP datacenter; proxy residential rotating membantu, tetapi tidak ada alat yang menjamin akses atau kepatuhan.
  • Detail kontak agen dan pemilik adalah data pribadi. Jangan masukkan data tersebut ke dalam pipeline; kumpulkan fakta properti, bukan data tentang orang.

Data Real Estate Apa yang Dapat Anda Kumpulkan dengan Web Scraping?

Listing properti merupakan data terstruktur yang kaya. Berikut bidang yang umumnya layak dikumpulkan, serta yang perlu ditangani dengan hati-hati:

  • Fakta properti berisiko lebih rendah: harga, jumlah kamar tidur, kamar mandi, luas bangunan, luas tanah, jenis properti, tahun pembangunan, status listing, jumlah hari di pasar, dan riwayat harga.
  • Tangani dengan hati-hati atau hindari: alamat lengkap, foto, dan deskripsi lengkap (sering kali dilindungi hak cipta), serta detail kontak agen/pemilik (data pribadi). Ketersediaan secara publik tidak otomatis membuat data ini dapat digunakan kembali.

Apakah Web Scraping Real Estate Legal?

Mengumpulkan fakta properti publik pada umumnya dapat dipertahankan secara hukum, dan inilah cara analisis intelijen harga serta proptech bekerja, tetapi ketersediaan publik tidak otomatis menjadikan data bersifat nonpribadi atau dapat digunakan kembali: nilai privasi, hak cipta, hak database, kontrak, dan hukum setempat. Batasan praktisnya: jangan melakukan scraping di balik login, jangan masukkan data pribadi (detail agen/pemilik), jangan menerbitkan ulang foto atau deskripsi berhak cipta, patuhi ketentuan setiap situs dan robots.txt, serta jangan menghindari kontrol akses atau CAPTCHA. Portal besar membatasi akses otomatis, jadi untuk situs tersebut gunakan API resmi, umpan data berlisensi, atau izin tertulis. Untuk kerangka lengkapnya, lihat panduan kami tentang legalitas web scraping. Ini adalah informasi umum, bukan nasihat hukum.


Langkah 1: Siapkan Lingkungan Anda

Instal library yang diperlukan scraper properti. Situs statis yang mendukung JSON-LD dapat menggunakan requests; portal yang banyak menggunakan JavaScript seperti Zillow memerlukan browser tanpa antarmuka.



# 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







Langkah 2: Ambil Halaman Listing

Ambil halaman hasil pencarian (URL rumah dijual di suatu kota) dengan header yang tepat, melalui proxy residential agar listing sesuai dengan pasar target.



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/")
















Langkah 3: Ekstrak Listing dari JSON yang Disematkan

Jika tersedia, cara paling andal untuk melakukan web scraping listing properti adalah membaca data terstruktur yang sudah disematkan situs. Banyak platform properti menyertakan application/ld+json (schema.org) yang memuat harga, alamat, dan URL listing, sehingga tetap stabil saat desain diperbarui, tidak seperti nama kelas CSS. Tidak setiap situs menyajikannya (sebagian menyimpan data dalam keadaan aplikasi JS), jadi periksa satu per satu dan gunakan penguraian kartu pada Langkah 4 sebagai alternatif.



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])









































Langkah 4: Uraikan Kartu Listing (Alternatif)

Saat situs tidak menyajikan JSON-LD yang bersih, uraikan langsung kartu hasil pencarian: harga, alamat, jumlah kamar tidur, kamar mandi, sqft, dan tautan listing. Pemilih berbeda pada tiap situs dan sering berubah, jadi pastikan kembali di DevTools.



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


















Langkah 5: Tangani Paginasi

Satu halaman hasil bukanlah dataset. Telusuri halaman demi halaman hingga hasil habis atau mencapai batas, dan atur jeda request agar tidak memicu pembatasan laju akses.



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













Langkah 6: Gunakan Proxy untuk Data yang Akurat secara Geografis dan Tidak Diblokir

Dua hal membuat web scraping properti lebih sulit tanpa proxy. Pertama, lokasi: beberapa situs mempersonalisasi hasil, ketersediaan, bahasa, atau mata uang berdasarkan wilayah, sehingga untuk mencocokkan pasar tertentu Anda perlu melakukan kueri dari IP di wilayah tersebut. Kedua, pemblokiran: portal besar cepat menandai IP datacenter dan membatasi laju akses secara agresif. proxy residential DataImpulse ($1/GB, rotating, 195 negara dengan penargetan kota/provinsi) membantu untuk keduanya: IP pengguna nyata di pasar yang tepat mengurangi pemblokiran berbasis IP, meskipun akses tidak dijamin dan Anda tetap harus mematuhi aturan setiap situs. Arahkan request melaluinya dan ekspor data yang telah Anda kumpulkan.



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)

















Pertanyaan yang Sering Diajukan

Apakah web scraping data properti legal?

Mengumpulkan data properti publik yang nonpribadi (harga, alamat, jumlah kamar tidur, sqft) pada umumnya dapat dipertahankan secara hukum dan lazim dalam proptech. Hindari data pribadi (kontak agen/pemilik), jangan melakukan scraping di balik login, jangan menerbitkan ulang foto atau deskripsi berhak cipta, serta patuhi ketentuan situs dan robots.txt. Portal besar membatasi akses otomatis, jadi dapatkan izin atau nasihat hukum untuk penggunaan komersial. Ini adalah informasi umum, bukan nasihat hukum. Lihat panduan legalitas web scraping kami.

Apa cara terbaik untuk melakukan web scraping listing properti?

Uraikan data terstruktur yang sudah disematkan situs. Sebagian besar platform properti menyajikan listing sebagai JSON-LD (schema.org) dalam HTML halaman, yang jauh lebih stabil daripada mengikuti nama kelas CSS yang berubah pada setiap desain ulang. Gunakan penguraian kartu listing sebagai alternatif hanya jika tidak ada JSON yang bersih.

Apakah saya memerlukan proxy untuk melakukan web scraping situs properti?

Untuk volume besar, biasanya ya. Portal besar (Zillow, Realtor.com, Rightmove) cepat membatasi laju akses dan menandai IP datacenter, sementara beberapa listing bergantung pada lokasi. Proxy residential rotating di pasar target membantu mengembalikan data yang akurat berdasarkan lokasi dan mengurangi pemblokiran berbasis IP, meskipun tidak menjamin akses atau membuat web scraping menjadi patuh.

Dapatkah saya melakukan web scraping Zillow atau Realtor.com secara langsung?

Situs tersebut bersifat publik, tetapi pertahanannya ketat, dirender dengan JavaScript, dan ketentuannya membatasi akses otomatis. Untuk portal tersebut, gunakan API resmi, feed data berlisensi, atau izin tertulis, alih-alih menghindari pertahanannya. Jika Anda mengumpulkan data publik, ambil hanya fakta properti publik, tetap logout, jangan melewati kontrol akses, dan atur jeda request. Lihat panduan proxy terbaik untuk Zillow kami.

Data properti apa yang dapat saya kumpulkan?

Sebagian besar berupa fakta properti publik: harga, jumlah kamar tidur, kamar mandi, luas bangunan, luas tanah, tipe, status, jumlah hari di pasar, dan riwayat harga. Namun, ketersediaan publik tidak otomatis menjadikan data nonpribadi atau dapat digunakan kembali: alamat lengkap, foto, deskripsi, serta detail agen/pemilik dapat mengandung implikasi privasi atau hak cipta, jadi lakukan penilaian sebelum menyimpan atau menerbitkan ulang.


Kesimpulan

Web scraping data properti mengubah listing yang tersebar menjadi dataset yang dapat digunakan. Resep andalnya adalah membaca JSON-LD yang disematkan bila tersedia, menggunakan penguraian kartu bila tidak tersedia, menelusuri seluruh halaman hasil, dan mengarahkan semuanya melalui proxy residential dengan geo-targeting agar data akurat berdasarkan lokasi dan tidak diblokir. Batasi diri pada fakta properti yang publik dan nonpribadi agar tetap berada dalam batas yang dapat dipertahankan. Untuk infrastrukturnya, lihat proxy terbaik untuk data properti dan panduan yang lebih luas tentang proxy terbaik untuk web scraping.

Terakhir diperbarui: 25 Juni 2026.



Share article: