Сбор данных о недвижимости Zillow с помощью прокси-серверов Massive с ноутбуками и серверами в облачном фоне данных».

Как обрабатывать данные Zillow с помощью Massive — руководство для новичков

Jason Grad
Соучредитель
March 28, 2025
Оглавление

Готовы протестировать производительность премиум-прокси?

Сбор данных о недвижимости Zillow с помощью прокси-серверов Massive с ноутбуками и серверами в облачном фоне данных».

Как обрабатывать данные Zillow с помощью Massive — руководство для новичков

Jason Grad
Соучредитель
March 28, 2025

Zillow — один из крупнейших сайтов по недвижимости в США, предлагающий сокровищницу объявлений о недвижимости, цен на недвижимость и аналитику рынка. Но очистить Zillow непросто: его защита от ботов может быстро остановить ваши усилия по извлечению данных.

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

Зачем собирать данные о недвижимости Zillow?

Данные по недвижимости Zillow — это золотая жила для:

  • Исследование рынка: Анализируйте списки недвижимости, тенденции цен и статистику окрестностей, чтобы получить представление о динамике рынка недвижимости.
  • Инвестиционный анализ: Изучите историческую структуру цен и рыночные индикаторы для оценки потенциальных инвестиционных возможностей.
  • Аналитика местоположения: Изучите демографию, удобства и характеристики недвижимости в окрестностях для поддержки планирования развития.
  • Экономические исследования: Отслеживайте тенденции рынка жилья, индексы цен и региональные экономические показатели для академических исследований или политических исследований.

Независимо от того, являетесь ли вы аналитиком данных, инвестором в недвижимость или разработчиком инструментов автоматизации зданий, извлечение данных из Zillow может дать ценную информацию о рынке недвижимости.

Проблема: меры Zillow по борьбе с царапинами

Сбор данных из Zillow сопряжен со значительными трудностями из-за надежных систем защиты от ботов:

  • Системы верификации людей: Zillow использует проверку методом «нажатием и удерживанием» и другие методы подтверждения того, что запросы поступают от реальных пользователей, а не от автоматизированных систем.
  • Ограничение скорости: Zillow тщательно отслеживает частоту запросов к страницам и может временно ограничить доступ, если за короткий период будет сделано слишком много запросов.
  • Блокировка IP-адресов: Zillow может блокировать доступ с IP-адресов, обнаруживающих необычные модели активности.
  • Динамические обновления сайта: Zillow регулярно обновляет структуру и макет своего веб-сайта, требуя адаптации вашего скрепера.

Вот пример того, что происходит, когда скрепер блокируется при проверке человеком:

Вот тут-то и пригодятся прокси, в частности, резидентные прокси.

Зачем использовать прокси для очистки Zillow?

Прокси выступают в роли посредников между вашим парсером и Интернетом. Они необходимы для очистки веб-страниц Zillow, потому что помогают:

Однако не все прокси одинаковы.

Прокси-серверы для жилых и центров обработки данных: что лучше всего работает?

Судя по опыту, резидентные прокси превосходят прокси-серверы для центров обработки данных по очистке Zillow. Вот почему:

  • Резидентные прокси используют реальные IP-адреса, привязанные к реальным интернет-провайдерам и устройствам, поэтому они выглядят как обычные пользователи.
  • Прокси-серверы для центров обработки данных, хотя и быстрее и дешевле, легко обнаруживаются системами Zillow.

Если ваша цель — последовательный масштабируемый парсинг без блоков, жилой — это то, что нужно.

Начало работы с Massive

Создайте свой аккаунт на partners.joinmassive.com и выберите план, соответствующий вашим потребностям. После этого перейдите к Массивная панель управления для получения учетных данных прокси-сервера (имя пользователя и пароль).

Этапы настройки:

Посетите Быстрый старт раздел для настройки параметров прокси-сервера:

  1. Выберите предпочтительный протокол (HTTP, HTTPS или SOCKS5).
  2. Выберите между вращающиеся или липкие прокси.
  3. Задайте настройки геотаргетинга (страна, штат, город, почтовый индекс или ASN).

После настройки вы получите готовую к использованию команду cURL для вашего конкретного варианта использования.

Дополнительные функции, такие как таргетинг на основе местоположения и фиксированные сеансы, см. в Обширная документация. В документации представлены пошаговые инструкции по максимально эффективному использованию прокси-серверов Massive Residential.

