Agrégateur d’annonces immobilières

Article en date du et modifié le
Catégorie : Projet Tags : , ,

Logo agrégateur d'annonces immobilières
Logo agrégateur d'annonces immobilières

Le monde de l’immobilier est un monde de requin. Il faut aller vite pour trouver un bien puis se positionner le premier avec un dossier qui doit être béton. Nous sommes en plein dedans pour acheter notre première maison ma copine et moi.

Mais donc, comment faire pour être le premier ? Il faut déjà trouver le bien et ce n’est pas une mince affaire… On peut chercher sur internet, aller voir en « vitrine » ou directement se faire connaître de toutes les agences pour qu’elles nous les proposent (ce qui est épuisant et long car il y a énormément d’agences différentes dans une ville).

Passer par le site des agences

La plupart du temps les agences (même les plus petites) ont un site internet sur lequel elles publient leurs offres.

Le soucis, c’est qu’il y a un site par agences ou bien par « groupes d’agences » (Cimm Immobilier par exemple). Cela fait énormément de sites à aller voir au minimum 2 fois par jour pour être sûr de ne rien manquer !

Onglets de recherches de maisons ouverts
Onglets de recherches de maisons ouverts

Utiliser les agrégateurs d’annonces comme LeBonCoin ou BienIci

Pour remédier à ça, beaucoup d’agences envoient leurs annonces sur des plateformes comme LeBonCoin, BienIci, SeLoger, MeilleursAgents etc…

C’est une très bonne choses pour nous car tout est au même endroit ! Cependant, ça a quelques limitations :

  • Les agences ne sont pas toutes sur ces sites
  • LeBonCoin autorise 3 images maximums en compte gratuit (et certaines agences ne payent pas). Ce qui veut dire qu’on doit aller sur le site de l’agence et retrouver l’annonce à la main pour voir toutes les photos
  • Le filtrage des villes qui nous intéressent est laborieux et n’est souvent pas très facile (BienIci a un très bon système je dois l’avouer par contre)
  • Les systèmes de notifications sont bof bof (celui de LeBonCoin fonctionne mais n’est pas très réactif et les autres sont souvent uniquement par mail)
  • Enfin et pas des moindre : les annonces ne sont pas misent en temps réel

Comment être le premier pour trouver son bien ?

Le principal soucis est d’être au courant d’une nouvelle annonce en premier pour n’importe quelle agence. Une seule solution : refaire notre propre agrégateur.

Dis comme ça, ça peut faire peur et prendre du temps mais c’est faisable rapidement et ultra pratique !

Le projet a été découpé en 4 parties :

  • une partie scrapping des différents sites ou découverte de leur API
  • une partie réconciliation des données (fabrication du JSON et flux RSS final)
  • une partie Web pour visualiser les annonces
  • une partie Node-Red pour envoyer les notifications. Je ne reviendrai pas dessus car c’est le même principe qu’ici : Système de notifications pour le site d’annonces radioamateur.org

Le scrapping des sites

Pour récupérer les données des sites web il y a 2 méthodes.

La première consiste à regarder la structure de la page HTML qui est composé de balises typées (lien, image, texte etc). Ces balises sont souvent nommées ce qui permet de les identifier facilement pour les styliser (par exemple mettre le texte en gras pour la balise qui s’appelle « prix »).

Grâce à ça et à un langage de sélecteurs (en l’occurrence ici le CSS mais ça pourrait être du XPath), on peut retrouver tous les éléments d’une page web par programmation et les identifier un à un.

Exemple d'une page d'annonces avec son code HTML
Exemple d’une page d’annonces avec son code HTML

La première méthode fonctionne pour les sites plus « statiques », c’est à dire qui affichent les résultats d’une recherche directement à l’affichage. On les reconnait facilement car ils n’ont pas de « chargement » (avec une roue qui tourne quand on y accède par exemple).

Les sites « dynamiques » utilisent quant à eux une API pour parler avec leur serveur qui leur donne leurs données à afficher. Dans ce cas, les éléments de la page importent peu. Ce sont les données provenant du serveur qui comptent et qui sont la plupart du temps formatées dans le format JSON qui est très facilement exploitable. Pour trouver ces API, il suffit d’aller dans la fenêtre développeur de notre navigateur et regarder les différentes requêtes qui partent du site et de trouver celle qui contient les résultats de maisons.

Exemple de BienIci et de son API
Exemple de BienIci et de son API

Avec ces 2 méthodes ont arrive facilement à récupérer les données de la plupart des sites « non protégés » contre les robots…

Le cas pénible de LeBonCoin et d’autres…

