Recherche de site Web

Un guide étape par étape du Web Scraping avec Python et Beautiful Soup


Apprenez les bases du Web Scraping et de son implémentation Python. Découvrez également les différentes méthodes de la bibliothèque Beautiful Soup.

Le Web scraping est une technique utilisée pour extraire le contenu HTML de différents sites Web. Ces grattoirs Web sont principalement des robots informatiques qui peuvent accéder directement au World Wide Web à l'aide du protocole HTTP et utiliser ces informations dans diverses applications. Les données sont obtenues dans un format non structuré, qui est ensuite converti de manière structurée après avoir effectué plusieurs étapes de prétraitement. Les utilisateurs peuvent enregistrer ces données dans une feuille de calcul ou les exporter via une API.

Le scraping Web peut également être effectué manuellement pour les petites pages Web en copiant et en collant simplement les données de la page Web. Mais ce copier-coller ne fonctionnerait pas si nous avions besoin de données à grande échelle et provenant de plusieurs pages Web. Ici, les scrapers Web automatisés entrent en scène. Ils utilisent des algorithmes intelligents qui peuvent extraire de grandes quantités de données de nombreuses pages Web en moins de temps. 

Utilisations du Web Scraping

Le Web scraping est un outil puissant permettant aux entreprises de collecter et d'analyser des informations en ligne. Il a de multiples applications dans diverses industries. Vous en trouverez ci-dessous quelques-uns que vous pouvez consulter.

  1. Marketing : le web scraping est utilisé par de nombreuses entreprises pour collecter des informations sur leurs produits ou services à partir de divers sites de médias sociaux afin d'obtenir l'opinion du grand public. En outre, ils extraient les identifiants de messagerie de divers sites Web, puis envoient des e-mails promotionnels en masse aux propriétaires de ces identifiants de messagerie.

  1. Création de contenu : le Web scraping peut collecter des informations provenant de plusieurs sources, telles que des articles de presse, des rapports de recherche et des articles de blog. Il aide le créateur à créer du contenu de qualité et tendance.

  1. Comparaison des prix : le Web scraping peut être utilisé pour extraire les prix d'un produit particulier sur plusieurs sites de commerce électronique afin de fournir une comparaison de prix équitable pour l'utilisateur. Cela aide également les entreprises à fixer le prix optimal de leurs produits pour rivaliser avec leurs concurrents.

  1. Offres d'emploi : Web Scraping peut également être utilisé pour collecter des données sur diverses offres d'emploi sur plusieurs portails d'emploi afin que ces informations puissent aider de nombreux demandeurs d'emploi et recruteurs.

Maintenant, nous allons créer un simple web scraper en utilisant Python et la bibliothèque Beautiful Soup. Nous allons analyser une page HTML et en extraire des informations utiles. Ce didacticiel nécessite une compréhension de base de Python comme seul prérequis.

Implémentation du code

Notre mise en œuvre se compose de quatre étapes indiquées ci-dessous.

Configuration de l'environnement

Créez un répertoire distinct pour le projet et installez les bibliothèques ci-dessous à l'aide de l'invite de commande. Il est préférable de créer d'abord un environnement virtuel, mais vous pouvez également les installer globalement.

$ pip install requests
$ pip install bs4

Le module requests extrait le contenu HTML d'une URL. Il extrait toutes les données dans un format brut sous forme de chaîne nécessitant un traitement ultérieur.

Le bs4  est le module Beautiful Soup. Il analysera le contenu HTML brut obtenu à partir du module `request` dans un format bien structuré.

Obtenez le HTML

Créez un fichier Python dans ce répertoire et collez le code suivant.

import requests

url = "https://www.kdnuggets.com/"
res = requests.get(url)
htmlData = res.content
print(htmlData)

Sortir :

Ce script extraira tout le contenu HTML brut de l'URL `/`. Ces données brutes contiennent tous les textes, paragraphes, balises d'ancrage, divs, etc. Notre tâche suivante consiste à analyser ces données et à extraire tous les textes et balises séparément.

Analyser le HTML

Ici, le rôle de Beautiful Soup entre en jeu. Il est utilisé pour analyser et embellir les données brutes obtenues ci-dessus. Il crée une structure arborescente de notre DOM, qui peut être parcourue le long des branches de l'arbre et capable de trouver les balises et les objets cibles.

