Руководство по скрапингу данных о недвижимости с Zillow с помощью Python

Комментарии: 0

Извлечение информации о недвижимости с Zillow может предоставить важные данные для анализа рынка и инвестиций. В этой статье представлен процесс скрапинга объявлений на Zillow с использованием Python, и рассмотрено, как использовать библиотеки, такие как requests и lxml, для скрапинга информации с веб-сайта Zillow, что поможет вам собирать ценные данные для анализа и принятия инвестиционных решений.

Установка необходимых библиотек и начало скрапинга

Перед началом убедитесь, что Python установлен на вашей системе. Вам также потребуется установить следующие библиотеки:

pip install requests
pip install lxml

Давайте пошагово рассмотрим процесс скрапинга:

Шаг 1: Понимание структуры HTML Zillow

Для успешного скрапинга данных с Zillow важно тщательно изучить структуру веб-страницы, чтобы определить, какие элементы информации могут быть извлечены. Это включает в себя название объекта недвижимости, оценочную стоимость аренды, оценочную стоимость объекта и другие важные данные.

Название позиции:

1.png

Цена:

2.png

Шаг 2: Отправка HTTP-запросов

Сначала нам нужно получить HTML-содержимое страницы Zillow. Мы будем использовать библиотеку requests для отправки HTTP GET-запроса на целевой URL. Также настроим заголовки запроса, чтобы имитировать запрос реального браузера, и используем прокси, чтобы избежать блокировки по IP.


import requests

# Определение целевого URL для объявления о недвижимости на Zillow
url = "https://www.zillow.com/homedetails/1234-Main-St-Some-City-CA-90210/12345678_zpid/"

# Настройка заголовков запроса для имитации запроса браузера
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',
}

# Настройка прокси для избежания блокировки по IP
proxies = {
    'http': 'http://username:password@your_proxy_address',
    'https://username:password@your_proxy_address',
}

# Отправка HTTP GET-запроса с заголовками и прокси
response = requests.get(url, headers=headers, proxies=proxies)
response.raise_for_status()  # Убедитесь, что мы получили корректный ответ

Шаг 3: Парсинг HTML-содержимого

Далее нам нужно совершить парсинг HTML-содержимого с использованием библиотеки lxml. Мы будем использовать функцию fromstring из модуля lxml.html для парсинга HTML-содержимого веб-страницы в объект Element.

from lxml.html import fromstring

# Парсинг HTML-содержимого с помощью lxml
parser = fromstring(response.text)

Шаг 4: Извлечение данных

Теперь мы извлечем конкретные данные, такие как название объекта недвижимости, оценочная цена аренды и оценочная стоимость собственности, используя XPath-запросы к HTML-содержимому парсинг которого производился ранее.


# Извлечение названия объекта недвижимости с помощью XPath
title = ' '.join(parser.xpath('//h1[@class="Text-c11n-8-99-3__sc-aiai24-0 dFxMdJ"]/text()'))

# Извлечение оценочной цены аренды с помощью XPath
rent_estimate_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-2]

# Извлечение оценочной стоимости собственности с помощью XPath
assessment_price = parser.xpath('//span[@class="Text-c11n-8-99-3__sc-aiai24-0 dFhjAe"]//text()')[-1]

# Сохранение извлеченных данных в словарь
property_data = {
    'title': title,
    'Rent estimate price': rent_estimate_price,
    'Assessment price': assessment_price
}

Шаг 5: Сохранение данных в формате JSON

Наконец, мы сохраним извлеченные данные в файл JSON для дальнейшей обработки.

import json

# Определение имени выходного файла JSON
output_file = 'zillow_properties.json'

# Открытие файла в режиме записи и сохранение данных
with open(output_file, 'w') as f:
    json.dump(all_properties, f, indent=4)

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

Обработка множественных URL-адресов

Для скрапинга множества объявлений о недвижимости необходимо выполнить итерацию по списку URL-адресов и повторять процесс извлечения данных для каждого из них.

# Список URL-адресов для скрапинга
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/"
]

# Список для хранения данных всех объектов недвижимости
all_properties = []

for url in urls:
    # Отправка HTTP GET-запроса с заголовками и прокси
    response = requests.get(url, headers=headers, proxies=proxies)
    response.raise_for_status()  # Убедитесь, что мы получили корректный ответ

    # Парсинг HTML-содержимого с помощью lxml
    parser = fromstring(response.text)

    # Извлечение данных с помощью 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]

    # Сохранение извлеченных данных в словарь
    property_data = {
        'title': title,
        'Rent estimate price': rent_estimate_price,
        'Assessment price': assessment_price
    }

    # Добавление данных объекта недвижимости в список
    all_properties.append(property_data)

Финальная версия кода

Вот финальный код для скрапинга данных о недвижимости с Zillow и сохранения их в файл JSON:

import requests
from lxml.html import fromstring
import json

# Определение целевых URL-адресов для объявлений о недвижимости 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/"
]

# Настройка заголовков запроса для имитации запроса браузера
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',
}

# Настройка прокси для избежания блокировки по IP
proxies = {
    'http': 'http://username:password@your_proxy_address',
    'https': 'https://username:password@your_proxy_address',
}

# Список для хранения данных всех объектов недвижимости
all_properties = []

for url in urls:
    try:
        # Отправка HTTP GET-запроса с заголовками и прокси
        response = requests.get(url, headers=headers, proxies=proxies)
        response.raise_for_status()  # Убедитесь, что получен корректный ответ

        # Парсинг HTML-содержимого с помощью lxml
        parser = fromstring(response.text)

        # Извлечение данных с помощью 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]

        # Сохранение извлеченных данных в словаре
        property_data = {
            'title': title,
            'Rent estimate price': rent_estimate_price,
            'Assessment price': assessment_price
        }

        # Добавление данных объекта недвижимости в список
        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}")

# Определение имени выходного файла JSON
output_file = 'zillow_properties.json'

# Открытие файла в режиме записи и сохранение данных
with open(output_file, 'w') as f:
    json.dump(all_properties, f, indent=4)

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

Понимание структуры HTML страниц и использование мощных библиотек, таких как requests и lxml, позволяют эффективно извлекать детали о недвижимости. Благодаря использованию прокси и ротации User-Agent, можно выполнять большое количество запросов без риска блокировки на Zillow. Для этих целей оптимальным вариантом будут статические ISP прокси или ротационные резидентские прокси-серверы.

Комментарии:

0 комментариев