Les données sont devenues le carburant de la croissance des entreprises au cours de la dernière décennie. L’internet est la principale source de données, avec 5 milliards d’utilisateurs générant des milliards de points de données chaque seconde, ce qui constitue le Big Data. L’analyse des données web peut aider les entreprises à découvrir des informations qui leur permettront d’atteindre leurs objectifs commerciaux. Cependant, la collecte d’un grand volume de données n’est pas facile pour les entreprises. Surtout si ces dernières pensent encore que le bouton « Exporter vers Excel » (s’il existe) et le traitement manuel sont les seules options pour extraire les données. C’est là qu’intervient le web scraping avec BeautifulSoup.

Le web scraping permet aux entreprises d’automatiser les processus de collecte de données sur le web à l’aide de robots ou de scripts automatisés appelés web crawlers.

Dans article, sous forme de tutoriel exhaustif, nous allons mettre en lumière l’un des outils les plus utilisés pour le web scraping : Beautiful Soup. Nous verrons tous les aspects importants de cette librairie notamment ce qu’il est, pourquoi il est important et comment il fonctionne.

Qu’est-ce que BeautifulSoup ?

BeautifulSoup fournit des méthodes simples pour naviguer, rechercher et modifier un arbre d’analyse dans des fichiers HTML ou XML. Il transforme un document HTML complexe en un arbre d’objets Python. Il convertit aussi automatiquement le document en Unicode, de sorte que vous n’avez pas à penser aux encodages. Cet outil vous aide non seulement à scraper, mais aussi à nettoyer les données. BeautifulSoup prend en charge l’analyseur HTML inclus dans la bibliothèque standard de Python, mais aussi plusieurs analyseurs Python tiers comme lxml ou html5lib.

BeautifulSoup a été développé pour la première fois par Leonard Richardson, qui contribue toujours à ce projet. Il est également soutenu par Tidelift (un outil d’abonnement payant pour la maintenance des logiciels libres).

BeautifulSoup 3 a été officiellement publié en mai 2006. La dernière version publiée par BeautifulSoup est la 4.9.3. Elle prend en charge Python 3 et Python 2.4.

Il est donc évident que pour bien maitriser cet outil, posséder une base en Python est essentiel. Nous avons notamment un article qui peut vous aider à apprendre la programmation Python.

Pourquoi utiliser BeautifulSoup ?

Il existe plusieurs raisons qui font de BeautifulSoup un outil d’élite pour le web scraping à savoir :

  • BeautifulSoup est composé de différents outils d’analyse syntaxique tels que html, parser, lxml et HTML5lib. Ainsi, vous pouvez essayer différentes méthodes d’analyse pour profiter de leurs avantages dans différents cas.
  • L’un des grands avantages de BeautifulSoup est sa facilité d’utilisation. Il suffit de quelques lignes de code pour créer un scraper. Cela ne signifie pas non plus qu’il se casse facilement. C’est pour ces raisons, entre autres, que BeautifulSoup est populaire auprès des développeurs, mais également chez les Data Engineer.
  • Avec une documentation agréable et complète, Beautiful soup aide les scrappeurs à apprendre rapidement.
  • Il existe une communauté en ligne qui propose diverses solutions aux différents problèmes que vous pouvez rencontrer lors de l’utilisation de cette bibliothèque.

Avec tous ces avantages, il est difficile de ne pas l’utiliser pour la collecte de données nécessaires à un projet Big Data.

Comment fonctionne BeautifulSoup ?

Avant de passer à l’écriture de code en Python, vous devez comprendre le fonctionnement de BeautifulSoup. Une fois que vous avez extrait le contenu HTML d’une page web et que vous l’avez stocké dans une variable, disons html_obj, vous pouvez alors le convertir en un objet BeautifulSoup avec une seule ligne de code :

soupe_obj = BeautifulSoup(html_obj, 'html.parser')

Ici, html_obj est la donnée HTML, soup_obj est l’objet beautiful soup qui a été obtenu et « html.parser » est le parser qui a été utilisé pour effectuer la conversion. Une fois que vous avez l’objet beautifulsoup, appelé soup_obj, le parcourir est très facile. Et puisque le parcourir est assez simple, l’extraction de données le devient également.

Prenons un exemple. Supposons que vous ayez besoin de récupérer un point de données appelé le titre du produit, qui est présent sur chaque page d’un site de commerce électronique. Vous avez téléchargé une seule page de produit HTML de ce site Web et vous vous êtes rendu compte que chaque page contient le nom du produit mentionné dans un élément de type span dont l’id est productTitle. Alors comment allez-vous récupérer ces données à partir de 1000 pages de produits ? Eh bien, vous obtiendrez les données HTML pour chaque page, et vous récupérerez le point de données de cette manière :

for spans in soup.findAll('span', attrs={'id' : 'productTitle'}) :
    nom_du_produit = spans.text.strip()

Bien qu’il s’agisse d’un moyen d’obtenir les données textuelles présentes entre un certain élément de balise, vous pouvez également récupérer les données des attributs de celle-ci.

Démarrer avec BeautifulSoup

