Tuto Web scraping Python : Extraire les données d'un site web

  

Table des matières:

Introduction

  1. Définition du Web Scrapping
  2. Pourquoi faire du web Scrappring avec Python ?
  3. Web Scraping , pratique légale ?
  4. Les différentes étapes pour scrapper un site web
  5. Les libraires utilisées dans le web Scrapping
  6. Exemple de Web Scrapping : Scraping AMAZON

6.1. Choix de l’URL de la page

6.2. Inspecter la page web

6.2.1. Classe des noms de produits :

6.2.2. Classe des prix

6.2.3. Classe des constructeurs

6.2.4. Classe des nombres de votes

  1. Le code

7.1. Installation des packages nécessaires

7.2. Importation des librairies

7.3. Extraction des noms de produits

7.4. Extraction des prix des produits

7.5. Extraction des noms de constructeurs des produits :

7.6. Extraction des nombre d’avis des produits

  1. Un autre Exemple , Scrapping du site FlipKart

8.1. Inspection de la page web

8.1.1. Classe produits

8.1.2. Classe prix

8.1.3. classe valeur de la remise sur le produit

8.1.4. classe rating

8.2. Le code

8.3. Importation des librairies nécessaires

8.4. Connexion à la page

8.5. Extraction des noms des produits

8.6. Extraction des prix des produits

8.7. Extraction de la valeur de remise sur le produit

8.8. Extraction des ratings des produits

  1. Enregistrer les données sous le format .CSV

Conclusion

Introduction 

Bonjour et bienvenue dans un nouveau tutoriel Python, aujourd’hui nous allons découvrir une nouvelle notion en programmation . Il s’agit du web Scraping , c’est une méthode très populaire qui permet d’extraire des données des sites web . Dans ce cours , vous allez comprendre ce qu’est le scrapping , les étapes essentielles de cette pratique ainsi que quelques exemples afin de vous familiariser avec la notion .

1. Définition du Web Scrapping

Le Web Scraping est une pratique informatique utilisée pour extraire un large ensemble de données non structurées à partir de sites web .  Cette méthode permet de collecter des données non structurées et les enregistrer dans un format structuré. Il existe plusieurs méthodes pour scraper un site web comme les services en ligne , les API ou bien à partir de vos propres codes . Dans ce  tutoriel , nous allons voir comment implémenter cette méthode avec Python .

2. Pourquoi faire du web Scrappring avec Python ?

Voici une liste des caractéristiques Python qui justifient pourquoi c’est le langage le mieux adapté pour le web scraping :

  • Facilité d’utilisation : Python est très simple à coder , vous n’aurez pas à utiliser des points-virgules à chaque retour de ligne ou bien des accolades à chaque début de condition. La notion d’indentation permet aussi d’avoir un code propre et lisible .
  • Large collection de librairies : Python dispose d’une immense collection de librairies comme Numpy , Matplotlib , Pandas etc .. Chose qui permet de fournir à l’utilisateur plusieurs méthodes et services pour différentes raisons. En plus , il vous sera très utile dans le traitement des données extraites du site .
  • Langage non typé : l’une des qualités de Python est que vous ne devez pas définir les types des variables. Vous pouvez les utiliser directement quand vous souhaitez . Cette pratique permet de gagner du temps .
  • Syntaxe facilement compréhensible : La syntaxe de Python est facilement compréhensible vu qu’elle est très similaire à la langue anglaise. La notion d’indentation facilite aussi la tâche vu qu’elle permet de séparer les blocs du code .
  • Moins de code , plus d’efficacité : le web scrapping a pour but de vous faire gagner du temps ! mais on ne veut pas écrire de longs programmes qui vont consommer le temps gagné ! Heureusement qu’en Python, de petits programmes exécutent des tâches immenses.
  • Communauté : Supposons que vous avez rencontré une difficulté ou une erreur lors de la programmation ? Pas besoin de vous affoler . Python a l’une des plus grandes communautés actives dans le monde de la programmation ou vous pouvez poser toutes vos questions et avoir des réponses convaincantes à ses dernières .

3. Web Scraping , pratique légale ?

