In this Article
Le scraping de données immobilières permet aux plateformes immobilières, aux investisseurs et aux équipes proptech de transformer des annonces en ligne éparses en un jeu de données structuré : prix, adresses, chambres, salles de bain, surface habitable et tendances à l’échelle d’un marché entier. Ce guide explique comment scraper des annonces immobilières avec Python, de manière robuste (en analysant les données structurées que les sites intègrent déjà), ainsi que la configuration anti-bot et proxy nécessaire pour maintenir la collecte dans différentes régions.
Je suis Andrii Byzov, AI-Native Fractional CMO spécialisé dans la création de pipelines de données web. Vous trouverez ci-dessous les données immobilières que vous pouvez collecter, un cadre juridique clair et du code opérationnel pour les résultats de recherche et les annonces individuelles, avec des proxies résidentiels pour des données géographiquement précises et non bloquées.
Faits clés
- La plupart des informations contenues dans les annonces sont publiques et sont moins sensibles : prix, chambres, salles de bain, surface, type de bien. En revanche, les adresses, photos, descriptions et noms des agents peuvent être personnels ou protégés par le droit d’auteur. Évaluez-les donc avant toute réutilisation.
- Privilégiez le JSON intégré aux sélecteurs CSS fragiles. De nombreux sites immobiliers exposent les données des annonces sous forme de JSON-LD (schema.org) ; analysez-le lorsqu’il est disponible, puis revenez aux cartes HTML lorsqu’il ne l’est pas.
- Certains sites personnalisent selon la localisation : résultats, disponibilité, langue ou devise. Les proxies géociblés aident donc à correspondre à un marché spécifique.
- Les grands portails se défendent fortement. Zillow, Realtor.com, Rightmove et les sites similaires limitent rapidement le débit et signalent les IP de centres de données ; les proxies résidentiels rotatifs aident, mais aucun outil ne garantit l’accès ni la conformité.
- Les coordonnées des agents et des propriétaires sont des données personnelles. Gardez-les en dehors de votre pipeline ; collectez des informations sur les biens, pas sur les personnes.
Quelles données immobilières pouvez-vous scraper ?
Une annonce immobilière contient des données riches et structurées. Voici les champs qu’il est généralement utile de collecter, et ceux à traiter avec prudence :
- Informations immobilières à moindre risque : prix, nombre de chambres, nombre de salles de bain, surface habitable, taille du terrain, type de bien, année de construction, statut de l’annonce, nombre de jours sur le marché et historique des prix.
- À traiter avec prudence ou à éviter : adresses exactes, photos et descriptions complètes (souvent protégées par le droit d’auteur), ainsi que les coordonnées des agents/propriétaires (données personnelles). Le fait que ces données soient accessibles publiquement ne les rend pas automatiquement réutilisables.
Le scraping immobilier est-il légal ?
La collecte d’informations immobilières publiques est globalement défendable, et c’est ainsi que fonctionnent la veille tarifaire et la proptech. Toutefois, l’accessibilité publique ne rend pas automatiquement les données non personnelles ou réutilisables : évaluez la confidentialité, le droit d’auteur, les droits sur les bases de données, les contrats et la législation locale. La règle pratique : ne scrapez pas de contenu accessible après connexion, excluez les données personnelles (coordonnées des agents/propriétaires), ne republiez pas de photos ou de descriptions protégées par le droit d’auteur, respectez les conditions de chaque site ainsi que le fichier robots.txt, et ne contournez pas les contrôles d’accès ni les CAPTCHAs. Les grands portails limitent l’accès automatisé ; pour ceux-ci, privilégiez donc une API officielle, un flux de données sous licence ou une autorisation écrite. Pour le cadre complet, consultez notre guide sur la légalité du web scraping. Il s’agit d’informations générales, et non d’un avis juridique.
Étape 1 : Configurez votre environnement
Installez les bibliothèques nécessaires à votre scraper immobilier. Les sites statiques compatibles avec JSON-LD fonctionnent avec requests ; les portails qui reposent largement sur JavaScript comme Zillow nécessitent un navigateur headless.
# Core libraries for real estate data scraping
# requests -> fetch pages | beautifulsoup4 + lxml -> parse HTML/JSON
pip install requests beautifulsoup4 lxml
# Many listing sites are JavaScript-heavy and well defended (e.g. Zillow).
# For those, add a headless browser:
pip install playwright && playwright install chromium
Étape 2 : Récupérer une page d’annonces
Récupérez une page de résultats de recherche (l’URL des biens à vendre dans une ville) en utilisant les en-têtes appropriés et en la faisant transiter par un proxy résidentiel afin que les annonces correspondent au marché cible.
import requests
HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9"}
# Route through residential proxies for geo-accurate listings (see Step 5)
proxies = {"http": "http://LOGIN:[email protected]:823",
"https": "http://LOGIN:[email protected]:823"}
def get_html(url):
r = requests.get(url, headers=HEADERS, proxies=proxies, timeout=30)
r.raise_for_status()
return r.text
html = get_html("https://example-realestate.com/homes/for_sale/CityName/")
Étape 3 : Extraire les annonces à partir du JSON intégré
Lorsqu’elles sont disponibles, le moyen le plus fiable de scraper des annonces immobilières consiste à lire les données structurées que le site intègre déjà. De nombreuses plateformes immobilières incluent application/ld+json (schema.org) avec le prix, l’adresse et l’URL d’une annonce. Ces éléments restent stables malgré les refontes, contrairement aux noms de classes CSS. Tous les sites ne les exposent pas (certains conservent les données dans l’état de l’application JS). Il faut donc vérifier chaque site et, si nécessaire, se rabattre sur l’analyse des cartes à l’étape 4.
import json
from bs4 import BeautifulSoup
LISTING_TYPES = ("Residence", "Product", "RealEstateListing", "Offer",
"SingleFamilyResidence", "Apartment", "House")
def listings_from_jsonld(html):
"""Where available, sites embed listing data as JSON-LD (schema.org).
Parsing it is more stable than CSS classes — but not every site has it,
so fall back to the cards in Step 4 when this returns nothing."""
soup = BeautifulSoup(html, "lxml")
nodes, out = [], []
for tag in soup.find_all("script", type="application/ld+json"):
try:
data = json.loads(tag.string or "{}")
except json.JSONDecodeError:
continue
stack = data if isinstance(data, list) else [data]
while stack: # flatten @graph / ItemList / nested
n = stack.pop()
if not isinstance(n, dict):
continue
if "@graph" in n:
stack.extend(n["@graph"])
if n.get("@type") == "ItemList":
stack.extend(x.get("item", x) for x in n.get("itemListElement", []))
nodes.append(n)
for n in nodes:
types = n.get("@type", "")
types = types if isinstance(types, list) else [types]
if any(t in LISTING_TYPES for t in types):
offers = n.get("offers") or {}
if isinstance(offers, list):
offers = offers[0] if offers else {}
out.append({"name": n.get("name"),
"price": offers.get("price") or n.get("price"),
"address": n.get("address"),
"url": n.get("url")})
return out
print(listings_from_jsonld(html)[:3])
Étape 4 : Analyser les cartes d’annonces (solution de repli)
Lorsqu’un site n’expose pas de JSON-LD propre, analysez directement les cartes des résultats de recherche : prix, adresse, chambres, salles de bain, superficie en pieds carrés et lien de l’annonce. Les sélecteurs varient selon les sites et changent souvent, vérifiez-les donc dans DevTools.
def parse_listing_cards(html):
"""Fallback: parse the search-results cards directly. Selectors differ by
site and change often — confirm the current ones in DevTools."""
soup = BeautifulSoup(html, "lxml")
cards = []
for card in soup.select("[data-test='property-card']"):
def t(sel):
el = card.select_one(sel)
return el.get_text(strip=True) if el else None
cards.append({
"price": t("[data-test='property-price']"),
"address": t("[data-test='property-address']"),
"beds": t("[data-test='property-beds']"),
"baths": t("[data-test='property-baths']"),
"sqft": t("[data-test='property-sqft']"),
"url": (card.select_one("a[href]") or {}).get("href"),
})
return cards
Étape 5 : Gérer la pagination
Une page de résultats ne constitue pas un jeu de données. Parcourez les pages en boucle jusqu’à ce qu’il n’y ait plus de résultats ou que vous atteigniez une limite, en espaçant les requêtes afin de ne pas déclencher les mécanismes de limitation du débit.
import time, random
def scrape_all_pages(base_url, max_pages=10):
"""Page through search results until empty or max_pages."""
all_listings = []
for page in range(1, max_pages + 1):
html = get_html(f"{base_url}?page={page}")
cards = parse_listing_cards(html)
if not cards: # no more results -> stop
break
all_listings.extend(cards)
time.sleep(random.uniform(1, 3)) # pace requests
return all_listings
Étape 6 : Utilisez des proxies pour des données géographiquement précises et non bloquées
Deux facteurs rendent le web scraping immobilier plus difficile sans proxies. D’abord, la localisation : certains sites personnalisent les résultats, la disponibilité, la langue ou la devise selon la région ; pour correspondre à un marché précis, vous devez donc effectuer vos requêtes depuis une IP située dans cette zone. Ensuite, le blocage : les grands portails repèrent rapidement les IP de centres de données et appliquent des mécanismes de limitation du débit agressifs. Les proxies résidentiels DataImpulse ($1/GB, rotatifs, 195 pays avec ciblage par ville/État) répondent à ces deux besoins : des IP d’utilisateurs réels localisées sur le marché visé, afin de réduire les blocages basés sur l’IP ; toutefois, l’accès n’est pas garanti et vous devez toujours respecter les règles de chaque site. Faites transiter les requêtes par ces proxies, puis exportez les données collectées.
import time, random, json, csv
# Listings differ by region: route through a proxy in the target market so
# prices, availability, and currency match what a local user sees.
proxies = {
"http": "http://LOGIN__cr.us;sid.re1:[email protected]:823",
"https": "http://LOGIN__cr.us;sid.re1:[email protected]:823",
}
listings = scrape_all_pages("https://example-realestate.com/homes/for_sale/CityName/")
with open("listings.json", "w", encoding="utf-8") as f:
json.dump(listings, f, indent=2, ensure_ascii=False)
if listings:
with open("listings.csv", "w", newline="", encoding="utf-8") as f:
w = csv.DictWriter(f, fieldnames=listings[0].keys())
w.writeheader(); w.writerows(listings)
Questions fréquentes
Le scraping de données immobilières est-il légal ?
La collecte de données immobilières publiques et non personnelles (prix, adresse, chambres, surface en pieds carrés) est généralement défendable et courante dans la proptech. Évitez les données personnelles (coordonnées des agents/propriétaires), ne scrapez pas de contenu accessible après connexion, ne republiez pas de photos ou de descriptions protégées par le droit d’auteur, et respectez les conditions des sites ainsi que le fichier robots.txt. Les grands portails limitent l’accès automatisé ; obtenez donc une autorisation ou un avis juridique pour un usage commercial. Il s’agit d’informations générales, et non de conseils juridiques. Consultez notre guide sur la légalité du web scraping.
Quelle est la meilleure façon de scraper des annonces immobilières ?
Analysez les données structurées déjà intégrées aux sites. La plupart des plateformes immobilières fournissent les annonces sous forme de JSON-LD (schema.org) dans le HTML de la page, ce qui est bien plus stable que de suivre des noms de classes CSS qui changent à chaque refonte. Ne revenez à l’analyse des cartes d’annonces que lorsqu’aucun JSON propre n’est disponible.
Ai-je besoin de proxies pour scraper des sites immobiliers ?
Pour du volume, généralement oui. Les grands portails (Zillow, Realtor.com, Rightmove) limitent rapidement le débit et signalent les IP de centres de données, et certaines annonces dépendent de la localisation. Des proxies résidentiels rotatifs sur le marché cible aident à renvoyer des données géographiquement exactes et à réduire les blocages fondés sur l’IP, même s’ils ne garantissent pas l’accès et ne rendent pas le scraping conforme.
Puis-je scraper Zillow ou Realtor.com directement ?
Ils sont publics, mais fortement protégés, rendus en JavaScript, et leurs conditions restreignent l’accès automatisé. Pour ces portails, privilégiez une API officielle, un flux de données sous licence ou une autorisation écrite plutôt que de contourner leurs défenses. Si vous collectez des données publiques, limitez-vous à des faits immobiliers publics, ne vous connectez pas, ne contournez pas les contrôles d’accès et espacez les requêtes. Consultez notre guide des meilleurs proxies pour Zillow.
Quelles données immobilières puis-je collecter ?
Principalement des informations publiques sur les biens : prix, chambres, salles de bain, superficie, taille du terrain, type, statut, jours sur le marché, historique des prix. Mais la disponibilité publique ne rend pas automatiquement les données non personnelles ou librement réutilisables : les adresses exactes, photos, descriptions et informations sur les agents/propriétaires peuvent avoir un poids en matière de confidentialité ou de droit d’auteur ; évaluez donc les risques avant de les stocker ou de les republier.
Conclusion
Le scraping de données immobilières transforme des annonces dispersées en un jeu de données exploitable. La méthode la plus fiable consiste à lire le JSON-LD intégré lorsque c’est possible, à se rabattre sur l’analyse des cartes lorsque ce n’est pas le cas, à parcourir les résultats page par page, et à faire transiter les requêtes par des proxies résidentiels géociblés afin d’obtenir des données géographiquement précises tout en limitant les blocages. En vous limitant aux informations publiques et non personnelles sur les biens, vous restez dans un cadre défendable. Pour l’infrastructure, consultez best proxies for real estate data et le guide plus général best proxies for web scraping.
Dernière mise à jour : 25 juin 2026.