Dans cette partie, nous allons travailler avec la page blog de notre site web. N’oubliez pas que cette liste est systématiquement mise à jour, il est donc fort probable que vous y verrez des articles différents :

data transition numerique

Mais ne vous inquiétez pas : quel que soit le livre que vous scraper, vous pouvez parfaitement suivre et comprendre ce tutoriel.

Avant de commencer le web scraping de notre page, il va falloir effectuer certaines installations.

Installations

La façon la plus simple d’installer non seulement BeautifulSoup, mais aussi Python et ses paquets les plus populaires (IPython, NumPy, Pandas, Matplotlib, …) est avec Anaconda, une distribution Python multiplateforme (Linux, macOS, Windows) pour l’analyse de données et le calcul scientifique. Les instructions d’installation pour Anaconda sont disponibles ici.

Après l’installation d’Anaconda, celle de Beautiful se fait avec la commande suivante :

conda install -c anaconda beautifulsoup4 

Pour profiter pleinement de l’expérience Beautiful Soup, vous devez également installer un analyseur syntaxique. Pour des raisons de vitesse, lxml est généralement recommandé. Toutefois, si vous avez d’autres préférences (telles que l’analyseur html.parser intégré de Python), n’hésitez pas à l’utiliser.
Dans ce tutoriel, nous utiliserons lxml. Installons-le donc à partir de la ligne de commande :

 conda install -c anaconda lxml 

Parfait ! Il nous faut encore une chose pour commencer à le scraping, et c’est la bibliothèque Requests. Avec Requests, nous pouvons demander des pages web à des sites web. Installons aussi cette bibliothèque :

 conda install -c anaconda requests 

Maintenant que nous avons tous les outils nécessaires, nous pouvons passer au scraping de notre page web.

Scraping

Sans plus attendre, lançons un Jupyter Notebook et importons les bibliothèques que nous venons d’installer (sauf lxml, qui n’a pas besoin d’être importée) :

from bs4 import BeautifulSoup as bs
import requests

Maintenant, nous sommes prêts à demander notre première page Web. Ce n’est rien de compliqué. Nous enregistrons l’URL que nous voulons scrapper dans la variable url, puis nous demandons l’URL (requests.get(url)). Ensuite, nous enregistrons la réponse dans la variable response :

url="https://www.amazon.fr/gp/bestsellers/electronics/?ie=UTF8&ref_=sv_cag_1"
response = requests.get(url)

En affichant response, vous pouvez voir que le code d’état de la réponse HTTP est 200, ce qui signifie que la demande de l’URL a réussi.

Cependant, nous avons besoin du contenu HTML de la page web demandée. L’étape suivante consiste à sauvegarder le contenu de response en html :

html = response.content

Lorsqu’on affiche html, on a le résultat suivant :

sauvegarde-html-beautiful-soup

Le résultat est le contenu HTML de la page de la liste des meilleures ventes High Tech d’Amazon, mais il est vraiment difficile à lire à l’œil humain.

Heureusement pour nous, nous avons Beautiful Soup et lxml !

Créons un objet Beautiful Soup nommé soup avec la ligne de code suivante :

soup = bs(html, "lxml")

Rappelez-vous, nous avons importé Beautiful Soup comme bs, c’est la partie bs() du code. Le premier paramètre de la méthode bs() est html (qui est la variable où nous avons enregistré le contenu HTML difficile à lire à partir de l’URL de la page blog), le second paramètre (« lxml« ) est l’analyseur syntaxique qui est utilisé sur la variable html.

Le résultat est une soupe (un document HTML analysé) qui est beaucoup plus agréable à l’œil :

html-beautiful-soup

Non seulement c’est agréable à regarder, mais l’objet BeautifulSoup nous donne également une structure de données imbriquée du contenu HTML original dans laquelle nous pouvons facilement naviguer et collecter des données.

Comment naviguer dans un objet « Beautiful Soup » ?

Tout d’abord, permettez-moi de faire un petit rappel du HTML. Le HTML est constitué d’éléments tels que des liens, des paragraphes, des titres, des blocs, etc. Ces éléments sont enveloppés entre des balises. À l’intérieur des balises d’ouverture et de fermeture se trouve le contenu de l’élément.

Par exemple, une phrase sur une page Web (dans un élément de paragraphe (<p>)) ressemble à ceci (seul le contenu est visible pour nous, les humains) :

<p>Ceci est un paragraphe </p>

Où <p> et </p> sont les balises ouvrantes et fermantes et « Ceci est un paragraphe » le contenu que vous voyez.

Les éléments HTML peuvent également avoir des attributs qui contiennent des informations supplémentaires sur l’élément. Les attributs sont définis dans les balises ouvrantes avec la syntaxe suivante : attribute name= »valeur de l’attribut ».

Voici un exemple :

<p class="maclasse">Ceci est un paragraphe </p>

Maintenant que nous avons fait quelques rappels du html, nous pouvons enfin commencer à extraire des données de l’objet BeautifulSoup. Il suffit de taper un nom de balise après l’objet BeautifulSoup et un point (comme soup.title), et de voir la magie opérer :

soup.title

Voici le résultat de cette requête :

