Real estate data scraping - collect property listings with Python and proxies - DataImpulse

Beim Scraping von Immobiliendaten verwandeln Immobilienplattformen, Investoren und Proptech-Teams verstreute Online-Anzeigen in einen strukturierten Datensatz: Preise, Adressen, Schlafzimmer, Badezimmer, Wohnflächen und Trends in einem gesamten Markt. Dieser Leitfaden zeigt, wie Sie Immobilienanzeigen mit Python robust scrapen, indem Sie die bereits eingebetteten strukturierten Daten parsen, und welche Anti-Bot- und Proxy-Konfiguration die Datenerfassung über Regionen hinweg am Laufen hält.

Ich bin Andrii Byzov, ein AI-Native Fractional CMO, der Webdaten-Pipelines entwickelt. Im Folgenden erfahren Sie, welche Immobiliendaten Sie erfassen können, wo die rechtliche Grenze verläuft und wie funktionierender Code für Suchergebnisse und einzelne Anzeigen aussieht, mit Residential Proxys für geografisch präzise, ungesperrte Daten.


Wichtige Fakten

  • Die meisten Fakten aus Immobilienanzeigen sind öffentlich und mit geringerem Risiko verbunden: Preis, Schlafzimmer/Badezimmer, sqft und Typ. Adressen, Fotos, Beschreibungen und Maklernamen können jedoch personenbezogen oder urheberrechtlich geschützt sein. Prüfen Sie dies daher vor einer Wiederverwendung.
  • Parsen Sie eingebettetes JSON, sofern vorhanden, statt anfälligem CSS. Viele Immobilienseiten stellen Anzeigendaten als JSON-LD (schema.org) bereit. Parsen Sie diese Daten, wenn sie verfügbar sind, und greifen Sie andernfalls auf die HTML-Karten zurück.
  • Manche Websites personalisieren nach Standort: Ergebnisse, Verfügbarkeit, Sprache oder Währung. Geografisch ausgerichtete Proxys helfen daher, einen bestimmten Markt passend abzubilden.
  • Große Portale schützen sich stark. Zillow, Realtor.com, Rightmove und ähnliche Portale begrenzen Anfragen und markieren Rechenzentrums-IP-Adressen schnell. Rotierende Residential Proxys helfen, doch kein Tool garantiert Zugang oder Compliance.
  • Kontaktangaben von Maklern und Eigentümern sind personenbezogene Daten. Halten Sie sie aus der Pipeline heraus: Erfassen Sie Fakten zu Immobilien, nicht zu Personen.

Welche Immobiliendaten können Sie scrapen?

Eine Immobilienanzeige enthält umfangreiche, strukturierte Daten. Diese Felder sind in der Regel relevant und sollten unterschiedlich sorgfältig behandelt werden:

  • Immobilienfakten mit geringerem Risiko: Preis, Schlafzimmer, Badezimmer, Wohnfläche, Grundstücksgröße, Immobilientyp, Baujahr, Anzeigenstatus, Tage am Markt und Preisverlauf.
  • Vorsichtig behandeln oder vermeiden: genaue Adressen, Fotos und vollständige Beschreibungen, die häufig urheberrechtlich geschützt sind, sowie Kontaktangaben von Maklern/Eigentümern, die personenbezogene Daten darstellen. Die öffentliche Verfügbarkeit macht diese Daten nicht automatisch wiederverwendbar.

Ist das Scraping von Immobiliendaten legal?