Благодаря этой настройке вы можете использовать Massive Proxies для сбора данных о продуктах Zillow из определенного региона.

Создание Zillow Scraper с использованием массивных прокси

Давайте создадим скребок Zillow, используя драматург и массивные прокси. Playwright автоматизирует взаимодействие с браузерами и эффективно обрабатывает динамический контент, а прокси помогают избежать обнаружения и обойти ограничения.

Мы соберем объявления о недвижимости для Чикаго, штат Иллинойс, извлекая следующую информацию по каждому свойству:

  • Адрес
  • Статус (например, «Активно», «В ожидании»)
  • Цена
  • Количество спален
  • Количество ванных комнат
  • Квадратные футы
  • Листинговая компания
  • URL-адрес объекта

1. Настройте свою среду

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

python -m venv zillow_envsource 
zillow_env/bin/activate  # Windows: zillow_env\\Scripts\\activate
pip install playwright python-dotenv
playwright install

Создайте .env файл для безопасного хранения ваших учетных данных прокси-сервера Massive.

PROXY_SERVER="your_proxy_server"
PROXY_USERNAME="your_username"
PROXY_PASSWORD="your_password"

2. Настройте параметры прокси-сервера и браузера

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

class Config:
    PROXY_SERVER = os.getenv("PROXY_SERVER")
    PROXY_USERNAME = os.getenv("PROXY_USERNAME")
    PROXY_PASSWORD = os.getenv("PROXY_PASSWORD")
    BLOCKED_RESOURCES = ["stylesheet", "image", "media", "font", "imageset"]

Блокировка ненужных ресурсов, таких как шрифты и изображения, ускоряет процесс очистки.

Вот пример того, как выглядит страница при блокировке ресурсов:

3. Запустите браузер с поддержкой прокси-серверов

Здесь мы определяем контекст браузера, который направляет запросы через Massive и фильтрует нежелательный контент.

class AsyncZillowSearchScraper:
    def __init__(self, headless: bool = True):
        self.headless = headless
        self.playwright = None
        self.browser = None
        self.context = None

    async def __aenter__(self):
        self.playwright = await async_playwright().start()

        browser_config = {"headless": self.headless}
        if Config.PROXY_SERVER:
            browser_config["proxy"] = {
                "server": Config.PROXY_SERVER,
                "username": Config.PROXY_USERNAME,
                "password": Config.PROXY_PASSWORD,
            }
        self.browser = await self.playwright.chromium.launch(**browser_config)
        self.context = await self.browser.new_context()
        await self.context.route("**/*", self._route_handler)
        return self

    async def _route_handler(self, route):
        if route.request.resource_type in Config.BLOCKED_RESOURCES:
            await route.abort()
        else:
            await route.continue_()

4. Извлеките данные листинга Zillow

Каждое свойство на Zillow содержится в <li> тег. Эти <li> У тегов есть класс, начинающийся с ListItem, и каждый тег представляет собой один список свойств. Внутри них <li> теги, вы найдете все ключевые сведения о недвижимости, такие как адрес, цена и характеристики недвижимости

.

Вот как эти <li> теги структурированы:

  • The адрес расположен внутри <address> тег с атрибутом data-test="адрес карты свойств».
  • The цена находится в пределах <span> тег с атрибутом data-test="цена карты недвижимости».

Дополнительные данные, такие как количество спален, ванных комнат и квадратных метров, вложены в <ul> списки.

Вот как мы анализируем отдельные объявления о недвижимости:

class ListingParser:
    @staticmethod
    async def extract_listing_details(listing) -> Optional[Dict]:
        try:
            data_container = await listing.query_selector(
                'div[class*="property-card-data"]'
            )
            if not data_container:
                return None
            # Extract basic details

            details = {
                "address": None,
                "status": None,
                "price": None,
                "bedrooms": None,
                "bathrooms": None,
                "square_feet": None,
                "listing_company": None,
                "url": None,
            }

            # Get address

            if address_elem := await data_container.query_selector(
                'address[data-test="property-card-addr"]'
            ):
                details["address"] = ListingParser.clean_text(
                    await address_elem.text_content()
                )
            # Get price

            if price_elem := await data_container.query_selector(
                'span[data-test="property-card-price"]'
            ):
                details["price"] = ListingParser.clean_text(
                    await price_elem.text_content()
                )
            # Get property URL

            if url_elem := await data_container.query_selector(
                'a[data-test="property-card-link"]'
            ):
                if url := await url_elem.get_attribute("href"):
                    details["url"] = (
                        f"<https://www.zillow.com>{url}"
                        if not url.startswith("http")
                        else url
                    )
            # ...

            return details
        except Exception as e:
            logger.error(f"Error extracting listing details: {e}")
            return None

