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 à :
- Éviter les interdictions IP: les proxys vous permettent de faire pivoter les adresses IP, ce qui réduit considérablement le risque de détection et de blocage.
- Accès à du contenu géo-restreint: Certaines listes et données immobilières ne sont disponibles que dans certaines régions. Les proxys vous permettent d'apparaître comme si vous naviguiez depuis différents endroits.
- Contournement des limites de débit: Zillow impose des limites au nombre de requêtes provenant d'une seule adresse IP. Les proxys permettent de répartir vos demandes sur plusieurs adresses IP, ce qui vous permet d'éviter ces restrictions.
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 :
- Choisissez votre protocole préféré (HTTP, HTTPS ou SOCKS5).
- Choisissez entre proxys rotatifs ou collants.
- 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.

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.