Quand on parle de Web Scraping , une question importante se pose : est-ce une pratique légale ou pas ? Quelques sites permettent le web scraping contrairement à d’autres. Cette information peut être recueillie du fichier robots.txt du site . Par exemple, si je veux scraper le site web Amazon alors pour voir son fichier robots.txt il suffit de taper l’URL suivante : https://www.amazon.com/robots.txt

4. Les différentes étapes pour scrapper un site web 

Quand vous exécutez le code pour scrapper un site web , une requête est envoyée à l’URL que vous avez mentionnée auparavant . Pour répondre à cette requête , le serveur envoie les données et vous permet de lire les pages HTML ou XML . Par la suite, le code analyse les pages HTML et XML , trouve les données puis les extraits .

Voici les étapes essentielles pour scrapper un site web en utilisant Python :

  1. Trouver l’URL du site à scrapper .
  2. Inspecter la page .
  3. Trouver les données que vous voulez extraire.
  4. Coder le script de scraping .
  5. Exécution du script et extraction des données .
  6. Stocker les données sous le format requis .

5. Les libraires utilisées dans le web Scrapping

Comme nous le savons tous, Python a plusieurs applications et dispose de différentes librairies pour différents usages . Dans notre cas , nous allons utiliser les librairies suivantes :

  • Urllib :  C’est un package qui contient plusieurs modules pour  traiter les requêtes en relation avec les URL .
  • BeautifulSoup: Beautiful Soup est un package utilisé pour parser les documents HTML et XML . ll permet de créer des arbres des recherches chose qui facilite l’extraction des données.
  • Pandas: Pandas est une librairie utilisée pour la manipulation et l’analyse des données. Elle est utilisée pour extraire les données ou bien les stocker dans le format recherché.

6. Exemple de Web Scrapping : Scraping AMAZON

Dans ce premier exemple , nous allons scrapper les ventes du site web AMZAON afin d’obtenir les produits , leur prix ainsi que leurs descriptions et les stocker dans un fichier .csv. Vous connaissez sans doute Amazon, l’une des plus grandes  entreprises de commerce en ligne basée à Seattle . Nous nous intéresserons dans ce tutoriel au site Amazon.com que nous voulons scraper .

6.1. Choix de l’URL de la page

La première étape avant de scraper un site web est de choisir l’URL du site web . Dans notre cas, nous allons travailler sur la page de vente des jeux vidéo :

6.2. Inspecter la page web

La deuxième étape du processus consiste à inspecter la page web . Généralement, les données sont imbriquées dans des structures qu’on appelle tags . Donc , nous devons absolument inspecter les pages et chercher l’emplacement des données que nous voulons extraire. Pour cela, faites un clic droit sur n’importe quel élément de la page et cliquez sur inspecter. Une fenêtre similaire à celle-là doit apparaitre :

Nous devons chercher les classes des éléments que nous voulons  récupérer . Pour cela , nous allons procéder de la manière suivante :

6.2.1. Classe des noms de produits :

Nous voulons récupérer le nom du produit ‘DualSense Wireless Controller ‘, le prix ‘ 69$’, le constructeur ‘PlayStation ‘ et le nombre de votes ‘4952’.

Quand on clique sur inspecter l’élément et on choisit par exemple le nom , vous allez voir l’apparition de la classe qui le contient en HTML :

Nous pouvons donc constater que la classe qui contient les noms des produits est :

6.2.2. Classe des prix

Maintenant si nous voulons récupérer la classe des prix on fait la même chose :

Donc la classe qui contient les prix est : . Il nous reste deux petites classes à récupérer et puis on passera au code !

6.2.3. Classe des constructeurs 

À l’inspection d’un constructeur de produit , Nintendo par exemple , on obtient dans la console d’inspection d’éléments le résultat suivant :

Alors , la classe qui contient les constructeurs des produits est la suivante :  

6.2.4. Classe des nombres de votes

Finalement , on récupère la dernière classe des nombres de votes par produit .

La classe qu’on veut récupérer . En gros , voici un tableau qui résume tout ce que nous avons fait dans cette section.

