Guia para extrair dados do Zillow Real Estate com Python

Comentários: 0

Extrair informações de propriedades reais do Zillow pode oferecer uma análise perfeita para o mercado e investimentos. Este post tem como objetivo discutir a raspagem de listagens de propriedades do Zillow com Python, onde ele se concentrará nas etapas e diretrizes essenciais. Este guia mostrará como raspar informações do site Zillow usando bibliotecas como solicitações e lxml.

Instalando as bibliotecas necessárias e iniciando o scraping

Antes de começarmos, verifique se você tem o Python instalado no seu sistema. Também será necessário instalar as seguintes bibliotecas:

pip install requests
pip install lxml

Passo 1. Entendendo a estrutura HTML do Zillow

Para extrair dados do Zillow, você precisa entender a estrutura da página da Web. Abra uma página de listagem de propriedades no Zillow e inspecione os elementos que você deseja extrair (por exemplo, título da propriedade, preço estimado de aluguel e preço de avaliação).

Título:

1.png

Detalhes do preço:

2.png

Passo 2. Fazendo solicitações HTTP

Agora vamos enviar solicitações HTTP. Primeiro, precisamos buscar o conteúdo HTML da página do Zillow. Usaremos a biblioteca de solicitações para enviar uma solicitação HTTP GET para o URL de destino. Também configuraremos os cabeçalhos da solicitação para imitar uma solicitação real do navegador e usaremos proxies para evitar o bloqueio de IP.

import requests

# Definir o URL de destino para a listagem de imóveis do Zillow
url = "https://www.zillow.com/homedetails/1234-Main-St-Some-City-CA-90210/12345678_zpid/"

# Configurar os cabeçalhos do pedido para imitar um pedido do 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',
}

# Opcionalmente, configure proxies para evitar o bloqueio de IP
proxies = {
    'http': 'http://username:password@your_proxy_address',
    'https://username:password@your_proxy_address',
}


# Enviar o pedido HTTP GET com cabeçalhos e proxies
response = requests.get(url, headers=headers, proxies=proxies)
response.raise_for_status()  # Ensure we got a valid response

Passo 3. Analisando o conteúdo HTML

Em seguida, precisamos analisar o conteúdo HTML usando lxml. Usaremos a função fromstring do módulo lxml.html para analisar o conteúdo HTML da página da Web em um objeto Element.

from lxml.html import fromstring

# Analisar o conteúdo HTML utilizando lxml
parser = fromstring(response.text)

Passo 4. Extração de dados

Agora, vamos extrair pontos de dados específicos, como o título da propriedade, o preço estimado do aluguel e o preço de avaliação usando consultas XPath no conteúdo HTML analisado.

# Extrair o título da propriedade utilizando XPath
title = ' '.join(parser.xpath('//h1[@class="Text-c11n-8-99-3__sc-aiai24-0 dFxMdJ"]/text()'))

# Extrair o preço estimado da renda do imóvel utilizando XPath
rent_estimate_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-2]

# Extrair o preço de avaliação do imóvel utilizando XPath
assessment_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-1]

# Armazenar os dados extraídos num dicionário
property_data = {
    'title': title,
    'Rent estimate price': rent_estimate_price,
    'Assessment price': assessment_price
}

Passo 5. Salvando dados em JSON

Por fim, salvaremos os dados extraídos em um arquivo JSON para processamento posterior.

import json

# Definir o nome do ficheiro JSON de saída
output_file = 'zillow_properties.json'

# Abrir o ficheiro em modo de escrita e descarregar os dados
with open(output_file, 'w') as f:
    json.dump(all_properties, f, indent=4)

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

Tratamento de múltiplos URLs

Para extrair várias listagens de propriedades, vamos iterar sobre uma lista de URLs e repetir o processo de extração de dados para cada uma delas.

# Lista de URLs para recolha de dados
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 para armazenar dados de todas as propriedades
all_properties = []

for url in urls:
    # Enviar o pedido HTTP GET com cabeçalhos e proxies
    response = requests.get(url, headers=headers, proxies=proxies)
    response.raise_for_status()  # Ensure we got a valid response

    # Analisar o conteúdo HTML utilizando lxml
    parser = fromstring(response.text)

    # Extrair dados utilizando 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]

    # Armazenar os dados extraídos num dicionário
    property_data = {
        'title': title,
        'Rent estimate price': rent_estimate_price,
        'Assessment price': assessment_price
    }

    # Anexar os dados do imóvel à lista
    all_properties.append(property_data)

Código completo

Aqui está o código completo para raspar os dados da propriedade Zillow e salvá-los em um arquivo JSON:

import requests
from lxml.html import fromstring
import json

# Definir os URLs de destino para as listagens de imóveis do 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/"
]

# Configurar os cabeçalhos do pedido para imitar um pedido do 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',
}

# Opcionalmente, configure proxies para evitar o bloqueio de IP
proxies = {
    'http': 'http://username:password@your_proxy_address',
    'https': 'https://username:password@your_proxy_address',
}

# Lista para armazenar dados de todas as propriedades
all_properties = []

for url in urls:
    try:
        # Enviar o pedido HTTP GET com cabeçalhos e proxies
        response = requests.get(url, headers=headers, proxies=proxies)
        response.raise_for_status()  # Ensure we got a valid response

        # Analisar o conteúdo HTML utilizando lxml
        parser = fromstring(response.text)

        # Extrair dados utilizando 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]

        # Armazenar os dados extraídos num dicionário
        property_data = {
            'title': title,
            'Rent estimate price': rent_estimate_price,
            'Assessment price': assessment_price
        }

        # Anexar os dados do imóvel à lista
        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}")

# Definir o nome do ficheiro JSON de saída
output_file = 'zillow_properties.json'

# Abrir o ficheiro em modo de escrita e descarregar os dados
with open(output_file, 'w') as f:
    json.dump(all_properties, f, indent=4)

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

Compreendendo a estrutura das páginas HTML e tirando partido de bibliotecas poderosas, como requests e lxml, pode extrair eficientemente detalhes de propriedades. A utilização de proxies e de User-Agents rotativos permite-lhe fazer um grande volume de pedidos a sites como o Zillow sem o risco de ser bloqueado. Para estas actividades, os proxies ISP estáticos ou os proxies residenciais rotativos são considerados escolhas óptimas.

Comentários:

0 Comentários