Comment scraper SeLoger avec Python et Requests?

Sasha Bouloudnine ●
September 2, 2022
●
8 min read

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.

  1. python3
  2. requests
  3. lxml
  4. Google Chrome (si si)
  5. SublimeText

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:

  1. une partie dite “non-substantielle” uniquement
  2. 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:

f
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)

En ouvrant le fichier avec Chrome pourtant
. Patatra


Aucune donnée disponible. Et 2 obstacles sérieux se dressent devant nous:

  1. il y un captcha
  2. 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:

  1. ouvrir Google Chrome
  2. clique-droit puis “Inspecter”
  3. se rendre dans la partie “Network”
  4. actualiser la page
  5. identifier la requĂȘte HTML
  6. 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:

  1. browsing (ou navigation) — la façon dont on se dĂ©place sur le site
  2. 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:

  1. ouvrir Google Chrome
  2. clique-droit puis “Inspecter”
  3. 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:

  1. identifier et copier un mot clé sur la page
  2. actualiser la page
  3. coller le dans l’outil de recherche
  4. appuyer sur entrée
  5. 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:

f
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)

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:

  1. l’URL de l’annonce — qui correspond à son identifiant unique
  2. le prix
  3. 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:

f
from 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:

f
div_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:

f
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()"

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!

🩀

1516989175726.jpegSasha Bouloudnine

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.

Related Articles