<title>Blog - ressources, chroniques, tutoriels Big Data, Hadoop</title>

Si vous n’avez pas besoin de l’élément complet, mais seulement du texte, vous pouvez également le faire avec .get_text() :

soup.title.get_text()

Vous allez donc obtenir le résultat suivant :

'Blog - ressources, chroniques, tutoriels Big Data, Hadoop'

Et si vous n’avez besoin que de l’attribut d’un élément ? Aucun problème :

soup.a["href"]

Cette fois-ci, vous avez cette sortie :

https://www.data-transitionnumerique.com/'

Souvent, vous n’avez pas besoin d’un seul élément, mais de tous les éléments (par exemple, tous les liens d’une page). C’est pour cela que la méthode .find_all() est utile :

scraping automatique d'un site web

Après tout cela, vous disposez de suffisamment de connaissances pour accomplir des tâches plus sérieuses avec Beautiful Soup. C’est ce que nous allons faire, en passant à la section suivante.

Comment extraire des données avec Beautiful Soup ?

Dans notre objet BeautifulSoup, nous avons déjà le contenu HTML analysé de la page blog de notre site web. Parmi les données disponibles, nous allons extraire les éléments suivants :

  •     Titre des articles,
  •      Les catégories

En travaillant avec BeautifulSoup, le flux général d’extraction des données sera une approche en deux étapes :

1) inspecter dans le navigateur le ou les éléments HTML que nous voulons extraire,

2) puis trouver le ou les éléments HTML avec BeautifulSoup.

Mettons cette approche en pratique.

Obtenir les titres des articles (find_all + get_text)

Cette opération est très simple : cliquez avec le bouton droit de la souris sur le titre d’un des livres et choisissez Inspecter l’élément dans Firefox (ou Inspecter dans Chrome) :

scraping automatique avec beautifulsoup

Comme vous pouvez le voir, le titre du livre est un texte dans un élément au sein d’un élément h2 avec l’attribut class= »card-title entry-title ». Nous pouvons traduire cela en langage BeautifulSoup :

titre_articles = soup.find_all("h2", class_="card-title entry-title")
for titre in titre_articles:
    print(titre.get_text(strip=True))

soup.find_all(« h2 ») trouve tous les éléments h2 de la page web ; avec class_= »card-title entry-title », nous spécifions que nous recherchons spécifiquement les balises h2 qui contiennent l’attribut class_= »card-title entry-title »

Note importante : le « _ » dans class_= »card-title entry-title » n’est pas une faute de frappe, il est requis dans Beautiful Soup lors de la sélection des attributs de classe.

Nous enregistrons les éléments h2 dans titre_articles, qui se comporte comme une liste. Cela nous permet de la parcourir avec une boucle for. À chaque itération, nous extrayons uniquement le texte de l’élément h2 avec .get_text(). Avec le paramètre strip=True, nous nous assurons de supprimer tout espace blanc inutile.

Obtenir les catégories des articles

L’étape précédente nous a permis d’obtenir tous les titres d’articles de la page blog de notre site web. Mais que savons-nous de leurs catégories ? Y a-t-il plus de d’articles de programmation informatique ou d’articles tutoriels big data ?

beautifulsoup

Les données catégories sont un élément h6 avec class= »category text-info ».

import pandas as pd
categories = soup.find_all("h6", class_="category text-info")
categories_series = pd.Series(categories)
categories_series.value_counts()

À partir de ces instructions, nous avons le résultat suivant :

...
[[Programmation informatique],  ]                                           19
[[Tutoriels Big Data],  ]                                                    8
...

Joli ! Il y a 19 articles en Programmation informatique et 8 tutoriels big data.

Vous pouvez vous féliciter, car vous venez de scraper votre première page Web.  Nous espérons que vous vous êtes amusé en lisant cet article. Mais, surtout, nous espérons que vous avez compris l’intérêt du webscraping dans le marché et son intérêt dans votre carrière et que vous serez fier d’utiliser les compétences acquises. N’hésitez pas à visiter l’article sur le webscraping avec Selenuim.

Et si vous souhaitez approfondir vos connaissances en Big Data et en programmation informatique, nous vous invitons à télécharger notre formation sur le langage Scala pour la data.


Juvénal JVC

Juvénal est spécialisé depuis 2011 dans la valorisation à large échelle des données. Son but est d'aider les professionnels de la data à développer les compétences indispensables pour réussir dans le Big Data. Il travaille actuellement comme Lead Data Engineer auprès des grands comptes. Lorsqu'il n'est pas en voyage, Juvénal rédige des livres ou est en train de préparer la sortie d'un de  ses livres. Vous pouvez télécharger un extrait de son dernier livre en date ici : https://www.data-transitionnumerique.com/extrait-ecosystme-hadoop/

  • Demeze Arriane dit :

    Bonsoir. Merci beaucoup pour ce tutoriel. Ce fut très édifiant.

    • Juvénal JVC dit :

      Pour réaliser ta requête, cherche la balise associée au commentaire et scrape-là conformément à ce que nous montrons dans l’article.
      Cordialement,
      Juvénal

  • >