• 6 heures
  • Facile

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 19/11/2021

Extrayez et transformez des données avec l’extraction web

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Qu’est-ce que l’extraction de données web ?

L’extraction de données web est un processus automatique de récupération (ou extraction) des données d’un site web. Au lieu de collecter des données manuellement, vous pouvez écrire des scripts Python (une façon contournée de dire des processus de code) qui peuvent collecter des données à partir d’un site web et les sauvegarder dans des fichiers .txt ou .csv.  

Imaginons que vous soyez expert marketing. Vous êtes en train de préparer une campagne pour un nouveau type de veste. Ce serait utile de collecter des informations comme le prix et la description de vestes similaires. Au lieu de rechercher et copier/coller manuellement les informations dans un tableur, vous pouvez écrire du code Python pour collecter des données automatiquement à partir d’internet et les sauvegarder dans un fichier CSV.

Dans les deux prochains chapitres, je vais vous guider pas à pas dans un exercice d’extraction de données. Vous allez apprendre de nouvelles choses et pratiquer certains outils que vous avez déjà utilisés avant, comme les fonctions et les variables. Assurez-vous de suivre les indications de votre éditeur. Vous apprendrez mieux si vous réalisez les étapes de votre côté en même temps ! 

Pour cet exercice d’extraction, nous allons extraire des nouvelles et des communications du site web d’informations et des services du gouvernement du Royaume-Uni (https://gov.uk), transformer les données dans le format désiré et charger les données dans un fichier CSV.  

L’extraction de données web vous permet de collecter des données à partir du web.
L’extraction de données web vous permet de collecter des données à partir du web.

ETL : Extraire, Transformer, Charger

ETL signifie extraction, transformation et chargement (Extract, Transform, Load en anglais). C’est une procédure qui "permettant d'effectuer des synchronisations massives d'information d'une source de données (le plus souvent une base de données) vers une autre" (source Wikipédia). C’est une manière compliquée de nommer le processus qui sert à récolter des données à un endroit, à les manipuler un peu et à les sauvegarder dans un autre endroit.  

L’extraction de données web est une forme d’ETL : vous extrayez des données à partir d’un site web, vous les transformez dans le format que vous voulez et vous les chargez dans un fichier CSV (ou dans une base de données).

Pour extraire les données à partir d’internet, vous devez connaître quelques bases à propos du HTML, la structure de chaque page internet que vous voyez sur internet. Si vous n’avez encore jamais utilisé HTML, ne vous inquiétez pas, ce chapitre contient tout ce qu’il faut savoir pour l’extraction.

Lisez les balises HTML essentielles

Le HTML est le langage utilisé pour toutes les pages internet que vous voyez sur internet. Si vous faites un clic droit sur n’importe quel site web (même ici) et que vous sélectionnez Voir la page source (ou Afficher le code source), vous verrez le code HTML utilisé pour afficher ce que vous voyez. 

Le HTML est conçu avec une structure en arborescence appelée DOM (Document Object Model). La structure DOM comprend différentes balises qui peuvent s’emboîter les unes les autres. Certaines balises représentent chaque partie d’une page HTML et la plupart des éléments ont des balises d’ouverture et de fermeture.

Une balise d’ouverture ressemble à ça :  <nom_element>. Une balise de fermeture a le même  nom_element, mais avec  /  devant :  </nom_element>. Par exemple, chaque page a une balise d’ouverture  <html>  et une balise de fermeture  </html>. Toutes les informations que vous voulez dans cet élément doivent être entre ces deux balises.

Le HTML est conçu avec une structure en arborescence appelée DOM.
Le HTML est conçu avec une structure en arborescence appelée DOM.

De nombreux types de balises existent, chacun représentant différents éléments que vous pouvez ajouter à la page. Voici les plus classiques :

  • <p>  pour un paragraphe. 

  • <b>  pour un élément en gras. 

  • <a>  pour un lien hypertexte.

  • <div>  une nouvelle section ou division.

La balise HTML représente le niveau supérieur de l’arborescence DOM et le reste des balises sont comme les enfants des balises parentes correspondantes.

Deux choses importantes à connaître sur les balises HTML : les attributs class et id qui donnent des identifiants à différents éléments HTML. Par exemple, si vous voulez identifier tous les éléments de  « vetements »  dans un seul identifiant, vous pouvez écrire le code ci-dessous :

<p class="vetements">chemise</p>
<p class="vetements">chaussettes</p>

De cette manière, vous savez que tous les éléments avec la classe  « vetements »  contiendront un élément lié aux vêtements à l’intérieur. Vous pouvez utiliser cette classe « vetements » plus tard pour que tous les éléments soient marqués avec la même classe.

De la même manière, pour avoir tous les titres et les descriptions du site d’informations et de services britanniques, nous pouvons trouver la class ou l’id de chacun de ces éléments. Nous pouvons utiliser le bouton « Voir la page source » pour voir le code HTML de la page et chercher l’identifiant voulu.  

Si vous faites défiler la page source ou utilisez  ctrl  +  f  pour trouver le premier titre d’actualité, vous pouvez voir que le titre et la description sont directement dans le HTML !

Voici un exemple de code HTML que nous voulons extraire de la page web :

<li class="gem-c-document-list__item">
<a data-ecommerce-path="/government/news/restart-of-the-uk-in-japan-campaign--2" data-ecommerce-row="1" data-ecommerce-index="1" data-track-category="navFinderLinkClicked" data-track-action="News and communications.1" data-track-label="/government/news/restart-of-the-uk-in-japan-campaign--2" data-track-options='{"dimension28":20,"dimension29":"Restart of the UK in JAPAN campaign"}' class="gem-c-document-list__item-title gem-c-document-list__item-link" href="/government/news/restart-of-the-uk-in-japan-campaign--2">
Restart of the UK in JAPAN campaign
</a>
<p class="gem-c-document-list__item-description">
The British Embassy, British Consulate-General and the British Council, in partnership with principal partners Jaguar Land Rover and Standard Chartered Bank are proud to announce the resumption of our ambitious UK in JAPAN c…
</p>
</li>

Ne paniquez pas en voyant tout ce code ! Vous devez juste chercher l’élément class du titre et de la description. Ne vous inquiétez pas si vous ne la trouvez pas immédiatement, nous allons voir ça en détail plus tard. 😉

Puisque cette information est disponible sur le web, nous pouvons écrire un script Python pour extraire les données que nous voulons directement depuis la page. Nous allons nous aider de Requests et de Beautiful Soup !

Le package Requests

Pour extraire des données à partir d’un site web, nous devons utiliser le package Requests. Rappelez-vous qu’elle fournit la fonctionnalité de faire des requêtes HTTP. Nous pouvons l’utiliser puisque nous essayons d’obtenir des données à partir d’un site web qui utilise le protocole HTTP (par exemple, http://google.com). 

Le package Requests contient une fonction .get()qui peut être utilisée pour récupérer le code HTML du site.  

Pour appliquer ça à l’exercice d’extraction de données web, nous allons utiliser le package Requests pour obtenir le code HTML de la page d’informations et de communication britanniques. Dans le code ci-dessous, nous importons le package, nous sauvegardons l’URL que nous voulons extraire dans une variable url, et nous utilisons la méthode .get()pour récupérer les données HTML. Si vous exécutez le code ci-dessous, vous verrez le code source HTML affiché dans la console. 

import requests
url = "https://www.gov.uk/search/news-and-communications"
page = requests.get(url)
# Voir le code html source
print(page.content)

 Même si nous avons tout le code HTML sauvegardé dans notre code, c’est encore incompréhensible. Il nous faut encore savoir comment parser les éléments exacts que nous voulons. Et nous pouvons utiliser Beautiful Soup pour faire ça !

Le package Beautiful Soup

Maintenant que nous avons le code source HTML, nous devons le parser. On parse le HTML avec les attributs HTML  class  et  id  mentionnés plus tôt.

Nous pouvons utiliser Beautiful Soup pour trouver les éléments qui peuvent être identifiés avec la class et l’id que nous voulons trouver. Comme pour n’importe quel package, nous allons utiliser pip pour installer Beautiful Soup.

pip install beautifulsoup4

Ensuite, nous allons importer Beautiful Soup et créer un objet « soup » à partir du HTML que nous avons eu avec les requêtes :

import requests
from bs4 import BeautifulSoup
url = "https://www.gov.uk/search/news-and-communications"
page = requests.get(url)
soup = BeautifulSoup(page.content, 'html.parser')

 La variable  soup  que nous avons créée avec Beautiful Soup possède toutes les fonctions qui facilitent l’obtention de données à partir de HTML. Avant de récupérer les données de la page d’informations et de communications britanniques, nous allons parcourir certaines fonctionnalités de Beautiful Soup avec l’extrait HTML ci-dessous.

<html>
<head><title>Les chiens les plus mignons</title></head>
<body>
<p class="title"><b>Les meilleures races de chiens</b></p>
<p class="chiens">Il existe de nombreuses races de chiens géniales et les meilleures sont :
<a href="http://exemple.com/labradoodle" class="race" id="lien1">LabraDoodle</a>,
<a href="http://exemple.com/retriever" class="race" id="lien2">Golden Retriever</a> et
<a href="http://exemple.com/carlin" class="race" id="lien3">Carlin</a>
</p>
</body>
</html>

Une fois qu’on a créé un objet « soup » à partir du HTML, nous pouvons accéder à tous les éléments de la page très facilement !

# Récupération du titre de la page HTML
>> soup.title
<title><Les chiens les plus mignons></title>
# Récupération de la chaîne de caractères du titre HTML
>> soup.title.string
"Les chiens les plus mignons"
# Trouver tous les éléments avec la balise <a>
>>soup.find_all('a')
[ <a href="http://exemple.com/labradoodle" class="race" id="lien1">LabraDoodle</a>,
<a href="http://exemple.com/retriever" class="race" id="lien2">Golden Retriever</a>,
<a href="http://exemple.com/carlin" class="race" id="lien3">Carlin</a>]
# Trouver les éléments avec l’id du « lien1 »
>> soup.find(id="lien1")
<a href="http://exemple.com/labradoodle" class="race" id="lien1">LabraDoodle</a>
#Trouver tous les éléments p avec la classe « title »
>> soup.find_all("p", class_="title")
"Les meilleures races de chiens"

Et ce n’est qu’un aperçu de la façon dont Beautiful Soup peut vous aider à obtenir facilement les éléments spécifiques que vous voulez à partir d’une page HTML. Vous pouvez obtenir des éléments par leur balise, ID ou classe.

Appliquons cela à l’exercice du site d’informations et de services britanniques. Nous avons déjà converti la page en objet « soup » avec cette ligne  soup = BeautifulSoup(page.content, 'html.parser')  .

Voyons maintenant quelles données nous pouvons obtenir de la page d’informations et communications. D’abord, allons récupérer les titres de toutes les histoires. Après avoir inspecté la page HTML, nous pouvons voir que tous les titres sont dans les éléments « lien » indiqués par la balise  <a>  et ont la même classe :gem-c-document-list__item-title.  

Voici un exemple :

<a data-ecommerce-path="/government/news/restart-of-the-uk-in-japan-campaign--2" data-ecommerce-row="1" data-ecommerce-index="1" data-track-category="navFinderLinkClicked" data-track-action="News and communications.1" data-track-label="/government/news/restart-of-the-uk-in-japan-campaign--2" data-track-options='{"dimension28":20,"dimension29":"Restart of the UK in JAPAN campaign"}' class="gem-c-document-list__item-title gem-c-document-list__item-link" href="/government/news/restart-of-the-uk-in-japan-campaign--2">Restart of the UK in JAPAN campaign</a>

Nous pouvons utiliser les deux ensemble pour avoir une liste de tous les éléments title :

titres = soup.find_all("a", class_="gem-c-document-list__item-title")

 On obtient une liste de tous les éléments avec la classe  gem-c-document-list__item-title  . Pour voir la valeur de la chaîne dans un élément, nous pouvons parcourir chaque élément dans la liste et afficher la chaîne de l’élément.

>> for title in titres:
... print(title.string)
"Restart of the UK in JAPAN campaign"
"Joint Statement on the use of violence and repression in Belarus"
"Foreign Secretary commits to more effective and accountable aid spending under new Foreign, Commonwealth and Development Office"
"UK military dog to receive PDSA Dickin Medal after tackling Al Qaeda insurgents."

Regardez la capture vidéo ci-dessous pour suivre les étapes d’extraction du HTML de la page web, trouver les bons identifiants des titres et afficher uniquement les chaînes de caractères de chaque titre.

Maintenant que vous savez comment récupérer les titres de la page, essayez vous-même avec les descriptions de la page ! Nous allons couvrir le reste ci-dessous.

Les descriptions sont dans une balise  <p>  et ont la classe  gem-c-document-list__item-description  , comme vous pouvez le voir ici :

<p class="gem-c-document-list__item-description">Joint Statement by the Missions of the United States, the United Kingdom, Switzerland and the European Union on behalf of the EU Member States represented in Minsk on the use of violence and repression in Belarus</p>

Pour avoir toutes ces descriptions, écrivez :

descriptions = soup.find_all("p", class_="gem-c-document-list__item-description")

 Bien, nous avons passé en revue toutes les étapes, c’est à vous de regarder le code maintenant. Téléchargez le fichier de code script_p3c2.py de ce dossier. Lisez-le et vérifiez que vous le comprenez entièrement.

Maintenant que vous avez réussi à extraire des données web, vous allez les transformer dans le format dans lequel vous voulez les sauvegarder. 

Transformez des données

Vous transformez des données quand vous les convertissez d’un format à l’autre. Ça peut être aussi simple que de convertir une chaîne de caractères en une liste, mais ça peut aussi concerner la transformation de milliers de listes en dictionnaires. Généralement, ça nécessite d’associer différents points de données. Il y a plusieurs façons de transformer des données et la décision dépend finalement du type de données et du format que vous voulez avoir.

Voici quelques exemples de transformation de données :

  • Convertir un format de champ de date de « 28 décembre 2019 » à 28/12/19. 

  • Convertir une somme d’argent de dollars en euros. 

  • Standardiser les adresses e-mail ou postales. 

Pour l’exemple des informations et communications britanniques, nous allons sauvegarder tous les titres et les descriptions de la page HTML dans une liste de chaînes de caractères. Au lieu d’afficher les informations des chaînes dans le terminal comme vous venez de le faire, nous voulons sauvegarder les éléments dans une liste :

titres_bs = soup.find_all("a", class_="gem-c-document-list__item-title")
titres = []
for titre in titres_bs:
titres.append(titre.string)

Ici nous avons commencé avec une liste vide appelée titres. Ensuite nous avons fait une boucle pour tous les éléments dans la liste titres_bs et ajouté uniquement la chaîne des titres dans la liste « titres ». Maintenant, la liste titres contiendra une liste de chaînes de tous les titres de la page HTML.  

Pour parcourir les lignes de ce code une par une, regardez la capture vidéo ci-dessous !

Suivez la même approche pour extraire et sauvegarder les descriptions de la page.

descriptions_bs = soup.find_all("p", class_="gem-c-document-list__item-description")
descriptions = []
for desc in descriptions_bs:
descriptions.append(desc.string)

En résumé

  • L’extraction de données web est un processus automatisé de récupération des données d’internet.

  • ETL signifie extraction, transformation et chargement. C’est un acronyme très utilisé dans la programmation, pour désigner le processus de récupération de données d’un endroit, de modification légère de ces données et de leur sauvegarde dans un autre endroit.

  • HTML est la structure de n’importe quelle page web et la compréhension de cette structure va vous aider à savoir comment récupérer les données dont vous avez besoin.

  • Requests et Beautiful Soup sont des packages Python tiers qui peuvent vous aider à récupérer et parser les données d’internet.

  • Parser des données signifie les préparer pour les transformer, les sauvegarder ou les utiliser.

Maintenant que vous avez vu comment extraire et transformer des données web, vous allez apprendre à charger des données web !

Exemple de certificat de réussite
Exemple de certificat de réussite