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.
Pour préciser l’utilité de chacun des éléments cités ci-dessus : python3 est le langage informatique avec lequel nous allons construire le scraper SeLoger, requests est une librairie qui permet de se déplacer sur Internet, lxml va nous permettre de récupérer les informations, Google Chrome va nous aider à observer ce qui se passe depuis le navigateur avant de le reproduire de façon programmatique. Enfin, SublimeText est un éditeur de texte sympathique.
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. bot-mitigation
Scraper SeLoger ?
C’est simple comme bonjour !
En suivant le tutoriel de requests, et avec quelques lignes de code, on peut obtenir quelque chose de très simple, comme suit :
import requests # on importe la librairie response = requests.get('https://seloger.com') # on visite la page d'accueil with open("response.html", "w") as f: # on enregistre dans un fichier f.write(response.text)
f
En ouvrant le fichier avec Chrome pourtant… Patatra…

Aucune donnée disponible. Et deux obstacles sérieux se dressent devant nous :
- Il y a un captcha
- Il faut activer le JS
Dès lors, comment accéder à ces données ?
C’est très simple, il suffit d’aller sur le site et de procéder comme suit :
- Ouvrir Google Chrome
- Clic droit puis Inspecter
- Se rendre dans la partie Network
- Actualiser la page
- Identifier la requĂŞte HTML
- Cliquer sur la requĂŞte puis Copy as CURL
Comme illustré ici :
Et en collant le curl directement dans notre ligne de commande…
Cette fois c’est la bonne !

En d’autres termes, il suffit de fournir un cookie dit "valide" pour naviguer ensuite sans encombre sur le site.
Qui montre cookie montre patte blanche…
🍪

NB : attention, le cookie expire rapidement, et vous devrez le générer manuellement à chaque fois. Si vous voulez collecter de la donnée sans effort, essayez notre scraper prêt-à -l’emploi disponible ici. À lancer en quelques clics.
2. 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 ?

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.
Tout comme réalisé précédemment, 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 très 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 :

Et 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
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 !
3. 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
Il s’agit d’une div, dont l’attribut data-test contient le mot-clé sl.card-container :
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.
Exécutez le code complet en tapant le nom du script, suivi d'un -u dans le terminal. La chaîne de caractères qui suit le -u représente l’URL de recherche SeLoger, ici l’URL Corse :
$ 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
NB : attention, pensez à bien copier et coller les cookies récupérés sur le site, pour contourner proprement la protection anti-bot.
Et voilà ce qui va apparaître directement sur 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 toutes les données extraites. Les données sont proprement structurées et directement exploitables. Voici un imprimé d’écran :

Magnifique!
Limitations
Ce code devrait 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 des cookies valides 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.
NB : avec le plan gratuit, vous pourrez collecter plus de 300 listings chacun. Sans débourser un centime et sans une ligne de code !
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.
Si, bien sûr, vous souhaitez collecter toutes les annonces de votre choix et leurs attributs, n’hésitez pas à visiter directement notre boutique.
Happy scraping!
🦀