Das Erfassen öffentlicher Immobilienfakten ist grundsätzlich gut vertretbar und bildet die Grundlage für Preisanalysen und Proptech. Die öffentliche Verfügbarkeit macht Daten jedoch nicht automatisch unpersonenbezogen oder wiederverwendbar: Prüfen Sie Datenschutz, Urheberrecht, Datenbankrechte, Verträge und lokale Gesetze. Praktisch heißt das: Scrapen Sie nicht hinter einem Login, halten Sie personenbezogene Daten wie Makler- oder Eigentümerangaben heraus, veröffentlichen Sie keine urheberrechtlich geschützten Fotos oder Beschreibungen erneut, beachten Sie die Nutzungsbedingungen jeder Website und robots.txt und umgehen Sie keine Zugangskontrollen oder CAPTCHAs. Große Portale beschränken den automatisierten Zugriff. Bevorzugen Sie dort daher eine offizielle API, einen lizenzierten Datenfeed oder eine schriftliche Genehmigung. Den vollständigen Rahmen finden Sie in unserem Leitfaden dazu, ob Web Scraping legal ist. Dies sind allgemeine Informationen und keine Rechtsberatung.


Schritt 1: Umgebung einrichten

Installieren Sie die Bibliotheken, die der Immobilien-Scraper benötigt. Statische, JSON-LD-freundliche Websites funktionieren mit requests; JavaScript-lastige Portale wie Zillow benötigen einen Headless-Browser.



# 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







Schritt 2: Eine Anzeigenseite abrufen

Rufen Sie eine Suchergebnisseite, also die URL für zum Verkauf stehende Häuser einer Stadt, mit passenden Headern ab und leiten Sie sie über einen Residential Proxy, damit die Anzeigen dem Zielmarkt entsprechen.



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
















Schritt 3: Anzeigen aus eingebettetem JSON extrahieren

Wenn verfügbar, ist das Auslesen der strukturierten Daten, die die Website bereits einbettet, die zuverlässigste Methode zum Scrapen von Immobilienanzeigen. Viele Immobilienplattformen enthalten application/ld+json (schema.org) mit Preis, Adresse und URL einer Anzeige. Anders als CSS-Klassennamen bleibt dies bei Redesigns stabil. Nicht jede Website legt diese Daten offen, manche halten sie im JS-App-Status. Prüfen Sie daher jede Website und greifen Sie bei Bedarf auf das Parsen der Karten in Schritt 4 zurück.



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









































Schritt 4: Die Anzeigenkarten parsen (Fallback)

Wenn eine Website kein sauberes JSON-LD bereitstellt, parsen Sie die Suchergebniskarten direkt: Preis, Adresse, Schlafzimmer, Badezimmer, sqft und den Link zur Anzeige. Selektoren unterscheiden sich je nach Website und ändern sich häufig. Prüfen Sie sie daher in 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


















Schritt 5: Paginierung behandeln

Eine Ergebnisseite ist noch kein Datensatz. Durchlaufen Sie die Seiten, bis keine Ergebnisse mehr vorliegen oder Sie ein Limit erreichen, und takten Sie die Anfragen so, dass Sie keine Rate Limits auslösen.



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













Schritt 6: Proxys für geografisch präzise, ungesperrte Daten einsetzen

Ohne Proxys wird Web Scraping für Immobiliendaten aus zwei Gründen schwieriger. Erstens der Standort: Manche Websites personalisieren Ergebnisse, Verfügbarkeit, Sprache oder Währung nach Region. Um einen bestimmten Markt abzubilden, fragen Sie daher über eine IP-Adresse von dort ab. Zweitens Sperren: Große Portale markieren Rechenzentrums-IP-Adressen schnell und begrenzen Anfragen aggressiv. DataImpulse Residential Proxys ($1/GB, rotierend, 195 Länder mit Ausrichtung auf Stadt/Bundesstaat) helfen bei beidem: IP-Adressen echter Nutzer im richtigen Markt reduzieren IP-basierte Sperren. Der Zugriff ist dennoch nicht garantiert, und Sie müssen weiterhin die Regeln jeder Website befolgen. Leiten Sie Anfragen über diese Proxys und exportieren Sie die erfassten Daten.



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)

















Häufig gestellte Fragen

Ist das Scraping von Immobiliendaten legal?

