Являясь одним из самых популярных сайтов по недвижимости с более чем 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 каждый день!