Comment gratter Idealista sur le Web : Un guide complet (mise à jour 2023)
Raluca Penciuc le Mar 03 2023

Idealista est l'un des principaux sites immobiliers d'Europe du Sud. Il fournit une mine d'informations sur les biens à vendre et à louer. Il est disponible en Espagne, au Portugal et en Italie et répertorie des millions de maisons, de chambres et d'appartements.
Pour les entreprises et les particuliers qui cherchent à se faire une idée du marché immobilier espagnol, le site Web peut être un outil précieux. Web scraping Idealista peut vous aider à extraire ces informations précieuses et à les utiliser de diverses manières, notamment dans le cadre d'études de marché, de la génération de leads et de la création de nouvelles opportunités commerciales.
Dans cet article, nous allons fournir un guide étape par étape sur la façon de gratter le site Web à l'aide de TypeScript. Nous couvrirons les conditions préalables, le scraping des données de propriétés et comment améliorer le processus, et pourquoi l'utilisation d'un scraper professionnel est préférable à la création de votre propre scraper.
À la fin de cet article, vous disposerez des connaissances et des outils nécessaires pour extraire des données d'Idealista et les utiliser à bon escient pour votre entreprise.
Conditions préalables
Avant de commencer, assurons-nous que nous disposons des outils nécessaires.
Tout d'abord, téléchargez et installez Node.js depuis le site officiel, en veillant à utiliser la version Long-Term Support (LTS). Cela permettra également d'installer automatiquement Node Package Manager (NPM), que nous utiliserons pour installer d'autres dépendances.
Pour ce tutoriel, nous utiliserons Visual Studio Code comme environnement de développement intégré (IDE), mais vous pouvez utiliser tout autre IDE de votre choix. Créez un nouveau dossier pour votre projet, ouvrez le terminal et exécutez la commande suivante pour créer un nouveau projet Node.js :
npm init -y
Cela créera un fichier package.json dans le répertoire de votre projet, qui contiendra des informations sur votre projet et ses dépendances.
Ensuite, nous devons installer TypeScript et les définitions de type pour Node.js. TypeScript offre un typage statique optionnel qui permet d'éviter les erreurs dans le code. Pour ce faire, exécutez dans le terminal
npm install typescript @types/node --save-dev
Vous pouvez vérifier l'installation en exécutant le programme :
npx tsc --version
TypeScript utilise un fichier de configuration appelé tsconfig.json pour stocker les options du compilateur et d'autres paramètres. Pour créer ce fichier dans votre projet, exécutez la commande suivante :
npx tsc -init
Assurez-vous que la valeur de "outDir" est fixée à "dist". De cette manière, nous séparerons les fichiers TypeScript des fichiers compilés. Vous trouverez plus d'informations sur ce fichier et ses propriétés dans la documentation officielle de TypeScript.
Maintenant, créez un répertoire "src" dans votre projet, et un nouveau fichier "index.ts". C'est ici que nous conserverons le code de scraping. Pour exécuter du code TypeScript, il faut d'abord le compiler, donc pour être sûr de ne pas oublier cette étape supplémentaire, nous pouvons utiliser une commande personnalisée.
Rendez-vous dans le fichier "package.json", et modifiez la section "scripts" comme suit :
"scripts": {
"test": "npx tsc && node dist/index.js"
}
Ainsi, lorsque vous exécuterez le script, il vous suffira de taper "npm run test" dans votre terminal.
Enfin, pour récupérer les données du site web, nous utiliserons Puppeteer, une bibliothèque de navigateur sans tête pour Node.js qui vous permet de contrôler un navigateur web et d'interagir avec des sites web de manière programmatique. Pour l'installer, exécutez la commande suivante dans le terminal :
npm install puppeteer
Il est fortement recommandé lorsque vous souhaitez vous assurer de l'exhaustivité de vos données, car de nombreux sites Web contiennent aujourd'hui du contenu généré de manière dynamique. Si vous êtes curieux, vous pouvez consulter avant de continuer la documentation de Puppeteer pour voir de quoi il est capable.
Localisation des données
Maintenant que votre environnement est configuré, nous pouvons commencer à extraire les données. Pour cet article, j'ai choisi de récupérer la liste des maisons et des appartements disponibles dans une région de Tolède, en Espagne : https://www.idealista.com/pt/alquiler-viviendas/toledo/buenavista-valparaiso-la-legua/.
Nous allons extraire les données suivantes de chaque liste de la page :
- l'URL ;
- le titre ;
- le prix ;
- les détails (nombre de pièces, surface, etc.) ;
- la description
Toutes ces informations sont mises en évidence dans la capture d'écran ci-dessous :

