CI5 : Scrapping
Comprendre les mécanismes de bases du scrapping.
Un comparateur de prix (∼60mn, – medium)
Dans cet exercice, nous allons construire un simple comparateur de prix. Pour cela, nous avons scrapper un site avec de l'information statique.
Commencez par ouvrir un navigateur et trouvez comment ouvrir la console développeur (en général, le
raccourci est Ctrl+Maj+C). Ensuite, rendez-vous sur le site web de Hardloop et
affichez la page d'un produit. Observez les communications réseau. Combien comptez-vous de requêtes ? Quelle est
leur nature ? Est-ce que les informations sur le produit regardé sont dans le HTML ou dans une des requêtes ?
Il y a plus d'une centaine de requêtes, dont le HTML de la page, du CSS (style), des scripts, des requêtes d'espionnage,
des images, ... Heureusement, les informations dont nous avons besoin sont dans le HTML.
Créez un nouveau projet scrapping. Ensuite, créer un fichier hardloop_parser.py.
Installez la bibliothèque BeautifulSoup (visitez le site de Pypi pour trouver le nom exact).
Dans ce fichier, écrivez une fonction get_info(url_product) qui prend en entrée l'URL d'un produit
et renvoie dans un dictionnaire :
- La marque
- Le nom du produit
- Le prix
- La couleur
- La description du produit
- Les spécificités techniques
TODO
Nous voulons maintenant extraire tous les produits du site. Pour cela, nous voulons visiter toutes les
pages indexant les produits. La liste de ces pages se trouve dans le menu du haut (par exemple, Vestes Homme.
Écrivez une fonction get_product_pages(url) qui, étant donné une url, retourne la liste de toutes
les pages produits. Testez votre code dans la fonction main.
TODO
Écrivez une fonction get_all_product_page(url_page) qui prend en entrée une page indexant des
produits et qui retourne la liste des URLs des produits sur cette page. Testez votre code dans la fonction
main.
TODO
Sur une page produit, nous ne pouvons accéder qu'à un nombre limité de produits. Pour en obtenir plus, il nous
faut changer de page. Écrivez une fonction get_page(url, k) qui prend en entrée une URL d'une page
produit et renvoie l'URL de la page k. Pour cette question, vous n'avez pas le droit de lire le code source
d'aucune page !
Regardez l'URL : le paramètre p donne le numéro de la page.
TODO
Comment savoir si nous avons atteint la dernière page ?
Nous avons atteint la dernière page quand le code source contient la phrase : Aucun produit disponible.
Finalement, écrivez une fonction get_all_products_category(url_category) qui obtient les
informations des tous les produits dans cette catégorie sous la forme une liste de dictionnaires.
Nous pourrions faire une autre fonction extrayant tous les produits du site, mais pas soucis de temps et pour éviter de spammer le site, nous nous arrêterons là.
Dans la pratique, il faudrait enregistrer ces produits dans une base de données. Pour des expérimentations
rapides, PickleDB est souvent utilisé.
Nous pourrions faire une autre fonction extrayant tous les produits du site, mais pas soucis de temps et pour éviter de spammer le site, nous nous arrêterons là.
Visitez la page permettant de voir les permissions données aux robots. Pouvez-vous obtenir l'adresse du
sitemap ?
Il faut visiter la page https://www.hardloop.fr/robots.txt. On
voit qu'il y a deux sitemaps : https://www.hardloop.fr/1_fr_index_sitemap.xml
et https://www.hardloop.fr/sitemap-silo-marques.xml.
Comment pourrions-nous obtenir la liste de tous les produits rapidement ? Est-ce que tous les produits existent
encore ? Comment pourrions restreindre le nombre de produits à visiter ?
Le sitemap contient la liste de tous les produits, il suffit de le télécharger une seule fois ! Cependant, tous
les produits n'existent pas, car le site continue d'indexer des produits épuisés. Il faudra donc pouvoir traiter
ces pages particulières. Par contre, nous pourrions utiliser le champ lastmod du sitemap pour éviter de
visiter les pages non modifiées depuis trop longtemps.
Un comparateur de prix (∼60mn, – medium)
Dans cet exercice, nous allons construire un comparateur de prix plus compliqué pour trouver une maison.
À l'aide de votre navigateur, analysez le traffic réseau sur le site de vente de biens immobiliers
Bien Ici. Essayez de faire une recherche de bien. L'information sur les biens
est-elle contenu dans la page statique ? Si non, quelle est la requête contenant les informations recherchées ?
L'information que nous recherchons n'est pas sur le HTML, il faut donc comprendre d'où vient l'information. Ici,
elle vient d'une requête commençant par https://www.bienici.com/realEstateAds.json?filters= et renvoyant
un JSON.
Créez un nouveau fichier bienici_scrapper.py. Dans ce fichier, écrivez une fonction
get_example_info() qui reproduit la requête que vous avez observée dans votre navigateur, et renvoie
la sortie JSON parsée (i.e., comme un dictionnaire et non comme une string).
TODO
Quels sont les paramètres de cette requête (essayé de faire varier les paramètres depuis l'interface web) ? Quel
paramètre semble le plus compliqué à obtenir ?
Nous avons de nombreux paramètres comme le nombre de résultats, le type de transaction (achat), le prix maximum,
le nombre de pièces maximal, ... Le paramètre le plus compliqué semble être le zoneId qui correspond à la ville
de recherche.
Proposez une méthode pour obtenir l'identifiant d'une ville. Implémentez-la dans une fonction
get_zoneid(name).
Nous pouvons utiliser le champ de recherche.
TODO
Écrivez une fonction get_all_houses(name, properties) qui renvoie la liste de toutes les maisons
à vendre dans la ville name et respectant les propriétés dans properties.
TODO