перейти к содержанию

Как извлечь данные из Zillow: пошаговое руководство для профессионалов в сфере недвижимости

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

Но с чего начать? Не бойтесь — в этом руководстве я поделюсь точными методами, которые я оттачивал более 10 лет в извлечении веб-данных, чтобы создать масштабируемый парсер Zillow с нуля.

Почему данные Zillow — это золотая жила

Давайте сначала поговорим о зачем опытные инвесторы и агенты в первую очередь царапают Zillow:

  • Обнаружение возможностей: Анализируйте данные о ценах и спросе, чтобы выявить перспективные или недооцененные области.
  • Пополните свою базу данных: Дополните свои записи клиентов подробностями об объектах недвижимости, такими как кровати, ванны, налоговые значения.
  • Следите за соревнованиями: Следите за новыми объявлениями других агентов, выходящих на рынок.
  • Подтвердите состояние объекта: Исследование недавно продало дома, чтобы проверить заявления нынешних владельцев.
  • Раскройте тенденции рынка: Определите всплеск спроса на недвижимость рядом с новыми коммерческими объектами.

Имея более 9 миллиардов посещений и более 50 миллионов активных пользователей в месяц, Zillow предлагает непревзойденную глубину и широту данных о недвижимости.

Проблемы, которые нужно преодолеть

Конечно, воспользоваться всеми этими данными не всегда просто. Вот некоторые распространенные препятствия, с которыми вы можете столкнуться:

  • Обнаружение ботов: Zillow блокирует скребки с помощью капчи, IP-фильтров и других средств защиты.
  • Рендеринг JavaScript: Ключевые детали загружаются динамически через JS.
  • Частые изменения планировки: Обновления постоянно ломают парсеры.
  • Ограничение скорости: Агрессивные блокировки по количеству запросов в минуту.

Но не волнуйтесь – я поделюсь проверенными методами решения каждой проблемы. При правильном подходе вы можете надежно извлекать из Zillow тысячи записей в день.

Шаг 1. Настройка среды веб-скрапинга Python

Для этого проекта мы будем использовать Питон – идеальный язык для парсинга веб-страниц и анализа данных.

Сначала установите Python 3.6 или выше, если у вас его еще нет. Я рекомендую создать виртуальную среду для изоляции зависимостей:

python3 -m venv zillowscraping

Активируем среду, затем устанавливаем нужные нам пакеты:

pip install requests beautifulsoup4 pandas matplotlib selenium webdriver-manager

Это дает нам инструменты для отправки запросов, анализа HTML, анализа данных, автоматизации браузеров и многого другого.

Теперь самое интересное может начаться!

Шаг 2. Проверьте целевые страницы

Далее мы вручную проанализируем страницы, которые хотим очистить, используя инструменты разработчика браузера:

Инструменты разработчика браузера

На странице результатов поиска HTML-код выглядит так:

<div class="property-card">
  <div class="details">
    <div class="price">$299,000</div> 
    <div class="address">
      <a href="/ru/1234-maple-st">1234 Maple St</a>
    </div>
    <div class="specs">
      3 bd | 2 ba | 1,420 sqft
    </div>
  </div>
</div>

Мы можем видеть четкие элементы цены, адреса, кроватей, ванн и квадратных метров. Хороший!

Теперь давайте проверим отдельную страницу листинга:

<script>window.dataLayer = [{"property":"1234 Maple St"}];</script>

<div id="price"></div>

<script src="getDetails.js"></script>

Хм… детали загружаются динамически через JavaScript. Нет проблем — мы можем использовать Selenium для рендеринга страниц и извлечения нужных данных.

Шаг 3. Очистите страницу результатов поиска

Вооружившись нашими исследованиями, давайте очистим эти результаты поиска.

Сначала мы запросим HTML-код страницы:

import requests

url = "https://zillow.com/my-search-results/"
headers = {"User-Agent": "Mozilla..."} 

response = requests.get(url, headers=headers)
html = response.text

Затем мы можем проанализировать с помощью Beautiful Soup:

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, "html.parser")

Теперь извлеките данные:

cards = soup.find_all("div", class_="property-card")

for card in cards:
  price = card.find("div", class_="price").text
  address = card.find("a").text
  beds, baths, sqft = card.find("div", class_="specs").text.split("|")

  print({
    "price": price, 
    "address": address,
    ...
  })

Чтобы справиться с нумерацией страниц, мы можем проверить наличие ссылки «Далее» и повторять процесс до тех пор, пока не останется страниц.

Шаг 4. Очистите страницу сведений с помощью Selenium

Для отдельных страниц листинга мы будем использовать Селен для автоматизации браузера и рендеринга JavaScript.

Установите ChromeDriver:

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install()) 

Теперь мы можем извлечь детали:

def get_listing_data(url):

  driver.get(url)

  price = driver.find_element_by_id("price").text
  address = driver.find_element_by_id("address").text
  ...

  return {
    "price": price,
    "address": address,
    ...
  }

Вызовите эту функцию, чтобы очистить каждую страницу при переборе URL-адресов результатов поиска.

Шаг 5. Избегайте блокировок с помощью прокси и пользовательских агентов

Чтобы избежать защиты Zillow, важно направлять запросы через прокси и регулярно чередовать пользовательские агенты:

from random import choice 

proxies = ["192.168.1.1:8080", "192.168.1.2:8080"...]
user_agents = ["UA1", "UA2"...]

proxy = choice(proxies)
headers = {"User-Agent": choice(user_agents)}

response = requests.get(url, proxies={"http": proxy, "https": proxy}, headers=headers)

Это помогает распределять запросы по множеству разных IP-адресов и имитировать реальных пользователей.

Я рекомендую сотрудничать с прокси-сервисами, такими как BrightData, SmartProxy или Microleaves, чтобы получить доступ к миллионам домашних IP-адресов, идеально подходящих для обхода блокировок.

Шаг 6. Внедрение регулирования и повторных попыток

Чтобы избежать превышения пределов скорости, нам нужно регулировать запросы, добавляя случайные задержки:

from time import sleep
from random import randint

# Make request
sleep(randint(1, 5)) # Random delay

И используйте блоки try/Exception для повторения ошибок:

from requests.exceptions import RequestException

try:
  response = requests.get(url)
except RequestException as e:
  # Retry with exponential backoff
  sleep(2**num_retries)  
  response = requests.get(url) 

Это создает отказоустойчивый скребок, способный устранять периодически возникающие проблемы.

Шаг 7. Сохраните очищенные данные

После очистки нам нужно сохранить данные. Для небольших проектов может быть достаточно файлов CSV:

import csv

with open("zillow.csv", "w") as f:
  writer = csv.writer(f)
  writer.writerow(["Address", "Price", "Beds", "Baths" ...])
  for listing in listings:
    writer.writerow(listing)  

Для больших наборов данных загрузите их в базу данных SQL или хранилище NoSQL, например MongoDB. Это позволяет создавать интерактивные информационные панели и карты для получения ценной информации!

Давайте начнем скрапинг!

Вот и все – проверенный в боях процесс получения данных о недвижимости из Zillow. Теперь вы можете воспользоваться богатством предложений и вывести свой бизнес на новый уровень.

Когда вы начнете парсинг, не стесняйтесь обращаться к нам, если у вас возникнут еще вопросы! Я всегда рад помочь коллегам-профессионалам в сфере недвижимости более эффективно использовать данные.

Дайте мне знать, как только вы начнете извлекать тысячи новых списков Zillow каждый день!

Присоединяйтесь к беседе

Ваш электронный адрес не будет опубликован. Обязательные поля помечены * *