import requests
from bs4 import BeautifulSoup

url = "https://www.kdnuggets.com/"
res = requests.get(url)
htmlData = res.content
parsedData = BeautifulSoup(htmlData, "html.parser")
print(parsedData.prettify())

Sortir :

Vous pouvez voir dans le résultat ci-dessus que Beautiful Soup a présenté le contenu dans un format plus structuré avec des indentations appropriées. La fonction BeautifulSoup() prend deux arguments, l'un est le code HTML d'entrée et l'autre est un analyseur. Nous utilisons actuellement html.parser, mais il existe également d'autres analyseurs, comme lxml ou html5lib. Chacun d’eux a ses propres avantages et inconvénients. Certains sont plus indulgents, tandis que d’autres sont très rapides. La sélection de l'analyseur dépend entièrement du choix de l'utilisateur. Vous trouverez ci-dessous la liste des analyseurs avec leurs avantages et inconvénients que vous pouvez consulter.

Traversée de l'arborescence HTML

Dans cette section, nous comprendrons la structure arborescente du HTML, puis extrairons le titre, les différentes balises, classes, listes, etc., du contenu analysé à l'aide de Beautiful Soup.

L'arborescence HTML représente une vue hiérarchique des informations. Le nœud racine est la balise , qui peut avoir des parents, des enfants et des frères et sœurs. La balise head et la balise body suivent la balise HTML. La balise head contient les métadonnées et le titre, et la balise body contient les divs, les paragraphes, le titre, etc.

Lorsqu'un document HTML est transmis via Beautiful Soup, il convertit le contenu HTML complexe en quatre objets Python majeurs ; ce sont

  1. BeautifulSoup :

Il représente le document analysé dans son ensemble. C'est le document complet que nous essayons de supprimer.

soup = BeautifulSoup("<h1> Welcome to KDnuggets! </h1>", "html.parser")
print(type(soup))

Sortir :

<class 'bs4.BeautifulSoup'>

Vous pouvez voir que l’intégralité du contenu HTML est un objet de type Beautiful Soup.

  1. Balise :

L'objet tag correspond à une balise particulière dans le document HTML. Il peut extraire une balise de l'ensemble du document et renvoyer la première balise trouvée si plusieurs balises portant le même nom sont présentes dans le DOM.

soup = BeautifulSoup("<h1> Welcome to KDnuggets! </h1>", 'html.parser')
print(type(soup.h1))

Sortir :

<class 'bs4.element.Tag'>
  1. NavigableString :

Il contient le texte à l’intérieur d’une balise au format chaîne. Beautiful Soup utilise l'objet NavigableString pour stocker les textes d'une balise.

soup = BeautifulSoup("<h1> Welcome to KDnuggets! </h1>", "html.parser")
print(soup.h1.string)
print(type(soup.h1.string))

Sortir :

Welcome to KDnuggets! 
<class 'bs4.element.NavigableString'>
  1. Commentaires :

Il lit les commentaires HTML présents à l'intérieur d'une balise. Il s'agit d'un type spécial de NavigableString.

soup = BeautifulSoup("<h1><!-- This is a comment --></h1>", "html.parser")
print(soup.h1.string)
print(type(soup.h1.string))

Sortir :

 This is a comment 
<class 'bs4.element.Comment'>

Maintenant, nous allons extraire le titre, les différentes balises, classes, listes, etc., du contenu HTML analysé.

1. Titre

Obtenir le titre de la page HTML.

print(parsedData.title)

Sortir :

<title>Data Science, Machine Learning, AI &amp; Analytics - KDnuggets</title>

Vous pouvez également imprimer uniquement la chaîne de titre.

print(parsedData.title.string)

Sortir :

Data Science, Machine Learning, AI & Analytics - KDnuggets

2. Trouver et trouver tout

Ces fonctions sont utiles lorsque vous souhaitez rechercher une balise spécifique dans le contenu HTML. Find() ne donnera que la première occurrence de cette balise, tandis que find_all() donnera toutes les occurrences de cette balise. Vous pouvez également les parcourir. Voyons cela avec un exemple ci-dessous.

