Anleitung zum Scrapen von Zillow Real Estate Daten mit Python

Bemerkungen: 0

Das Extrahieren von Immobilieninformationen aus Zillow kann eine perfekte Analyse für den Markt und Investitionen bieten. Dieser Beitrag zielt darauf ab, das Scrapen von Zillow-Immobilienangeboten mit Python zu erörtern, wobei der Schwerpunkt auf den wesentlichen Schritten und Richtlinien liegt. Dieser Leitfaden zeigt Ihnen, wie Sie Informationen von der Zillow-Website mithilfe von Bibliotheken wie requests und lxml abrufen können.

Installation der erforderlichen Bibliotheken und Beginn des Scrapings

Bevor wir beginnen, müssen Sie sicherstellen, dass Sie Python auf Ihrem System installiert haben. Außerdem müssen Sie die folgenden Bibliotheken installieren:

pip install requests
pip install lxml

Schritt 1. Verstehen der HTML-Struktur von Zillow

Um Daten von Zillow zu extrahieren, müssen Sie die Struktur der Webseite verstehen. Öffnen Sie eine Immobilienseite auf Zillow und untersuchen Sie die Elemente, die Sie auslesen möchten (z. B. Titel der Immobilie, geschätzter Mietpreis und Bewertungspreis).

Titel:

1.png

Preis Details:

2.png

Schritt 2. HTTP-Anfragen stellen

Nun wollen wir HTTP-Anfragen senden. Zuerst müssen wir den HTML-Inhalt der Zillow-Seite abrufen. Wir verwenden die requests-Bibliothek, um eine HTTP-GET-Anfrage an die Ziel-URL zu senden. Außerdem werden wir die Header der Anfrage so einrichten, dass sie eine echte Browseranfrage imitieren, und Proxys verwenden, um IP-Sperren zu vermeiden.

import requests

# Definieren Sie die Ziel-URL für die Zillow-Eigenschaftsliste
url = "https://www.zillow.com/homedetails/1234-Main-St-Some-City-CA-90210/12345678_zpid/"

# Richten Sie die Anfrage-Header ein, um eine Browser-Anfrage zu imitieren
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-US,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
    'sec-ch-ua-mobile': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}

# Optional können Sie Proxys einrichten, um IP-Sperren zu vermeiden.
proxies = {
    'http': 'http://username:password@your_proxy_address',
    'https://username:password@your_proxy_address',
}


# Senden Sie die HTTP-GET-Anfrage mit Headern und Proxys
response = requests.get(url, headers=headers, proxies=proxies)
response.raise_for_status()  # Ensure we got a valid response

Schritt 3. Parsen des HTML-Inhalts

Als nächstes müssen wir den HTML-Inhalt mit lxml analysieren. Wir verwenden die Funktion fromstring aus dem Modul lxml.html, um den HTML-Inhalt der Webseite in ein Element-Objekt zu parsen.

from lxml.html import fromstring

# Parsen des HTML-Inhalts mit lxml
parser = fromstring(response.text)

Schritt 4. Datenextraktion

Jetzt extrahieren wir spezifische Datenpunkte wie den Titel der Immobilie, den geschätzten Mietpreis und den Schätzpreis mithilfe von XPath-Abfragen auf dem geparsten HTML-Inhalt.

# Extrahieren des Eigenschaftstitels mit XPath
title = ' '.join(parser.xpath('//h1[@class="Text-c11n-8-99-3__sc-aiai24-0 dFxMdJ"]/text()'))

# Extrahieren des geschätzten Mietpreises einer Immobilie mit XPath
rent_estimate_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-2]

# Extrahieren des Immobilienbewertungspreises mit XPath
assessment_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-1]

# Speichern Sie die extrahierten Daten in einem Wörterbuch
property_data = {
    'title': title,
    'Rent estimate price': rent_estimate_price,
    'Assessment price': assessment_price
}

Schritt 5. Speichern der Daten in JSON

Abschließend speichern wir die extrahierten Daten zur weiteren Verarbeitung in einer JSON-Datei.

import json

# Definieren Sie den Namen der JSON-Ausgabedatei
output_file = 'zillow_properties.json'

# Öffnen Sie die Datei im Schreibmodus und geben Sie die Daten aus
with open(output_file, 'w') as f:
    json.dump(all_properties, f, indent=4)

print(f"Scraped data saved to {output_file}")

