Comment scraper SeLoger avec Python et Requests?
Dans cet article de blog, nous allons avoir ensemble, sous la forme d’un guide imagé pas à pas, comment réaliser un scraping des annonces SeLoger avec Python3 et la librairie requests, directement depuis la ligne de commande.
Comment repérer la requête initiale, et récupérer précisément la donnée dont on a besoin…
Nerds de tous les pays, tenez-vous prĂŞts!
🤓
Prérequis
Afin de réaliser ce tutoriel de bout en bout, et avant de partir la fleur au fusil, soyez sûrs d’avoir les éléments suivants installés sur votre ordinateur.
Vous pouvez cliquer sur les liens ci-dessous, qui vous dirigeront soit vers un tutoriel d’installation, soit vers le site en question.
Tout y est!
Légal
⚠️ Disclaimer Ceci n’est pas un conseil juridique. Les règles sur le scraping peuvent évoluer, et leur application varie. Avant de scraper une plateforme, consultez un expert juridique.
La question revient souvent sur le devant de la scène : est-ce que c’est légal de faire du scraping ?
Et pour cause, les CGUs des sites concernés prévoient souvent une interdiction de principe « d'extraction, par transfert permanent ou temporaire de la totalité ou d'une partie qualitativement ou quantitativement substantielle du contenu » de leur bases de données.
Et bien, comme le suggère cette interdiction, dans un jargon juridique qui n’est pas nécessairement accessible à tous, oui le scraping est légal!
Toutefois, il faut respecter certaines conditions.

Ainsi, deux conditions doivent être respectées :
- L'utilisateur doit accéder aux données de façon licite, ce qui est généralement le cas lorsque vous accéder à une base de données librement accessibles ou que vous disposez d'un utilisateur vous permettant d'y accéder.
- Les données extraites doivent représenter une partie dite non substantielle du contenu de la base elle-même.
En d’autres termes, il est parfaitement légal pour un utilisateur ayant accès de manière licite à une base de données, d'en extraire une partie dite "non substantielle".
Nous attirons cependant votre attention sur le fait que ces extractions et réutilisation ne doivent pas porter atteinte à l'exploitation normale de la base de données ni causer un préjudice injustifié aux intérêts légitimes du producteur de la base et qu’il convient de respecter les éventuelles autres règlementations applicables.
Il faut donc éviter de collecter une part trop importante des données ou de nuire au bon fonctionnement du site.
En cas de doute concernant votre projet, nous vous invitons à prendre conseil auprès d’un juriste ou d’un avocat.
Guide complet
1. Browsing
Le scraping, ou collecte de données en bon français, se décompose en deux parties :
- Browsing (ou navigation) — la façon dont on se déplace sur le site
- Parsing — la récupération des attributs sur une page
Dans cette première partie, nous allons donc nous concentrer sur la navigation.
Comment naviguer sur le site ?
Avec ses vues renversantes et son patrimoine naturel intact :

Et voilĂ !

https://www.seloger.com/list.htm?projects=2&types=2&places=[{%22divisions%22:[2248]}]&mandatorycommodities=0&enterprise=0&qsVersion=1.0&m=search_refine-redirection-search_results.
Pour trouver la requête qui met à disposition les données, rien de plus simple :
- Ouvrir Google Chrome
- Clic droit puis Inspecter
- Se rendre dans la partie Network
Une fois ces trois premières étapes terminées, voilà ce que vous allez avoir sous les yeux :

Ensuite, c’est simple :
- Identifier et copier un mot-clé sur la page
- Actualiser la page
- Coller ce mot dans l’outil de recherche
- Appuyer sur entrée
- Cliquer sur la requĂŞte puis Copy as CURL
Par exemple, "Bastia Immobilier" — que nous avons identifié sur la page, et que nous allons chercher dans la partie réseau… et voilà !

La requête dont nous avions besoin est désormais en notre possession. Nous allons alors nous rendre sur ce site : https://curl.trillworks.com/ et y coller l’URL afin de la transformer directement en requête Python.
Comme suit :