En ouvrant les outils de développement sur chacun de ces éléments, vous pourrez remarquer les sélecteurs CSS que nous utiliserons pour localiser les éléments HTML. Si vous ne savez pas comment fonctionnent les sélecteurs CSS, n'hésitez pas à consulter ce guide pour débutants.
Extraction des données
Pour commencer à écrire notre script, vérifions que l'installation de Puppeteer s'est bien déroulée :
import puppeteer from 'puppeteer';
async function scrapeIdealistaData(idealista_url: string): Promise<void> {
// Launch Puppeteer
const browser = await puppeteer.launch({
headless: false,
args: ['--start-maximized'],
defaultViewport: null
})
// Create a new page
const page = await browser.newPage()
// Navigate to the target URL
await page.goto(idealista_url)
// Close the browser
await browser.close()
}
scrapeIdealistaData("https://www.idealista.com/pt/alquiler-viviendas/toledo/buenavista-valparaiso-la-legua/")
Ici, nous ouvrons une fenêtre de navigateur, créons une nouvelle page, naviguons jusqu'à l'URL cible et fermons le navigateur. Pour des raisons de simplicité et de débogage visuel, j'ouvre la fenêtre du navigateur en mode maximisé et non sans tête.
Étant donné que toutes les inscriptions ont la même structure et les mêmes données, nous pouvons extraire toutes les informations de l'ensemble de la liste des propriétés dans notre algorithme. Après avoir exécuté le script, nous pouvons parcourir en boucle tous les résultats et les compiler en une seule liste.
Pour obtenir l'URL de toutes les propriétés, nous localisons les éléments d'ancrage avec la classe "item-link". Nous convertissons ensuite le résultat en un tableau JavaScript et faisons correspondre chaque élément à la valeur de l'attribut "href".
// Extract listings location
const listings_location = await page.evaluate(() => {
const locations = document.querySelectorAll('a.item-link')
const locations_array = Array.from(locations)
return locations ? locations_array.map(a => a.getAttribute('href')) : []
})
console.log(listings_location.length, listings_location)
Ensuite, pour les titres, nous pouvons utiliser le même élément d'ancrage, sauf que cette fois nous extrairons son attribut "title".
// Extract listings titles
const listings_title = await page.evaluate(() => {
const titles = document.querySelectorAll('a.item-link')
const titles_array = Array.from(titles)
return titles ? titles_array.map(t => t.getAttribute('title')) : []
})
console.log(listings_title.length, listings_title)
Pour les prix, nous localisons les éléments "span" ayant 2 noms de classe : "item-price" et "h2-simulated". Il est important d'identifier les éléments de la manière la plus unique possible, afin de ne pas altérer le résultat final. Il doit également être converti en tableau, puis mappé à son contenu textuel.
// Extract listings prices
const listings_price = await page.evaluate(() => {
const prices = document.querySelectorAll('span.item-price.h2-simulated')
const prices_array = Array.from(prices)
return prices ? prices_array.map(p => p.textContent) : []
})
console.log(listings_price.length, listings_price)
Nous appliquons le même principe pour les détails des propriétés, en analysant les éléments "div" avec le nom de classe "item-detail-char".
// Extract listings details
const listings_detail = await page.evaluate(() => {
const details = document.querySelectorAll('div.item-detail-char')
const details_array = Array.from(details)
return details ? details_array.map(d => d.textContent) : []
})
console.log(listings_detail.length, listings_detail)
Et enfin, la description des propriétés. Ici, nous appliquons une expression régulière supplémentaire pour supprimer tous les caractères de retour à la ligne inutiles.
// Extract listings descriptions
const listings_description = await page.evaluate(() => {
const descriptions = document.querySelectorAll('div.item-description.description')
const descriptions_array = Array.from(descriptions)
return descriptions ? descriptions_array.map(d => d.textContent.replace(/(\r\n|\n|\r)/gm, "")) : []
})
console.log(listings_description.length, listings_description)
Vous devriez maintenant avoir 5 listes, une pour chaque donnée que nous avons récupérée. Comme je l'ai mentionné précédemment, nous devrions les centraliser en une seule. De cette façon, les informations que nous avons recueillies seront beaucoup plus faciles à traiter.
// Group the lists
const listings = []
for (let i = 0; i < listings_location.length; i++) {
listings.push({
url: listings_location[i],
title: listings_title[i],
price: listings_price[i],
details: listings_detail[i],
description: listings_description[i]
})
}
console.log(listings.length, listings)
Le résultat final devrait ressembler à ceci :
[
{
url: '/pt/inmueble/99004556/',
title: 'Apartamento em ronda de Buenavista, Buenavista-Valparaíso-La Legua, Toledo',
price: '750€/mês',
details: '\n3 quart.\n115 m² área bruta\n2º andar exterior com elevador\nOntem \n',
description: 'Apartamento para alugar na Ronda Buenavista, em Toledo.Três quartos e duas casas de banho, sala, cozinha, terraço, garagem e arrecadação....'
},
{
url: '/pt/inmueble/100106615/',
title: 'Moradia em banda em Buenavista-Valparaíso-La Legua, Toledo',
price: '1.000€/mês',
details: '\n4 quart.\n195 m² área bruta\nOntem \n',
description: 'Magnífica casa geminada para alugar com 3 andares, 4 quartos aconchegantes, 3 banheiros, sala ampla e luminosa, cozinha totalmente equipa...'
},
{
url: '/pt/inmueble/100099977/',
title: 'Moradia em banda em calle Francisco Ortiz, Buenavista-Valparaíso-La Legua, Toledo',
price: '800€/mês',
details: '\n3 quart.\n118 m² área bruta\n10 jan \n',
description: 'O REMAX GRUPO FV aluga uma casa mobiliada na Calle Francisco Ortiz, em Toledo.Moradia geminada com 148 metros construídos, distribuídos...'
},
{
url: '/pt/inmueble/100094142/',
title: 'Apartamento em Buenavista-Valparaíso-La Legua, Toledo',
price: '850€/mês',
details: '\n4 quart.\n110 m² área bruta\n1º andar exterior com elevador\n10 jan \n',
description: 'Apartamento muito espaçoso para alugar sem móveis, cozinha totalmente equipada.Composto por 4 quartos, 1 casa de banho, terraço.Calefaç...'
}
]
Contourner la détection des robots
Si vous exécutez votre script au moins deux fois au cours de ce tutoriel, vous avez peut-être déjà remarqué cette page gênante :