Das Erfassen öffentlicher, nicht personenbezogener Immobiliendaten wie Preis, Adresse, Schlafzimmer und sqft ist grundsätzlich gut vertretbar und im Proptech-Bereich üblich. Vermeiden Sie personenbezogene Daten wie Kontaktangaben von Maklern oder Eigentümern, scrapen Sie nicht hinter Logins, veröffentlichen Sie keine urheberrechtlich geschützten Fotos oder Beschreibungen erneut und beachten Sie die Nutzungsbedingungen der Website sowie robots.txt. Große Portale beschränken den automatisierten Zugriff. Holen Sie für eine kommerzielle Nutzung daher eine Genehmigung ein oder lassen Sie sich rechtlich beraten. Dies sind allgemeine Informationen und keine Rechtsberatung. Siehe unseren Leitfaden zur Rechtmäßigkeit von Web Scraping.

Wie lassen sich Immobilienanzeigen am besten scrapen?

Parsen Sie die strukturierten Daten, die Websites bereits einbetten. Die meisten Immobilienplattformen liefern Anzeigen als JSON-LD (schema.org) im HTML der Seite. Das ist deutlich stabiler, als CSS-Klassennamen nachzujagen, die sich mit jedem Redesign ändern. Greifen Sie nur dann auf das Parsen der Anzeigenkarten zurück, wenn kein sauberes JSON verfügbar ist.

Brauche ich Proxys, um Immobilienseiten zu scrapen?

Für größere Mengen in der Regel ja. Große Portale wie Zillow, Realtor.com und Rightmove begrenzen Anfragen und markieren Rechenzentrums-IP-Adressen schnell. Manche Anzeigen sind zudem standortabhängig. Rotierende Residential Proxys im Zielmarkt helfen, standortgenaue Daten zurückzuliefern und IP-basierte Sperren zu reduzieren. Sie garantieren jedoch keinen Zugriff und machen Scraping nicht automatisch regelkonform.

Kann ich Zillow oder Realtor.com direkt scrapen?

Sie sind öffentlich, aber stark geschützt, JavaScript-gerendert und ihre Nutzungsbedingungen beschränken den automatisierten Zugriff. Bevorzugen Sie für diese Portale eine offizielle API, einen lizenzierten Datenfeed oder eine schriftliche Genehmigung, statt ihre Schutzmaßnahmen zu umgehen. Wenn Sie öffentliche Daten erfassen, nehmen Sie nur öffentliche Immobilienfakten auf, bleiben Sie ausgeloggt, umgehen Sie keine Zugangskontrollen und takten Sie Ihre Anfragen. Siehe unseren Leitfaden zu den besten Proxys für Zillow.

Welche Immobiliendaten kann ich erfassen?

Vor allem öffentliche Immobilienfakten: Preis, Schlafzimmer, Badezimmer, Wohnfläche, Grundstücksgröße, Typ, Status, Tage am Markt und Preisverlauf. Die öffentliche Verfügbarkeit macht Daten jedoch nicht automatisch unpersonenbezogen oder wiederverwendbar. Genaue Adressen, Fotos, Beschreibungen sowie Angaben zu Maklern und Eigentümern können datenschutz- oder urheberrechtlich relevant sein. Prüfen Sie dies daher vor dem Speichern oder erneuten Veröffentlichen.


Fazit

Das Scraping von Immobiliendaten macht aus verstreuten Anzeigen einen nutzbaren Datensatz. Die bewährte Vorgehensweise lautet: Lesen Sie eingebettetes JSON-LD aus, wo es möglich ist, parsen Sie andernfalls Karten, blättern Sie durch die Ergebnisse und leiten Sie alles über geografisch ausgerichtete Residential Proxys, damit die Daten standortgenau und ungesperrt sind. Beschränken Sie sich auf öffentliche, nicht personenbezogene Immobilienfakten, dann bleiben Sie auf rechtlich gut vertretbarem Terrain. Informationen zur Infrastruktur finden Sie in unserem Leitfaden zu den besten Proxys für Immobiliendaten und im umfassenderen Leitfaden zu den besten Proxys für Web Scraping.

Zuletzt aktualisiert: 25. Juni 2026.



Share article: