Guida allo scraping dei dati immobiliari di Zillow con Python

Commenti: 0

L'estrazione di informazioni sugli immobili da Zillow può offrire un'analisi perfetta del mercato e degli investimenti. Questo post si propone di discutere lo scraping degli annunci immobiliari di Zillow con Python e si concentra sui passi essenziali da compiere e sulle linee guida. Questa guida vi mostrerà come raschiare le informazioni dal sito web di Zillow utilizzando librerie come requests e lxml.

Installazione delle librerie necessarie e avvio dello scraping

Prima di iniziare, assicuratevi di avere installato Python sul vostro sistema. È inoltre necessario installare le seguenti librerie:

pip install requests
pip install lxml

Fase 1. Comprendere la struttura HTML di Zillow

Per estrarre dati da Zillow, è necessario comprendere la struttura della pagina web. Aprite la pagina di un annuncio immobiliare su Zillow e ispezionate gli elementi che volete estrarre (ad esempio, il titolo dell'immobile, il prezzo di stima dell'affitto e il prezzo di valutazione).

Titolo:

1.png

Dettagli sul prezzo:

2.png

Fase 2. Fare richieste HTTP

Ora inviamo le richieste HTTP. Per prima cosa, dobbiamo recuperare il contenuto HTML della pagina di Zillow. Useremo la libreria requests per inviare una richiesta HTTP GET all'URL di destinazione. Impostiamo anche le intestazioni della richiesta per imitare una richiesta reale del browser e usiamo i proxy per evitare il blocco dell'IP.

import requests

# Definire l'URL di destinazione per l'annuncio immobiliare di Zillow
url = "https://www.zillow.com/homedetails/1234-Main-St-Some-City-CA-90210/12345678_zpid/"

# Impostare le intestazioni della richiesta per imitare una richiesta del browser
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',
}

# Opzionalmente, impostare i proxy per evitare il blocco dell'IP.
proxies = {
    'http': 'http://username:password@your_proxy_address',
    'https://username:password@your_proxy_address',
}


# Inviare la richiesta HTTP GET con intestazioni e proxy
response = requests.get(url, headers=headers, proxies=proxies)
response.raise_for_status()  # Ensure we got a valid response

Fase 3. Parsing del contenuto HTML

Successivamente, dobbiamo analizzare il contenuto HTML utilizzando lxml. Useremo la funzione fromstring del modulo lxml.html per analizzare il contenuto HTML della pagina web in un oggetto Element.

from lxml.html import fromstring

# Analizzare il contenuto HTML utilizzando lxml
parser = fromstring(response.text)

Fase 4. Estrazione dei dati

Ora estrarremo dati specifici come il titolo dell'immobile, il prezzo di stima dell'affitto e il prezzo di valutazione utilizzando query XPath sul contenuto HTML analizzato.

# Estrazione del titolo della proprietà tramite XPath
title = ' '.join(parser.xpath('//h1[@class="Text-c11n-8-99-3__sc-aiai24-0 dFxMdJ"]/text()'))

# Estrazione del prezzo di stima dell'affitto dell'immobile tramite XPath
rent_estimate_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-2]

# Estrazione del prezzo di valutazione dell'immobile tramite XPath
assessment_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-1]

# Memorizzare i dati estratti in un dizionario
property_data = {
    'title': title,
    'Rent estimate price': rent_estimate_price,
    'Assessment price': assessment_price
}

Fase 5. Salvataggio dei dati in JSON

Infine, salveremo i dati estratti in un file JSON per un'ulteriore elaborazione.

import json

# Definire il nome del file JSON di output
output_file = 'zillow_properties.json'

# Aprire il file in modalità di scrittura e fare il dump dei dati
with open(output_file, 'w') as f:
    json.dump(all_properties, f, indent=4)

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

Gestione di URL multipli

Per effettuare lo scraping di più annunci immobiliari, itereremo su un elenco di URL e ripeteremo il processo di estrazione dei dati per ciascuno di essi.

# Elenco degli URL da raschiare
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/"
]

# Elenco per memorizzare i dati di tutti gli immobili
all_properties = []

for url in urls:
    # Inviare la richiesta HTTP GET con intestazioni e proxy
    response = requests.get(url, headers=headers, proxies=proxies)
    response.raise_for_status()  # Ensure we got a valid response

    # Analizzare il contenuto HTML utilizzando lxml
    parser = fromstring(response.text)

    # Estrarre i dati con 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]

    # Memorizzare i dati estratti in un dizionario
    property_data = {
        'title': title,
        'Rent estimate price': rent_estimate_price,
        'Assessment price': assessment_price
    }

    # Aggiungere i dati della proprietà all'elenco
    all_properties.append(property_data)

Codice completo

Ecco il codice completo per scrapare i dati delle proprietà di Zillow e salvarli in un file JSON:

import requests
from lxml.html import fromstring
import json

# Definire gli URL di destinazione per gli annunci immobiliari di 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/"
]

# Impostare le intestazioni della richiesta per imitare una richiesta del browser
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',
}

# Opzionalmente, impostare i proxy per evitare il blocco dell'IP.
proxies = {
    'http': 'http://username:password@your_proxy_address',
    'https': 'https://username:password@your_proxy_address',
}

# Elenco per memorizzare i dati di tutte le proprietà
all_properties = []

for url in urls:
    try:
        # Inviare la richiesta HTTP GET con intestazioni e proxy
        response = requests.get(url, headers=headers, proxies=proxies)
        response.raise_for_status()  # Ensure we got a valid response

        # Analizzare il contenuto HTML utilizzando lxml
        parser = fromstring(response.text)

        # Estrarre i dati con 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]

        # Memorizzare i dati estratti in un dizionario
        property_data = {
            'title': title,
            'Rent estimate price': rent_estimate_price,
            'Assessment price': assessment_price
        }

        # Aggiungere i dati della proprietà all'elenco
        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}")

# Definire il nome del file JSON di output
output_file = 'zillow_properties.json'

# Aprire il file in modalità di scrittura e fare il dump dei dati
with open(output_file, 'w') as f:
    json.dump(all_properties, f, indent=4)

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

Comprendendo la struttura delle pagine HTML e sfruttando potenti librerie come requests e lxml, è possibile estrarre in modo efficiente i dettagli degli immobili. L'utilizzo di proxy e User-Agent a rotazione consente di effettuare un grande volume di richieste a siti come Zillow senza il rischio di essere bloccati. Per queste attività, i proxy ISP statici o i proxy residenziali a rotazione sono considerati scelte ottimali.

Commenti:

0 Commenti