Récupération des données immobilières de Zillow à l'aide de proxys Massive, avec des ordinateurs portables et des serveurs sur fond de données cloud. »

Comment récupérer des données Zillow avec Massive - Guide du débutant

Jason Grad
Co-fondateur
March 28, 2025
Table of Contents

Prêt à tester les performances d'un proxy premium ?

Comment récupérer des données Zillow avec Massive - Guide du débutant

Jason Grad
Co-fondateur
March 28, 2025

Zillow est l'un des plus grands sites Web immobiliers des États-Unis, proposant une mine d'annonces immobilières, de prix de l'immobilier et d'analyses de marché. Mais il n'est pas facile de supprimer Zillow : ses défenses anti-bots peuvent rapidement stopper vos efforts d'extraction de données.

Ce guide vous explique comment extraire efficacement les données immobilières de Zillow en utilisant Les proxys résidentiels de Massive et Python avec Playwright. Vous apprendrez à contourner la détection, à extraire des données immobilières de manière fiable et à faire évoluer votre flux de travail de scraping comme un pro.

Pourquoi Scrape Zillow Real Estate Data ?

Les données immobilières de Zillow sont une mine d'or pour :

  • Étude de marché: Analysez les annonces immobilières, les tendances des prix et les statistiques du quartier pour mieux comprendre la dynamique du marché immobilier.
  • Analyse des investissements: Examiner les tendances historiques des prix et les indicateurs de marché pour évaluer les opportunités d'investissement potentielles.
  • Analyses de localisation: Étudiez la démographie, les équipements et les caractéristiques des propriétés du quartier pour soutenir la planification du développement.
  • Recherche économique: Surveillez les tendances du marché immobilier, les indices de prix et les indicateurs économiques régionaux à des fins d'études universitaires ou de recherches politiques.

Que vous soyez un analyste de données, un investisseur immobilier ou un développeur d'outils d'automatisation des bâtiments, l'extraction des données de Zillow peut fournir des informations précieuses sur le marché immobilier.

Le problème : les mesures anti-éraflures de Zillow

L'extraction de données à partir de Zillow présente des défis importants en raison de ses systèmes anti-bots robustes :

  • Systèmes de vérification humaine: Zillow utilise la vérification « Press & Hold » et d'autres méthodes pour confirmer que les demandes proviennent d'utilisateurs réels plutôt que de systèmes automatisés.
  • Limitation de débit: Zillow surveille attentivement la fréquence des demandes de pages et peut temporairement restreindre l'accès si trop de demandes sont effectuées en peu de temps.
  • Blocage IP: Zillow peut bloquer l'accès à partir d'adresses IP qui révèlent des modèles d'activité inhabituels.
  • Mises à jour dynamiques du site: Zillow met régulièrement à jour la structure et la mise en page de son site Web, ce qui nécessite que votre scraper soit adaptable.

Voici un exemple de ce qui se passe lorsqu'un scraper est bloqué par une vérification humaine :

C'est là que les proxys, en particulier les proxys résidentiels, entrent en jeu.

Pourquoi utiliser des proxies pour scraper Zillow ?

Les proxys font office d'intermédiaires entre votre scraper et le Web. Ils sont essentiels pour le web scraping de Zillow car ils aident à :

Cependant, tous les proxys ne sont pas créés de la même manière.

Proxy résidentiel ou proxy pour centres de données : qu'est-ce qui fonctionne le mieux ?

Par expérience, les proxys résidentiels sont plus performants que ceux des centres de données pour le scraping de Zillow. Voici pourquoi :

  • Les proxys résidentiels utilisent de véritables adresses IP liées à des fournisseurs d'accès et à des appareils réels, ce qui les fait apparaître comme des utilisateurs normaux.
  • Les proxys des centres de données, bien que plus rapides et moins chers, sont facilement détectés par les systèmes de Zillow.

Si votre objectif est un scraping cohérent et évolutif sans blocs, le résidentiel est la voie à suivre.

Débuter avec Massive

Créez votre compte sur partenaires.joinmassive.com et choisissez un plan adapté à vos besoins. Ensuite, rendez-vous dans le Tableau de bord Massive pour récupérer vos informations d'identification du proxy (nom d'utilisateur et mot de passe).

Étapes de configuration :

Visitez le Démarrage rapide section pour personnaliser les paramètres de votre proxy :

  1. Choisissez votre protocole préféré (HTTP, HTTPS ou SOCKS5).
  2. Choisissez entre proxys rotatifs ou collants.
  3. Définissez les préférences de ciblage géographique (pays, État, ville, code postal ou ASN).