Voilà ce que ça donne en Python :
import requests cookies = $COOKIES headers = $HEADERS response = requests.get('https://www.seloger.com/list.htm?projects=2&types=2&places=\[\{%22divisions%22:\[2248\]\}\]&mandatorycommodities=0&enterprise=0&qsVersion=1.0&m=search_refine-redirection-search_results.', cookies=cookies, headers=headers)
f
Le cookie doit absolutement être récupéré depuis votre navigateur pour que la navigation fonctionne sans accrod. Toutefois, le cookie expire rapidement. Il s'agit donc d'un accès temporaire, qu'il vous faudra renouveler manuellement autant de fois que nécessaire.
Maintenant que nous avons récupéré les données brutes, il ne nous reste plus qu’à récupérer les attributs dont nous avons besoin.
Allons-y.
2. Parsing
Dans le cadre de ce tutoriel, nous allons récupérer les 3 attributs principaux de chaque annonce :
- L’URL de l’annonce — qui correspond à son identifiant unique
- Le prix
- Le titre
Comme présenté sur cet imprimé écran :

from lxml import html ... doc = html.fromstring(response.content)
f
On clique droit, puis “Inspecter”, et la voilà !
div_xpath = "//div[@data-test='sl.card-container']"
f
Comme on le voit sur cet imprimé écran :

url_xpath = "//div[contains(@class, 'Card__ContentZone')]/a[contains(@name, 'classified-link') and contains(@class, 'CoveringLink')]/@href" price_xpath = "//div[@data-test='sl.price-label']/text()" title_xpath = "//div[@data-test='sl.title']/text()"
f
Et voilĂ !
Code
Vous pouvez retrouver le code en intégralité juste ici, directement disponible depuis notre GitHub : https://github.com/lobstrio/seloger-listings-scraper-tutorial.
$ python3 seloger_scraping_listings.py -u https://www.seloger.com/list.htm?projects=2&types=2&places=[{%22divisions%22:[2248]}]&mandatorycommodities=0&enterprise=0&qsVersion=1.0&m=search_hp_last
f
Et voilà ce qui va apparaître dans votre terminal :
$ python3 20220811_demo_seloger.py -u "https://www.seloger.com/list.htm?projects=2&types=2&places=\[\{%22divisions%22:\[2248\]\}\]&mandatorycommodities=0&enterprise=0&qsVersion=1.0&m=search_refine-redirection-search_results." status code 200 0 420 000 € Appartement 1 545 000 € Appartement 2 324 000 € Appartement 3 599 000 € Appartement 4 399 000 € Appartement 5 730 000 € Appartement 6 780 000 € Maison 7 849 000 € Appartement 8 720 000 € Appartement 9 499 000 € Appartement 10 149 000 € Appartement 11 739 000 € Appartement 12 527 000 € Appartement 13 595 000 € Appartement 14 562 000 € Maison 1 étage 15 129 000 € Studio 16 180 000 € Studio 17 590 000 € Appartement 18 595 000 € Appartement 19 665 000 € Maison 20 99 000 € Studio 21 469 000 € Appartement 22 527 000 € Appartement 23 549 000 € Maison de ville 24 399 000 € Appartement ~~ success _ _ _ | | | | | | | | ___ | |__ ___| |_ __ __ | |/ _ | '_ / __| __/| '__| | | (_) | |_) __ \ |_ | | |_|___/|_.__/|___/__||_|
f
✨
Vous retrouverez, dans le même dossier que le script, un fichier au format CSV, listings-seloger-data.csv, avec les données extraites. Les données sont structurées et exploitables.

Limitations
Ce code va vous permettre de scraper rapidement une première page de résultats et d’obtenir le lien, le titre et le prix de chaque élément présent sur la page.
Toutefois, le cookie récupéré manuellement ne va fonctionner qu’un temps. Très rapidement, le cookie va expirer, et il faudra aller manuellement récupérer un nouveau cookie sur le site. Par ailleurs, après un certain temps, il est possible que votre adresse IP soit définitivement bloquée par le site.
Vous entrerez alors dans une boucle de challenges ininterrompus :
Par ailleurs, il ne s’agit que d’un tutoriel de démonstration. Avec le code présenté ici, vous allez pouvoir récupérer les 3 attributs principaux de chaque listing, et uniquement les listings de la page 1.
Avec le plan gratuit vous pouvez extraire jusqu'Ă 3000 annonces par mois.
Conclusion
Et c’est la fin du tutoriel !
Dans ce tutoriel, nous avons vu comment, avec Python et Requests naviguer sur le site, et scraper les attributs principaux des annonces sur SeLoger.
Happy scraping!
🦀