Behandlung mehrerer URLs

Um mehrere Immobilienangebote abzurufen, werden wir eine Liste von URLs durchlaufen und den Datenextraktionsprozess für jede einzelne wiederholen.

# Liste der zu scrapender URLs
urls = [
    "https://www.zillow.com/homedetails/1234-Main-St-Some-City-CA-90210/12345678_zpid/",
    "https://www.zillow.com/homedetails/5678-Another-St-Some-City-CA-90210/87654321_zpid/"
]

# Liste zum Speichern von Daten für alle Eigenschaften
all_properties = []

for url in urls:
    # Senden Sie die HTTP-GET-Anfrage mit Headern und Proxys
    response = requests.get(url, headers=headers, proxies=proxies)
    response.raise_for_status()  # Ensure we got a valid response

    # Parsen des HTML-Inhalts mit lxml
    parser = fromstring(response.text)

    # Daten mit XPath extrahieren
    title = ' '.join(parser.xpath('//h1[@class="Text-c11n-8-99-3__sc-aiai24-0 dFxMdJ"]/text()'))
    rent_estimate_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-2]
    assessment_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-1]

    # Speichern Sie die extrahierten Daten in einem Wörterbuch
    property_data = {
        'title': title,
        'Rent estimate price': rent_estimate_price,
        'Assessment price': assessment_price
    }

    # Anhängen der Eigenschaftsdaten an die Liste
    all_properties.append(property_data)

Vollständiger Code

Hier ist der vollständige Code, um Zillow-Eigentumsdaten abzurufen und in einer JSON-Datei zu speichern:

import requests
from lxml.html import fromstring
import json

# Definieren Sie die Ziel-URLs für Zillow-Immobilienangebote
urls = [
    "https://www.zillow.com/homedetails/1234-Main-St-Some-City-CA-90210/12345678_zpid/",
    "https://www.zillow.com/homedetails/5678-Another-St-Some-City-CA-90210/87654321_zpid/"
]

# Richten Sie die Anfrage-Header ein, um eine Browser-Anfrage zu imitieren
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-US,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
    'sec-ch-ua-mobile': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}

# Optional können Sie Proxys einrichten, um IP-Sperren zu vermeiden.
proxies = {
    'http': 'http://username:password@your_proxy_address',
    'https': 'https://username:password@your_proxy_address',
}

# Liste zum Speichern von Daten für alle Eigenschaften
all_properties = []

for url in urls:
    try:
        # Senden Sie die HTTP-GET-Anfrage mit Headern und Proxys
        response = requests.get(url, headers=headers, proxies=proxies)
        response.raise_for_status()  # Ensure we got a valid response

        # Parsen des HTML-Inhalts mit lxml
        parser = fromstring(response.text)

        # Daten mit XPath extrahieren
        title = ' '.join(parser.xpath('//h1[@class="Text-c11n-8-99-3__sc-aiai24-0 dFxMdJ"]/text()'))
        rent_estimate_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-2]
        assessment_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-1]

        # Speichern Sie die extrahierten Daten in einem Wörterbuch
        property_data = {
            'title': title,
            'Rent estimate price': rent_estimate_price,
            'Assessment price': assessment_price
        }

        # Anhängen der Eigenschaftsdaten an die Liste
        all_properties.append(property_data)

    except requests.exceptions.HTTPError as e:
        print(f"HTTP error occurred: {e}")
    except requests.exceptions.RequestException as e:
        print(f"An error occurred: {e}")

# Definieren Sie den Namen der JSON-Ausgabedatei
output_file = 'zillow_properties.json'

# Öffnen Sie die Datei im Schreibmodus und geben Sie die Daten aus
with open(output_file, 'w') as f:
    json.dump(all_properties, f, indent=4)

print(f"Scraped data saved to {output_file}")

Wenn Sie die Struktur von HTML-Seiten verstehen und leistungsstarke Bibliotheken wie Requests und lxml nutzen, können Sie effizient Immobiliendetails extrahieren. Der Einsatz von Proxys und rotierenden User-Agents ermöglicht es Ihnen, eine große Anzahl von Anfragen an Websites wie Zillow zu stellen, ohne Gefahr zu laufen, blockiert zu werden. Für diese Aktivitäten sind statische ISP-Proxys oder rotierende Wohn-Proxys die optimale Wahl.

Bemerkungen:

0 Bemerkungen