Certains sites n’aiment pas du tout les robots car c’est de l’exploitation de données sans rien « donner » en retour. Le trafic sur le site n’est donc pas rentable. Je m’explique : quand vous allez sur LeBonCoin vous avez une multitude de pub sur l’entièreté de la page et entre les annonces. Un robot se fiche de la pub donc la société perd de l’argent !

Si on peut récupérer toutes les données d’un site, rien n’émèche d’en créer un clone et de le monayer d’une quelconque manière. LeBonCoin et les sites d’annonces sont des sites de rêves pour les arnaqueurs et souvent la population qui les utilise ne sont pas sensibilisée aux risques d’internet et pourrait se faire avoir.

Pour détecter un robot on peut le faire de plusieurs manières :

  • Aller sur le site sans avoir activé JavaScript dans son navigateur. C’est tout bête mais le Web d’aujourd’hui a besoin de cette technologie pour fonctionner et faire des sites agréable. Les robots s’en fichent un peu. On peut néanmoins contourner ce problème facilement
  • Faire des requêtes à un site beaucoup trop rapidement pour un même navigateur et IP. Dans ce cas il faut ralentir le rebot et lui faire croire que l’on change de navigateur souvent. On peut également dans les cas extrême changer son IP avec un proxy (VPN par exemple)
  • Avoir un comportement »humain ». Là c’est plus dans l’interface : détecter les clics, comment on se déplace dans le site etc
  • Enfin et c’est le secret de Datadome : faire résoudre une sorte de chalenge (code) au navigateur pour prouver que c’est un vrai. Je n’ai pas vraiment compris comment ça fonctionne mais ce n’est pas contournable en 2 minutes

Il existe un service très connu pour détecter un robot et qui fonctionne très bien : Datadome. Ce service est capable d’en détecter de manière assez complexe. C’est celui qu’utilise LeBonCoin et SeLoger.

Je n’ai pas envie de perdre de temps sur le contournement de ce système. Certains arrivent à le contourner mais peu dévoilent comment en public sous peine de voir leur travail anéanti ! Il existe une API payante (mais 20 requêtes gratuites par jours) pour LeBonCoin faite par un bidouilleur qui a trouvé l’astuce. Je n’ai pas pris le temps de l’implémenter car leur application mobile est bien donc autant ne pas s’embêter.

Pour SeLoger, on retrouve dessus les mêmes annonces que sur BienIci et LeBonCoin. Je ne l’intègre pas non plus car il ne servirait à rien avoir des annonces en double voir triple. Il faut garder en tête qu’on ne veut pas un agrégateurs d’agrégateurs !

Enfin, mention spéciale à MeilleursAgents qui détecte les robots mais leur laisse 2/3 requêtes par heures ! Donc lui est utilisable et en plus ils ne remontent pas les mêmes annonces que les autres.

La réconciliation des données

Dans l’optique de faire quelque chose de simple, je n’utilise pas de base de données mais un simple ficher JSON.

Dans un premier temps, le script python fait par ma copine renvoie dans un tableau JSON toutes les annonces.

{
  "site": "IadFrance",
  "lien": "https://www.iadfrance.fr/annonce/maison-villa-vente-5-pieces-tullins-100m2/r989532?_locale=fr",
  "image": "https://www.iadfrance.fr/cache/ad_photo_small/https---passerelle.static.iadfrance.com/photos/realestate/2021-08/253e5c7d89cff5230c0e0b8f00170a01/product-1007662-1.jpg",
  "ref": "989532",
  "prix": 286000,
  "surface": "100 m²",
  "ville": "TULLINS",
  "id": "IadFrance_989532",
  "date": "2021-10-19T10:00:34.510Z",
  "hide": false,
  "star": true
}

Dans un second temps, mon script JavaScript prend les anciennes annonces ainsi que les nouvelles. Il compare les 2 fichiers pour trouver celles qui ne sont pas remonter pour les mettre comme supprimée. Ensuite il vérifie les dates, il filtres sur les villes qu’on a choisi puis enregistre le tout dans son fichier et génère le ficher RSS.

Ah et oui on a tous les 2 notre langage ce qui fait un projet très hétéroclite 😀

Astuce pour trouver nos villes

Pour trouver les villes qui nous allaient bien, j’ai utilisé cette API publique : https://www.villes-voisines.fr/getcp.php?cp=38500&rayon=15.

La petite page Web de visualisation

Afin de visualiser les annonces de manière clair, j’ai fais une page très simple en PHP. Elle n’est pas responsive pour téléphone ni ergonomique mais je n’aime pas faire de design et je ne voulais pas me casser la tête vu que c’est une page pour 2 personnes.