Attributs à extraire

Classe d’appartenance

Nom du produit

Prix du produit

Constructeur du produit

Nombre de votes du produit

Nous allons passer à présent à la programmation du script qui permettre de scrapper les données souhaités .

7. Le code

7.1. Installation des packages nécessaires

Vous devez installer urrlib et beautiful soup , voici les commandes qui permettent leur installation :

Syntaxe :

! pip install beautifulsoup4
! pip install urrlib.request

7.2. Importation des librairies

On commence tout d’abord par importer les 3 librairies suivantes : pandas , BeautifulSoup et urllib.request :

import pandas as pd
from bs4 import BeautifulSoup as bs
import urllib.request

On définit par la suite la variable url qui va contenir l’url de la page à scrapper :

Syntaxe :

url='https://www.amazon.com/b?node=16225016011&pf_rd_r=8YTV1WEXADBMR34Q87RX&pf_rd_p=e5b0c85f-569c-4c90-a58f-0c0a260e45a0'

On ouvre la page de l’URL grâce à la fonction urrlib.request.urlopen :

page=urllib.request.urlopen(url,timeout=5)

N’oubliez pas le paramètre timeout il est très important ! Ensuite , on charge le code de la page grâce à Beautiful soup :

Syntaxe :

soup=bs(page)
soup

Résultat de l’exécution :

Voici le résultat de ce bout de code , le code HTML de la page :

Maintenant que nous avons  établi la connexion à la page et récupéré son code source , nous allons passer à la partie extraction de données. L’extraction des données va se faire dans les quatre cas par la fonction find_all de la librairie Beautifulsoup .Elle prend en entrée le tag de la classe et son nom .

7.3. Extraction des noms de produits

Dans le premier cas , les noms des produits sont stockés dans des tags de type h2 ( titre de deuxième niveau ) . Donc la fonction find_all va prendre h2 et le nom de la classe des produits ( voir le tableau en haut) comme paramètres .

Syntaxe :

prod= soup.find_all('h2', {'class': 'a-size-mini a-color-base apb-line-clamp-3 a-text-normal'})
prod

Résultat de l’exécution :

Comme vous pouvez le constater, le code retourne tous les produits présentés dans la page : ‘DualSense Wireless Controller , Cyberpunk 2007 …’ . Mais ! Ce n’est pas  très clair, nous allons donc utiliser la fonction text de soup qui supprimera lest tags autour des produits .

Syntaxe :

produits=[]
for e in prod :
e=e.text
e=e.replace('\n','')
produits.append(e)
produits

On commence par initier une liste vide qui va contenir les produits. La boucle permettra de traiter tous les produits dans prod . La fonction text va extraire les noms, le e.replace(‘/n’ , ‘ ‘ ) va servir à remplacer le tag /n par un espace .

Résultat de l’exécution :

7.4. Extraction des prix des produits

Nous allons établir la même chaine de traitement sur les produits . On commence par trouver les prix grâce à find_all . Dans ce cas , les prix sont stockés dans un tag de type ‘span’ .

Syntaxe :

pri_tot= soup.find_all('span', {'class': 'a-price-whole'})
pri_tot

Nous allons faire le même traitement  pour les produits afin d’extraire les prix des produits uniquement.

Syntaxe :

prix_initials = []
for e in pri_tot :
e = e.text
prix_initials.append (e)
prix_initials

Résultat de l’exécution :

Vous remarquerez peut être que le nombre des prix est inférieur à celui des produits . C’est normal, quelques prix de produits ne sont pas renseignés sur la page vu leur indisponibilité actuelle .

7.5. Extraction des noms de constructeurs des produits :

Nous allons maintenant extraire les noms des constructeurs de produits, plus besoin d’expliquer les étapes car elles sont similaires à celles d’en haut !

Syntaxe :

prix_initials = []cons= soup.find_all('span', {'class': 'a-size-base a-color-secondary a-text-normal'})
cons
for e in pri_tot :
e = e.text
prix_initials.append (e)
prix_initials

Résultat de l’exécution :

Syntaxe :

