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, rĂ©cupĂ©rer prĂ©cisĂ©ment la donnĂ©e dont on a besoin⊠contourner (temporairement) les outils dits de bot mitigation.
Nerds de tous les pays, tenez vous prĂȘs!
đ€
Prérequis
Afin de rĂ©aliser ce tutoriel de bout en bout, et avant de partir la fleur au fusil, soyez sur 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 inGoogle 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
La question revient souvent (quasi systĂ©matiquement) sur le devant de la scĂšne: est-ce que câest lĂ©gal de faire du scraping sur SeLoger?
Et pour cause, les CGUs du site précise comme suit:
« l'Utilisateur s'interdit de procéder à :
l'extraction par transfert permanent ou temporaire de la totalitĂ© ou d'une partie qualitativement ou quantitativement substantielle du contenu d'une ou plusieurs des bases des donnĂ©es accessibles sur le Site Internet [âŠ] »
Et bien, comme le suggĂšre le site, dans un jargon juridique qui nâest pas nĂ©cessairement accessible Ă tous, oui le scraping sur SeLoger est entiĂšrement lĂ©gal!
Comme le souligne lâarticle L342-3 du code de la propriĂ©tĂ© intellectuelle, lorsquâune base de donnĂ©es est mise Ă disposition du publique, celui-ci ne peut interdire la rĂ©cupĂ©ration des donnĂ©es.
Et ce Ă deux conditions:
- une partie dite ânon-substantielleâ uniquement
- lâutilisateur a accĂšs aux donnĂ©es de façon âliciteâ
En dâautres termes, totalement lĂ©gal de le faire, tant que vous en rĂ©cupĂ©rer une petite partie, dite ânon substantielleâ.
Pour avoir un aperçu complet de nos informations Ă ce sujet, nâhĂ©sitez pas Ă consulter notre article dĂ©diĂ©, juste lĂ : https://lobstr.io/blog/data-scraping-illegal.
Attention, câest en anglais. CrustacĂ© et polyglotte.
Guide complet
1. bot-mitigation
Scraper SeLoger? Câest simple comme bonjour!
En suivant le tutoriel de requests, et avec quelque lignes de code, on peut avoir quelque chose de trĂšs simple, comme suit:
fimport 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)
En ouvrant le fichier avec Chrome pourtantâŠ. PatatraâŠ
Aucune donnée disponible. Et 2 obstacles sérieux se dressent devant nous:
- il y un captcha
- il faut activer javascript
Et câest bien normal, SeLoger utilise un service de bot-mitigation, datadome, qui limite lâaccĂšs au site. DĂšs lors, comment contourner la bot mitigation de datadome?
Câest trĂšs simple, il suffit dâaller sur le site, et de procĂ©der comme suit:
- ouvrir Google Chrome
- clique-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é juste ici:
Et en collant le curl directement dans notre ligne de commande⊠Cette fois câest la bonne!
En dâautres termes, datadome nous fait passer diffĂ©rents tests - que notre navigateur Chrome rĂ©sout passivement - et nous affecte un cookie, qui va ensuite nous permettre naviguer sans encombre sur le site.
Qui montre cookie montre patte blancheâŠ
đȘ
On retrouve dâailleurs un cookie âdatadomeâ directement depuis notre curl:
NB: attention, le cookie expire rapidement, et vous devrez systĂ©matiquement le gĂ©nĂ©rer Ă la main. Si vous voulez collecter de la donnĂ©e at scale, de façon entiĂšrement programmatique, essayez notre scraper prĂȘt-Ă -lâemploi disponible ici. A lancer en deux clics.
2. browsing
Le scraping, ou collecte de données en bon français, se décompose en 2 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?
Tout dâabord, nous allons nous rendre sur notre cher site dâimmobilier. Et choisir la liste de biens que nous souhaitons rĂ©cupĂ©rer. Puisque lâĂ©tĂ© bat son plein⊠direction la Corse! Et pour le type de bien, allons-y gaiement: âacheter, maisonâ.
Avec ses vues renversantes, et son patrimoine naturel intacte:
Et voilĂ !
Une fois les critĂšres sĂ©lectionnĂ©s, pensez Ă rĂ©cupĂ©rer lâURL de recherche â et Ă le conserver prĂ©cieusement. Nous allons en avoir besoin pour la suite: 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
- clique-droit puis âInspecterâ
- se rendre dans la partie âNetworkâ
Une fois ces 3 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 le dans lâoutil de recherche
- appuyer sur entrée
- cliquer sur la requĂȘte puis âCopy as CURLâ
e.g. âBastia Immobilierâ â que nous avons identifiĂ© sur la page, et que nous allons cherchĂ© dans la partie rĂ©seau⊠et voila!
La requĂȘte dont nous avions besoin est dĂ©sormais en notre possession. Nous allons dĂ©sormais nous rendre sur ce site: https://curl.trillworks.com/. Et coller lâURL, afin de directement la transformer en requĂȘte Python.
Comme suit:
Et voilà ce que ça donne en Python:
fimport 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)
NB: pour des raisons dâaffichage, la taille des âcookiesâ et des âheadersâ ont Ă©tĂ© volontairement rĂ©duites
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 attributes 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:
Nous allons dâabord transformer la rĂ©ponse HTML en un arbre structurĂ©, avec la librairie lxml:
ffrom lxml import html ... doc = html.fromstring(response.content)
Ensuite, nous allons identifier lâĂ©lĂ©ment HTML, via son xPath qui contient lâensemble des donnĂ©es de chaque annonce.
On clique-droit, puis âInspecterâ, et la voilĂ ! Il sâagit dâune div, dont lâattribut data-test contient le mot clĂ© sl.card-container:
fdiv_xpath = "//div[@data-test='sl.card-container']"
Et quâon retrouve bien sur cet imprimĂ© Ă©cran:
On va maintenant visiter chaque Ă©lĂ©ment dâannonce, et dans chaque div rĂ©cupĂ©rer nos trois attributs, Ă partir de leur xPath. De la mĂȘme façon donc, pour chacun des 3 attributs, voilĂ les xPath correspondants:
furl_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()"
NB: si vous voulez en savoir plus sur les xPath, on vous conseille le trÚs bon cours de w3schools, parfait pour démarrer, avec des éléments théoriques courts et précis, et des exercices pratiques à faire directement sur le site.
Et voilĂ !
Il nous suffit maintenant dâenregistrer les donnĂ©es dans un .csv, et le tour est jouĂ©. VoilĂ un joli set de donnĂ©es, prĂȘt Ă lâemploi, et proprement formatĂ©.
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 :
f$ 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
NB: attention, pensez à bien copier et coller les cookies récupérés sur le site, pour proprement contourner la bot mitigation datadome
Et voilĂ ce qui va apparaĂźtre directement sur votre terminal:
f$ 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 _ _ _ | | | | | | | | ___ | |__ ___| |_ __ __ | |/ _ \| '_ \/ __| __/| '__| | | (_) | |_) \__ \ |_ | | |_|\___/|_.__/|___/\__||_|
âš
Vous retrouverez, dans le mĂȘme dossier que le script, un fichier au format CSV, listings-seloger-data.csv, avec lâensemble des donnĂ©es extraites. Les donnĂ©es sont proprement structurĂ©es, et directement exploitables.Voici un imprimĂ©-Ă©cran ci-dessous:
Magnifique!
Limitations
Ce code devrait vous permettre de scraper rapidement une premiĂšre page de rĂ©sultats, et dâobtenir le lien, titre, et prix de chaque Ă©lĂ©ment prĂ©sent sur la page.
Toutefois, le contournement de datadome 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.
Vous entrerez alors dans une boucle de captchas 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.
Si vous souhaitez rĂ©cupĂ©rer lâensemble des listings, sur toutes les pages, avec plus de 27 attributs distincts, et le tout sans une ligne de code, vous pouvez utiliser notre joli crawler prĂȘt Ă lâusage, disponible juste ici.
NB: avec le plan gratuit, vous pourrez collecter plus de 300 listings chaque. 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, contourner (temporairement et manuellement) la bot mitigation, naviguer sur le site, et scraper les attributs principaux des listings sur SeLoger.
Si bien sĂ»r, vous souhaitez collecter lâensemble des listings et lâensemble de leurs attributs, nâhĂ©sitez pas Ă visiter directement notre boutique.
Happy scraping!
đŠ
Co-founder @ lobstr.io depuis 2019. Fou de la data et amoureux zélé du lowercase. Je veille à ce que vous ayez toujours la donnée que vous voulez.