Посібник зі скрапінгу даних про нерухомість із 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 Коментаріїв