constructeurs=[]
for e in cons:
e=e.text
e=e.replace('by','')
constructeurs.append(e)
constructeurs

Résultat de l’exécution :

7.6. Extraction des nombre d’avis des produits 

Syntaxe :

number_reviews=soup.find_all('span',{'class':'a-size-small a-color-link'})
number_reviews

Résultat de l’exécution :

Syntaxe :

reviews=[]
for e in number_reviews:
e=e.text
reviews.append(e)
reviews

Résultat de l’exécution :

8. Un autre Exemple , Scrapping du site FlipKart

Dans ce deuxième exemple, nous allons scrapper les données d’un site de ventes nommé FlipKart . L’url que nous allons utiliser est la suivante : 'https://www.flipkart.com/laptops-store?otracker=nmenu_sub_Electronics_0_Laptops' .

8.1. Inspection de la page web 

La première étape dans le processus est l’inspection de la page web et l’extraction des classes.

8.1.1. Classe produits

La première classe à rechercher est celle des noms des produits . Après inspection de la page, on trouve que la classe des produits est la suivante :

8.1.2. Classe prix

La classe correspondante aux prix des produits est :

8.1.3. classe valeur de la remise sur le produit

Nous allons extraire même les informations relatives aux produits :

Classe :

8.1.4. classe rating

Finalement, nous allons extraire la classe de la moyenne des avis sur le produit :

Classe ratings :

8.2. Le code

Nous allons passer à l’étape de l’installation des packages nécessaires car vous les avez déjà installé dans l’exemple précédent.

8.3. Importation des librairies nécessaires

Syntaxe :

from bs4 import BeautifulSoup as bs
import pandas as pd
import urllib.request

8.4. Connexion à la page 

Syntaxe :

url = 'https://www.flipkart.com/laptops-store?otracker=nmenu_sub_Electronics_0_Laptops'
page = urllib.request.urlopen(url,timeout=20)
soup = bs(page)
soup

Résultat de l’éxécution :

8.5. Extraction des noms des produits

Syntaxe :

# find all products of the site
products= soup.find_all('div', {'class': '_1W9f5C'})
products

produits=[]
for e in products :
e=e.text
produits.append(e)

Résultat de l’éxécution :

8.6. Extraction des prix des produits

Syntaxe :

# Trouver les prix
prices= soup.find_all('div', {'class': '_30jeq3 UMT9wN'})
prices
prix=[]
for e in prices :
e=e.text
prix.append(e)

Résultat de l’éxécution :

8.7. Extraction de la valeur de remise sur le produit

Syntaxe :

rem=soup.find_all('div',{'class': '_3Ay6Sb _2FuKQX'})
rem
remise=[]
for e in desc :
e=e.text
remise.append(e)

Résultat de l’éxécution :

8.8. Extraction des ratings des produits

Syntaxe :

rat=soup.find_all('div',{'class': '_3LWZlK'})
rat
ratings=[]
for e in rat :
e=e.text
ratings.append(e)

Résultat de l’éxécution :

9. Enregistrer les données sous le format .CSV

Nous voilà arrivés à la dernière étape du scrapping, nous avons récupéré les données certes ! Mais il faut les structurer et stocker quelque part afin de pouvoir les utiliser par la suite. Nous allons donc les enregistrer dans un fichier .CSV :

Syntaxe :

df = pd.DataFrame({'Product Name':produits,'Price':prix,'Description':description,'Ratings':ratings})
df.to_csv('products.csv', index=False, encoding='utf-8')

On crée une dataframe qui contient les colonnes des caractéristiques qu’on a extraites auparavant puis on enregistre le tout au format .CSV :

data = pd.read_csv('products.csv')
data

Résultat de l’éxécution :

Version Excel :

Conclusion 

Nous sommes arrivés à la fin de ce tutoriel, vous avez à présent compris le principe du web scrapping et comment inspecter les pages web pour vous faciliter la tâche ! À vous de jouer maintenant, nous invitons vivement à créer vos propres bases de données grâce à ses méthodes ! Bon courage et à un prochain tutoriel !

Article publié le 29 Décembre 2020par Mouna HAMIM