Une fois la configuration terminée, vous obtiendrez une commande cURL prête à l'emploi adaptée à votre cas d'utilisation spécifique.

Pour des fonctionnalités avancées telles que le ciblage basé sur la localisation et les sessions persistantes, consultez le Une documentation volumineuse. La documentation fournit des instructions étape par étape pour tirer le meilleur parti des proxies résidentiels Massive.

Avec cette configuration, vous pouvez utiliser Massive Proxies pour extraire les données des produits Zillow dans une région spécifique.

Construire Zillow Scraper à l'aide de proxys Massive

Construisons un grattoir Zillow en utilisant Playwright et Massive Proxies. Playwright automatise les interactions avec les navigateurs et gère efficacement le contenu dynamique, tandis que les proxys permettent d'éviter la détection et de contourner les restrictions.

Nous analyserons les annonces immobilières pour Chicago, Illinois, en extrayant les informations suivantes pour chaque propriété :

  • Adresse
  • État (par exemple, Actif, En attente)
  • Prix
  • Nombre de chambres
  • Nombre de salles de bain
  • Pieds carrés
  • Société cotée
  • URL de la propriété

1. Configurez votre environnement

Commencez par créer un environnement virtuel et installez les packages requis. Vous pouvez également utiliser Conda ou Poetry si vous préférez.

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

Créez un .env fichier pour stocker vos informations d'identification de proxy Massive en toute sécurité.

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

2. Configuration des paramètres du proxy et du navigateur

Configurez les informations d'identification du proxy et bloquez les actifs inutiles pour optimiser les performances et éviter toute détection.

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"]

Le blocage de ressources inutiles telles que les polices et les images accélère le processus de grattage.

Voici un exemple de l'apparence de la page lorsque des ressources sont bloquées :

3. Lancer un navigateur avec prise en charge du proxy

Ici, nous définissons un contexte de navigateur qui achemine les requêtes via Massive et filtre le contenu indésirable.

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. Extraire les données de la liste Zillow

Chaque propriété sur Zillow est contenue dans un <li> étiquette. Ces <li> les balises ont une classe qui commence par ListItem, et chaque balise représente une liste de propriétés unique. À l'intérieur de ceux-ci <li> tags, vous trouverez tous les détails clés sur la propriété, tels que l'adresse, le prix et les caractéristiques de la propriété

.

Voici comment <li> les tags sont structurés :

  • Le adresse est situé à l'intérieur d'un <address> tag avec l'attribut data-test="adresse de la carte-propriété ».
  • Le prix se trouve dans un <span> tag avec l'attribut data-test="proty-card-price ».

Des détails supplémentaires tels que le nombre de chambres, de salles de bains et de pieds carrés sont imbriqués dans <ul> listes.

Voici comment nous analysons les annonces immobilières individuelles :

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. Faites défiler et paginez les résultats

Simulez le défilement pour charger plus de listes de manière dynamique :

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

Cliquez sur la page suivante (>) pour naviguer dans d'autres pages.

Pour passer à la page suivante :

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

6. Enregistrer les données extraites

Enregistrez vos données Zillow extraites dans un fichier JSON. Vous pouvez également le convertir au format CSV ultérieurement.

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. Exécutez le Scraper

Associez le tout dans une fonction principale pour lancer le scraper, extraire des données et enregistrer les résultats.

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())

Exemple de sortie

Une fois que vous avez configuré et exécuté avec succès votre scraper Zillow à l'aide de proxys Massive, votre sortie ressemblera à ceci :

[
    {
        "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/",
    }
]

Les données sont désormais structurées et utilisables, ce qui est parfait pour les analyses immobilières, les tableaux de bord ou les outils d'investissement.

Vous pouvez accéder au code complet pour extraire les données Zillow à l'aide de proxys Massive dans L'essentiel de GitHub.

Conclusion

L'extraction des données immobilières de Zillow vous donne un avantage en termes de compréhension du marché, de suivi des propriétés et d'outils d'automatisation des bâtiments. Avec les proxys résidentiels de Massive, vous pouvez :

  • Grattez les données sans vous faire bloquer
  • Ciblez des codes postaux ou des villes spécifiques
  • Automatisez votre flux de travail de résultats de recherche Zillow
  • Extrayez des données de propriété Zillow propres et structurées

Prêt à créer votre propre scraper de données Zillow ? Inscrivez-vous à Massive Proxies aujourd'hui.

About the author
Jason Grad
Co-fondateur

Je suis le co-fondateur et PDG de Massive. En plus de travailler sur des startups, je suis musicienne, athlète, mentor, animatrice d'événements et bénévole.

Question fréquemment posée

+

+

+

+

+

+

+

+

+

+

Ready to test premium proxy performance?