CSC 4538 – Introduction à la science des données

Portail informatique

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
Testez votre code dans une fonction main.
:
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.
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 ?

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