Idealista utilise DataDome comme protection contre les robots, qui intègre un défi CAPTCHA GeeTest. Vous devez déplacer la pièce du puzzle jusqu'à ce que l'image soit complète, puis vous devez être redirigé vers votre page cible.
Vous pouvez facilement mettre en pause votre script Puppeteer jusqu'à ce que vous ayez résolu le défi à l'aide de ce code :
await page.waitForFunction(() => {
const pageContent = document.getElementById('main-content')
return pageContent !== null
}, {timeout: 10000})
Cela indique à notre script d'attendre 10 secondes qu'un sélecteur CSS spécifié apparaisse dans le DOM. Cela devrait être suffisant pour vous permettre de résoudre le CAPTCHA et de laisser la navigation se terminer.

...A moins que la page Idealista ne vous bloque de toute façon.
À ce stade, le processus est devenu plus complexe et plus difficile, et vous n'avez même pas élargi votre projet.
Comme je l'ai déjà mentionné, Idealista est protégé par DataDome. Ils collectent les données de plusieurs navigateurs pour générer et associer une empreinte digitale unique. S'ils ont des soupçons, vous recevez le défi CAPTCHA ci-dessus, qui est assez difficile à résoudre automatiquement.
Parmi les données collectées sur les navigateurs, nous trouvons
- propriétés de l'objet Navigator (deviceMemory, hardwareConcurrency, languages, platform, userAgent, webdriver, etc.)
- le calendrier et les contrôles de performance
- WebGL
- WebRTC IP sniffing
- l'enregistrement des mouvements de la souris
- incohérences entre User-Agent et votre système d'exploitation
- et bien d'autres encore.
L'une des façons de surmonter ces difficultés et de poursuivre le scraping à grande échelle est d'utiliser une API de scraping. Ce type de service offre un moyen simple et fiable d'accéder aux données de sites web comme Idealista.com, sans avoir à construire et à maintenir son propre scraper.
WebScrapingAPI est un exemple de ce type de produit. Son mécanisme de rotation de proxy évite complètement les CAPTCHA, et sa base de connaissances étendue permet de randomiser les données du navigateur afin qu'il ressemble à un utilisateur réel.
L'installation est simple et rapide. Il vous suffit d'ouvrir un compte pour recevoir votre clé API. Elle est accessible depuis votre tableau de bord et sert à authentifier les demandes que vous envoyez.

