Tuto Web scraping Python : Extraire les données d'un site web
Rédigé par Mouna HAMIM, Publié le 29 Décembre 2020, Mise à jour le Dimanche, 03 Janvier 2021 06:29
Table des matières:
- Définition du Web Scrapping
- Pourquoi faire du web Scrappring avec Python ?
- Web Scraping , pratique légale ?
- Les différentes étapes pour scrapper un site web
- Les libraires utilisées dans le web Scrapping
- Exemple de Web Scrapping : Scraping AMAZON
6.1. Choix de l’URL de la page
6.2.1. Classe des noms de produits :
6.2.3. Classe des constructeurs
6.2.4. Classe des nombres de votes
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
8.1. Inspection de la page web
8.1.3. classe valeur de la remise sur le produit
8.3. Importation des librairies nécessaires
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
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 :
- Trouver l’URL du site à scrapper .
- Inspecter la page .
- Trouver les données que vous voulez extraire.
- Coder le script de scraping .
- Exécution du script et extraction des données .
- 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 : <h2 class= ‘a-size-mini a-color- base apb-line-clamp-3 a-text-normal ‘ >
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 : <span class=’a-price-whole’> . 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 : <span class=’ a-size-base a-color-secondary a-text-normal’ >
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 <span class= ‘ a-size-small a-color-link’ > . 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 |
<h2 class= ‘a-size-mini a-color- base apb-line-clamp-3 a-text-normal ‘ > |
Prix du produit |
<span class=’a-price-whole’> |
Constructeur du produit |
<span class=’ a-size-base a-color-secondary a-text-normal’ > |
Nombre de votes du produit |
<span class= ‘ a-size-small a-color-link’ > |
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 :
<div class= ‘ 1_W9f5C’>
8.1.2. Classe prix
La classe correspondante aux prix des produits est :
<div class="_30jeq3 UMT9wN">
8.1.3. classe valeur de la remise sur le produit
Nous allons extraire même les informations relatives aux produits :
Classe : <div class=’ _3Ay6Sb _2FuKQX’>
8.1.4. classe rating
Finalement, nous allons extraire la classe de la moyenne des avis sur le produit :
Classe ratings : <div class=’_3LWlK’>
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 !