Sur la page on retrouve la date de publication d’une annonce (ou à défaut de l’avoir, la date de première récupération par le robot). On retrouve aussi une photo, un petit texte de détail, le prix, la ville et enfin le site où le robot l’a trouvé.

Page Web de notre agrégateur d'annonces
Page Web de notre agrégateur d’annonces

En cliquant sur la photo, un nouvel onglet nous emmène sur l’annonce du site.

Dans les détails, 2 liens permettent de cacher et de mettre en favoris l’annonce. Une annonce en favoris à la cellule de sa date sur fond vert. Une annonce supprimée n’est pas cachée mais sa date est écrit en rouge.

Des liens en haut de page permettent de voir les annonces cachées seulement (pour les remettre le exemple) ou les favoris. Un lien LeBonCoin permet d’aller directement sur le site ou dans l’application sur les résultats de recherche.

Améliorations possibles

Actuellement il y a 16 sites intégrés dont 2 agrégateurs mais il en manque et manquera toujours !

  • BienIci (agrégateur)
  • Meilleurs Agents (agrégateur)
  • Cimm Immobiler
  • Trenta Immobilier
  • Square Habitat
  • Century21
  • Safti
  • Aubreton
  • Capi France
  • Iad France
  • Bièvre Immobiler
  • Imio
  • KdImmobilier
  • Klein Immobiler
  • ProxImmo

Niveau fonctionnalités améliorable (mais que je ne ferais jamais) :

  • Une gestion d’erreurs. Je n’ai jamais eu de soucis mais actuellement je ne suis pas averti en cas d’échec
  • L’ajout de LeBonCoin soit par l’API citée au dessus
  • Faire une plus jolie interface Web
  • Faire un système de configuration par site pour la localisation
  • Détecter et enlever les annonces en doubles. Elles proviennent souvent du site de l’agence et de l’agrégateur BienIci). Idem si une annonce n’est pas en exclusivité pour une agence
  • Rajouter la pagination pour les sites des petites agences. Je ne l’ai pas fait car elles n’ont souvent que quelques annonces qui remontent

Comment l’utiliser pour vos besoins ?

Voici le code source du projet : https://gitlab.com/valentintintin/recherche-maison

Et voici la liste des choses à faire dans l’ordre pour le faire fonctionner :

  • Installer python3 et pip puis installer les dépendances avec pip install –no-cache-dir -r requirements.txt ou compiler l’image Docker grâce au Dockerfile du projet avec docker build -t python3-bs4 .
  • Installer nodejs et npm puis faite npm i
  • Installer PHP (et un serveur Web si vous ne voulez pas utiliser celui de PHP)
  • Modifier en haut du fichier get.py le prix minimum et maximum ainsi que la surface habitable minimum
  • Modifier dans chaque fonction des sites, dans l’URL, la localité de la recherche. Chaque site est différent donc le mieux est de faire le recherche sur leur site et de copier coller les bon paramètres dans le code ensuite
  • Modifier le script runAll.sh pour utiliser soit Docker soit votre python local
  • Lancer le projet avec le script runAll.sh
  • Vérifier qu’un fichier annonces.json et rss.xml se sont bien créés
  • Lancer PHP -S localhost:8000 pour aller voir le résultat dans votre navigateur
  • Rajouter une ligne à votre crontab pour le lancer périodiquement (toutes les heures c’est correct)

Normalement tout devrait fonctionner, à vous les maisons !

Conclusion

Ce petit outils nous a permis d’être informé dans les premières minutes des publications d’annonces. C’est un temps de réflexion en plus par rapport à ceux qui ne regardent que quelques fois par jours et permet d’être le premier à appeler l’agent et visiter.

Dans notre cas c’est ce qui est arrivé : en plein milieu de matinée en télétravail je vois cette annonce arrivée par notification sur mon téléphone. Elle coche pratiquement tous nos critères donc après une petite discussion avec ma copine on conclut que c’est la bonne.
J’appelle l’agent immobilier. Elle ne s’attendait pas à un appel aussi rapide seulement quelques minutes après la mise en ligne, j’étais le premier !

Pendant la signature (contre signée !) de l’offre d’achat, je lui ai expliqué en lui parlant de mon travail comment on a fait pour la surprendre et en arriver là : elle était étonnée et très heureuse pour nous 🙂

Le soir, l’annonce est apparue sur LeBonCoin et BienIci alors qu’on a été au courant le matin pour nous : il faut être un requin pour trouver son bien !