5. Прокрутка и разбивка результатов на страницы

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

async def _scroll_and_get_listings(self, page):
    last_count = 0
    attempts = 0
    MAX_ATTEMPTS = 20

    while attempts < MAX_ATTEMPTS:
        listings = await page.query_selector_all('article[data-test="property-card"]')
        current_count = len(listings)

        if current_count == last_count:
            break
        last_count = current_count
        await page.evaluate("window.scrollBy(0, 500)")
        await asyncio.sleep(1)
        attempts += 1
    return listings

Нажмите на следующую страницу (>) кнопка для навигации по другим страницам.

Чтобы перейти на следующую страницу, выполните следующие действия:

next_button = await page.query_selector('a[title="Next page"]:not([disabled])')
if next_button:
    await next_button.click()
    await asyncio.sleep(3)

6. Сохранить извлеченные данные

Сохраните очищенные данные Zillow в файл JSON. Вы также можете преобразовать его в CSV позже.

class ResultsSaver:
    @staticmethod
    def save_results(data, filename="zillow_listings.json"):
        with open(filename, "w", encoding="utf-8") as file:
            json.dump(data, file, indent=4, ensure_ascii=False)
        logger.info(f"Saved {len(data)} listings")

    @staticmethod
    def load_existing_results(filename="zillow_listings.json"):
        try:
            if os.path.exists(filename):
                with open(filename, "r", encoding="utf-8") as file:
                    return json.load(file)
        except Exception as e:
            logger.error(f"Error loading data: {e}")
        return []

7. Выполните скрепер

Объедините все это в одну основную функцию, чтобы запустить парсер, извлечь данные и сохранить результаты.

async def main():
    search_url = "https://www.zillow.com/chicago-il/"
    max_pages = None  # Set to a number to limit pages

    async with AsyncZillowSearchScraper(headless=False) as scraper:
        results = await scraper.scrape_search_results(search_url, max_pages=max_pages)
    print(f"\\nTotal listings scraped: {len(results)}")
    if results:
        print("\\nSample listing:")
        print(json.dumps(results[0], indent=2, ensure_ascii=False))


if __name__ == "__main__":
    asyncio.run(main())

Образец выходных данных

После успешной настройки и запуска парсера Zillow с использованием прокси Massive результат будет выглядеть примерно так:

[
    {
        "address": "722 N Trumbull Ave, Chicago, IL 60624",
        "status": "Active",
        "price": "$399,000",
        "bedrooms": "5",
        "bathrooms": "3",
        "square_feet": "2250",
        "listing_company": "REMAX LEGENDS",
        "url": "https://www.zillow.com/homedetails/722-N-Trumbull-Ave-Chicago-IL-60624/3810331_zpid/",
    }
]

Теперь данные структурированы и удобны для использования — они идеально подходят для аналитики недвижимости, информационных панелей или инвестиционных инструментов.

Вы можете получить доступ к полному коду для очистки данных Zillow с помощью прокси Massive в Суть GitHub.

Заключение

Сбор данных о недвижимости Zillow дает вам преимущество в понимании рынка, отслеживании недвижимости и инструментах автоматизации зданий. С помощью прокси-серверов Massive для резидентов вы можете:

  • Очищайте данные без блокировки
  • Ориентируйтесь на определенные почтовые индексы или города
  • Автоматизируйте рабочий процесс с результатами поиска Zillow
  • Извлеките чистые структурированные данные о недвижимости Zillow

Готовы создать свой собственный очиститель данных Zillow? Подпишитесь на массивные прокси сегодня.

Об авторе
Jason Grad
Соучредитель

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

Отзывы клиентов

Часто задаваемый вопрос

+

+

+

+

+

+

+

+

+

+

Ready to test premium proxy performance?

Прочитайте больше