Introduction
Le web scraping est une technique puissante qui permet d’extraire des données de sites web à des fins d’analyse, de recherche ou d’autres projets axés sur les données. Dans ce tutoriel, vous apprendrez à utiliser BeautifulSoup, une bibliothèque Python populaire, pour analyser le code HTML et extraire des informations utiles des pages web. Nous aborderons non seulement des exemples de base comme l’extraction des titres de pages et des liens, mais aussi des techniques avancées comme l’extraction de tableaux, la gestion de la pagination et l’utilisation de sessions pour maintenir l’état à travers de multiples requêtes.
Importation des paquets requis
Pour garder notre code organisé et éviter les répétitions, nous commençons par importer les paquets nécessaires. Cela permet de s’assurer que tous les morceaux de code suivants ont accès aux bibliothèques nécessaires.
#| label: import-packages
# Ce code importe les paquets essentiels pour le web scraping.
import requests
from bs4 import BeautifulSoupExemple de base pour l’extraction de données sur le web
Tout d’abord, montrons comment récupérer une page web, analyser son code HTML et extraire le titre de la page.
#| label: basic-scraping
# Définir l'URL à récupérer
url = "https://www.worldometers.info/world-population/population-by-country/"
# Récupérer la page web
response = requests.get(url)
# Analyser le contenu HTML
soup = BeautifulSoup(response.text, "html.parser")
# Extraire et imprimer le titre de la page
page_title = soup.title.string
print("Page Title:", page_title)Résultats:
Page Title: Population by Country (2025) - Worldometer
Extraction de tableaux
De nombreux sites web présentent des données dans des tableaux. Vous pouvez utiliser BeautifulSoup pour extraire les données d’un tableau et les convertir dans un format structuré.
#| label: extract-tables
# Trouver une table par sa balise (ou avec des attributs supplémentaires, par exemple, class ou id)
table = soup.find("table")
# Extraire les en-têtes de tableaux
headers = [header.text.strip() for header in table.find_all("th")]
# Extraire les lignes d'un tableau
rows = []
for row in table.find_all("tr")[1:]:
cells = [cell.text.strip() for cell in row.find_all("td")]
if cells:
rows.append(cells)
# Créez un `DataFrame` en utilisant les en-têtes et les lignes extraites
df = pd.DataFrame(rows, columns=headers)
df.head()
Gérer la pagination
Pour les sites web qui affichent des données sur plusieurs pages, vous pouvez automatiser le processus d’itération à travers les pages.
Le script suivant analyse les articles du blog en extrayant le titre de chaque article (à partir du texte de l’ancre) et l’URL (à partir de l’attribut href de l’ancre):
#| label: pagination-example
import time
def scrape_page(url):
response = requests.get(url)
return BeautifulSoup(response.text, "html.parser")
# Le site web utilise un paramètre de requête `#listing-listing-page=` pour la pagination
base_url = "https://quarto.org/docs/blog/#listing-listing-page="
page_number = 1
all_data = []
# Exemple : extraire les 2 premières pages
while page_number <= 2:
url = base_url + str(page_number)
soup = scrape_page(url)
# Extraire des articles de blog:
# Chaque titre et URL se trouve dans un `<h3 class='no-anchor listing-title'>`
posts = []
for h3 in soup.find_all("h3", class_="no-anchor listing-title"):
a_tag = h3.find("a")
if a_tag:
title = a_tag.text.strip()
link = a_tag.get("href")
posts.append({"title": title, "url": link})
all_data.extend(posts)
page_number += 1
# Délai respectueux entre les requêtes
time.sleep(1)
# Convertir la sortie en DataFrame et imprimer les données
df = pd.DataFrame(all_data)
df.head()
Utilisation des sessions
Lors de l’extraction de plusieurs pages d’un même site Web, l’utilisation d’une session peut améliorer les performances en réutilisant les paramètres (tels que les en-têtes et les cookies) et en conservant l’état.
#| label: using-sessions
# Créer un objet session
session = requests.Session()
session.headers.update({"User-Agent": "Mozilla/5.0"})
# Utiliser la session pour faire des requêtes
url = "https://www.worldometers.info/world-population/population-by-country/"
response = session.get(url)
soup = BeautifulSoup(response.text, "html.parser")
print("Session-based Page Title:", soup.title.string)Bonnes pratiques pour le Récupération de données sur le Web
Respecter les politiques du site web:
Vérifiez toujours lesrobots.txtet les conditions d’utilisation d’un site avant de procéder au scraping.Limitation du débit:
Utilisez des délais (par exemple,time.sleep()) entre les requêtes pour éviter de submerger le site web.Gestion des erreurs:
Incorporer une gestion robuste des erreurs pour gérer les problèmes de connexion et les structures HTML inattendues.
Veillez à ce que vos activités de ‘web scraping’ soient conformes aux lignes directrices légales et éthiques.
Conclusion
Le web scraping avec BeautifulSoup est un moyen efficace d’extraire et de traiter les données des sites web. En combinant les techniques de base avec des stratégies avancées telles que l’extraction de tableaux, la gestion de la pagination et la gestion des sessions, vous pouvez construire des pipelines de collecte de données robustes pour vos projets de science des données. Expérimentez ces exemples, adaptez-les à vos besoins spécifiques et pratiquez toujours un scraping éthique.
Plus d’informations
- Python Automation : Planification et automatisation des tâches
- Construire des API REST avec FastAPI : un framework Python moderne
- Test unitaire en Python avec pytest : un guide complet
Bon codage, et bonne exploration de la puissance du web scraping avec BeautifulSoup!
Explorer d’autres articles
Voici d’autres articles de la même catégorie pour vous aider à approfondir le sujet.
Réutilisation
Citation
@online{kassambara2024,
author = {Kassambara, Alboukadel},
title = {Récupération de données sur le Web avec BeautifulSoup},
date = {2024-02-08},
url = {https://www.datanovia.com/fr/learn/programming/python/tools/web-scraping-with-beautifulsoup.html},
langid = {fr}
}

Comment cela fonctionne-t-il
#listing-listing-page=1,#listing-listing-page=2).scrape_pagetélécharge et analyse le code HTML.<h3>avec la classe'no-anchor listing-title', trouve la balise enfant<a>, et extrait le titre (en utilisant.text) et l’URL (en utilisant.get('href')).