Przewodnik po skrobaniu danych Zillow Real Estate za pomocą Pythona

Komentarze: 0

Wyodrębnianie informacji o nieruchomościach z Zillow może zapewnić doskonałą analizę rynku i inwestycji. Ten post ma na celu omówienie skrobania ofert nieruchomości Zillow za pomocą Pythona, gdzie będzie on poświęcony najważniejszym podjętym krokom i wytycznym. Ten przewodnik pokaże ci, jak skrobać informacje z witryny Zillow przy użyciu bibliotek takich jak requests i lxml.

Instalacja wymaganych bibliotek i rozpoczęcie skrobania

Zanim zaczniemy, upewnij się, że masz zainstalowany Python w swoim systemie. Konieczne będzie również zainstalowanie następujących bibliotek:

pip install requests
pip install lxml

Krok 1. Zrozumienie struktury HTML Zillow

Aby wyodrębnić dane z Zillow, musisz zrozumieć strukturę strony internetowej. Otwórz stronę z listą nieruchomości na Zillow i sprawdź elementy, które chcesz wyodrębnić (np. tytuł nieruchomości, szacunkową cenę wynajmu i cenę wyceny).

Tytuł:

1.png

Szczegóły ceny:

2.png

Krok 2. Wykonywanie żądań HTTP

Teraz wyślijmy żądania HTTP. Najpierw musimy pobrać zawartość HTML strony Zillow. Użyjemy biblioteki requests do wysłania żądania HTTP GET do docelowego adresu URL. Skonfigurujemy również nagłówki żądania, aby naśladowały prawdziwe żądanie przeglądarki i użyjemy serwerów proxy, aby uniknąć blokowania adresów IP.

import requests

# Zdefiniuj docelowy adres URL dla oferty nieruchomości Zillow
url = "https://www.zillow.com/homedetails/1234-Main-St-Some-City-CA-90210/12345678_zpid/"

# Set up the request headers to mimic a browser request
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',
}

# Skonfiguruj nagłówki żądania, aby naśladowały żądanie przeglądarki
proxies = {
    'http': 'http://username:password@your_proxy_address',
    'https://username:password@your_proxy_address',
}


# Wyślij żądanie HTTP GET z nagłówkami i serwerami proxy
response = requests.get(url, headers=headers, proxies=proxies)
response.raise_for_status()  # Ensure we got a valid response

Krok 3. Parsowanie zawartości HTML

Następnie musimy przeanalizować zawartość HTML za pomocą lxml. Użyjemy funkcji fromstring z modułu lxml.html, aby przeanalizować zawartość HTML strony internetowej do obiektu Element.

from lxml.html import fromstring

# Parsowanie zawartości HTML przy użyciu lxml
parser = fromstring(response.text)

Krok 4. Ekstrakcja danych

Teraz wyodrębnimy określone punkty danych, takie jak tytuł nieruchomości, szacunkowa cena czynszu i cena oszacowania za pomocą zapytań XPath na przeanalizowanej zawartości HTML.

# Wyodrębnianie tytułu właściwości przy użyciu XPath
title = ' '.join(parser.xpath('//h1[@class="Text-c11n-8-99-3__sc-aiai24-0 dFxMdJ"]/text()'))

# Wyodrębnianie szacunkowej ceny wynajmu nieruchomości przy użyciu XPath
rent_estimate_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-2]

# Wyodrębnianie ceny wyceny nieruchomości przy użyciu XPath
assessment_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-1]

# Przechowywanie wyodrębnionych danych w słowniku
property_data = {
    'title': title,
    'Rent estimate price': rent_estimate_price,
    'Assessment price': assessment_price
}

Krok 5. Zapisywanie danych do JSON

Na koniec zapiszemy wyodrębnione dane do pliku JSON w celu dalszego przetwarzania.

import json

# Zdefiniuj nazwę wyjściowego pliku JSON
output_file = 'zillow_properties.json'

# Otwórz plik w trybie zapisu i zrzuć dane
with open(output_file, 'w') as f:
    json.dump(all_properties, f, indent=4)

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

Obsługa wielu adresów URL

Aby zeskrobać wiele ofert nieruchomości, będziemy iterować po liście adresów URL i powtarzać proces ekstrakcji danych dla każdego z nich.

# Lista adresów URL do zeskrobania
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/"
]

# Lista do przechowywania danych dla wszystkich właściwości
all_properties = []

for url in urls:
    # Wyślij żądanie HTTP GET z nagłówkami i serwerami proxy
    response = requests.get(url, headers=headers, proxies=proxies)
    response.raise_for_status()  # Ensure we got a valid response

    # Parsowanie zawartości HTML przy użyciu lxml
    parser = fromstring(response.text)

    # Wyodrębnianie danych przy użyciu XPath
    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]

    # Przechowywanie wyodrębnionych danych w słowniku
    property_data = {
        'title': title,
        'Rent estimate price': rent_estimate_price,
        'Assessment price': assessment_price
    }

    # Dołączenie danych właściwości do listy
    all_properties.append(property_data)

Pełny kod

Oto kompletny kod do skrobania danych nieruchomości Zillow i zapisywania ich w pliku JSON:

import requests
from lxml.html import fromstring
import json

# Zdefiniuj docelowe adresy URL dla ofert nieruchomości Zillow
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/"
]

# Skonfiguruj nagłówki żądania, aby naśladowały żądanie przeglądarki
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',
}

# Opcjonalnie można skonfigurować serwery proxy, aby uniknąć blokowania adresów IP.
proxies = {
    'http': 'http://username:password@your_proxy_address',
    'https': 'https://username:password@your_proxy_address',
}

# Lista do przechowywania danych dla wszystkich właściwości
all_properties = []

for url in urls:
    try:
        # Wyślij żądanie HTTP GET z nagłówkami i serwerami proxy
        response = requests.get(url, headers=headers, proxies=proxies)
        response.raise_for_status()  # Ensure we got a valid response

        # Parsowanie zawartości HTML przy użyciu lxml
        parser = fromstring(response.text)

        # Wyodrębnianie danych przy użyciu XPath
        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]

        # Przechowywanie wyodrębnionych danych w słowniku
        property_data = {
            'title': title,
            'Rent estimate price': rent_estimate_price,
            'Assessment price': assessment_price
        }

        # Dołączenie danych właściwości do listy
        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}")

# Zdefiniuj nazwę wyjściowego pliku JSON
output_file = 'zillow_properties.json'

# Otwórz plik w trybie zapisu i zrzuć dane
with open(output_file, 'w') as f:
    json.dump(all_properties, f, indent=4)

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

Dzięki zrozumieniu struktury stron HTML i wykorzystaniu potężnych bibliotek, takich jak requests i lxml, można skutecznie wyodrębniać szczegóły nieruchomości. Korzystanie z serwerów proxy i rotacyjnych User-Agents umożliwia wykonywanie dużej liczby żądań do witryn takich jak Zillow bez ryzyka zablokowania. Dla tych działań, statyczne proxy ISP lub rotacyjne proxy mieszkaniowe są uważane za optymalny wybór.

Komentarze:

0 komentarze