trouver():

h2 = parsedData.find('h2')
print(h2)

Sortir :

<h2>Latest Posts</h2>

find_all() :

H2s = parsedData.find_all("h2")
for h2 in H2s:
    print(h2)

Sortir :

<h2>Latest Posts</h2>
<h2>From Our Partners</h2>
<h2>Top Posts Past 30 Days</h2>
<h2>More Recent Posts</h2>
<h2 size="+1">Top Posts Last Week</h2>

Cela renverra la balise complète, mais si vous souhaitez imprimer uniquement la chaîne, vous pouvez écrire comme ça.

h2 = parsedData.find('h2').text
print(h2)

Nous pouvons également obtenir la classe, l'identifiant, le type, le href, etc. d'une balise particulière. Par exemple, obtenir les liens de toutes les balises d’ancrage présentes.

anchors = parsedData.find_all("a")
for a in anchors:
    print(a["href"])

Sortir :

Vous pouvez également obtenir la classe de chaque div.

divs = parsedData.find_all("div")
for div in divs:
    print(div["class"])

3. Recherche d'éléments à l'aide de l'identifiant et du nom de classe

On peut également retrouver des éléments spécifiques en donnant un identifiant particulier ou un nom de classe.

tags = parsedData.find_all("li", class_="li-has-thumb")
for tag in tags:
    print(tag.text)

Cela imprimera le texte de tous les li qui appartiennent à la classe li-has-thumb. Mais écrire le nom de la balise n’est pas toujours nécessaire si vous n’en êtes pas sûr. Vous pouvez également écrire comme ceci.

tags = parsedData.find_all(class_="li-has-thumb")
print(tags)

Il récupérera toutes les balises portant ce nom de classe.

Maintenant, nous allons discuter de quelques méthodes plus intéressantes de Beautiful Soup

Quelques autres méthodes de belle soupe

Dans cette section, nous aborderons quelques fonctions supplémentaires de Beautiful Soup qui rendront votre travail plus facile et plus rapide.

  1. select()

La fonction select() nous permet de trouver des balises spécifiques basées sur des sélecteurs CSS. Les sélecteurs CSS sont des modèles qui sélectionnent certaines balises HTML en fonction de leur classe, identifiant, attribut, etc.

Vous trouverez ci-dessous l'exemple pour trouver l'image avec l'attribut alt commençant par KDnuggets.

data = parsedData.select("img[alt*=KDnuggets]")
print(data)

Sortir :

  1. parent

Cet attribut renvoie le parent d'une balise donnée.

tag = parsedData.find('p')
print(tag.parent)
  1. contenu

Cet attribut renvoie le contenu de la balise sélectionnée.

tag = parsedData.find('p')
print(tag.contents)
  1. attrs

Cet attribut permet d'obtenir les attributs d'une balise dans un dictionnaire.

tag = parsedData.find('a')
print(tag.attrs)
  1. has_attr()

Cette méthode vérifie si une balise possède un attribut particulier.

tag = parsedData.find('a')
print(tag.has_attr('href'))

Il renverra True si l'attribut est présent, sinon retournera False.

  1. find_next()

Cette méthode trouve la balise suivante après une balise donnée. Il prend le nom de la balise d’entrée qu’il doit rechercher ensuite.

first_anchor = parsedData.find("a")
second_anchor = first_anchor.find_next("a")
print(second_anchor)
  1. find_previous()

Cette méthode est utilisée pour retrouver la balise précédente après une balise donnée. Il prend le nom de la balise d’entrée qu’il doit rechercher ensuite.

second_anchor = parsedData.find_all('a')[1]
first_anchor = second_anchor.find_previous('a')
print(first_anchor)

Il imprimera à nouveau la première balise d’ancrage.

Il existe de nombreuses autres méthodes que vous pouvez essayer. Ces méthodes sont disponibles dans cette documentation de la Beautiful Soup.

Conclusion

Nous avons discuté du web scraping, de ses utilisations et de son implémentation Python et Beautiful Soup. C'est tout pour aujourd'hui. N'hésitez pas à commenter ci-dessous si vous avez des commentaires ou des suggestions.

Articles connexes