Comme vous avez déjà configuré votre environnement Node.js, nous pouvons utiliser le SDK correspondant. Exécutez la commande suivante pour l'ajouter aux dépendances de votre projet :
npm install webscrapingapi
Il ne reste plus qu'à adapter les sélecteurs CSS précédents à l'API. La puissante fonctionnalité des règles d'extraction permet d'analyser les données sans modifications significatives.
import webScrapingApiClient from 'webscrapingapi';
const client = new webScrapingApiClient("YOUR_API_KEY");
async function exampleUsage() {
const api_params = {
'render_js': 1,
'proxy_type': 'residential',
'timeout': 60000,
'extract_rules': JSON.stringify({
locations: {
selector: 'a.item-link',
output: '@href',
all: '1'
},
titles: {
selector: 'a.item-link',
output: '@title',
all: '1'
},
prices: {
selector: 'span.item-price.h2-simulated',
output: 'text',
all: '1'
},
details: {
selector: 'div.item-detail-char',
output: 'text',
all: '1'
},
descriptions: {
selector: 'div.item-description.description',
output: 'text',
all: '1'
}
})
}
const URL = "https://www.idealista.com/pt/alquiler-viviendas/toledo/buenavista-valparaiso-la-legua/"
const response = await client.get(URL, api_params)
if (response.success) {
// Group the lists
const listings = []
for (let i = 0; i < response.response.data.locations.length; i++) {
listings.push({
url: response.response.data.locations[i],
title: response.response.data.titles[i],
price: response.response.data.prices[i],
details: response.response.data.details[i],
description: response.response.data.descriptions[i].replace(/(\r\n|\n|\r)/gm, "")
})
}
console.log(listings.length, listings)
} else {
console.log(response.error.response.data)
}
}
exampleUsage();
Conclusion
Dans cet article, nous vous avons montré comment récupérer les données d'Idealista, un site immobilier espagnol populaire, à l'aide de TypeScript et de Puppeteer. Nous avons passé en revue le processus de mise en place des conditions préalables et de récupération des données, et nous avons discuté de certaines façons d'améliorer le code.
Le Web scraping Idealista peut fournir des informations précieuses aux entreprises et aux particuliers. En utilisant les techniques décrites dans cet article, vous pouvez extraire du site Web des données telles que les URL, les prix et les descriptions des biens immobiliers.
En outre, si vous souhaitez éviter les mesures anti-bots et la complexité du processus de scraping, l'utilisation d'un scraper professionnel peut s'avérer plus efficace et plus fiable que la création de votre propre scraper.
En suivant les étapes et les techniques décrites dans ce guide, vous pourrez exploiter la puissance du web scraping Idealista et l'utiliser pour répondre aux besoins de votre entreprise. Qu'il s'agisse d'études de marché, de génération de leads ou de création de nouvelles opportunités commerciales, le web scraping Idealista peut vous aider à garder une longueur d'avance sur la concurrence.
Nouvelles et mises à jour
Restez au courant des derniers guides et nouvelles sur le web scraping en vous inscrivant à notre lettre d'information.
We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Articles connexes

Apprenez quel est le meilleur navigateur pour contourner les systèmes de détection de Cloudflare lorsque vous faites du web scraping avec Selenium.


Apprenez à utiliser les proxys avec node-fetch, un client HTTP JavaScript populaire, pour construire des scrapeurs web. Comprendre comment les proxys fonctionnent dans le web scraping, intégrer les proxys avec node-fetch, et construire un web scraper avec le support des proxys.


Apprenez à utiliser Playwright pour le scraping web et l'automatisation grâce à notre guide complet. De la configuration de base aux techniques avancées, ce guide couvre tout.
