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 BeautifulSoup
Exemple 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
= "https://www.worldometers.info/world-population/population-by-country/"
url
# Récupérer la page web
= requests.get(url)
response # Analyser le contenu HTML
= BeautifulSoup(response.text, "html.parser")
soup
# Extraire et imprimer le titre de la page
= soup.title.string
page_title 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)
= soup.find("table")
table # Extraire les en-têtes de tableaux
= [header.text.strip() for header in table.find_all("th")]
headers
# Extraire les lignes d'un tableau
= []
rows for row in table.find_all("tr")[1:]:
= [cell.text.strip() for cell in row.find_all("td")]
cells if cells:
rows.append(cells)
# Créez un `DataFrame` en utilisant les en-têtes et les lignes extraites
= pd.DataFrame(rows, columns=headers)
df 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):
= requests.get(url)
response return BeautifulSoup(response.text, "html.parser")
# Le site web utilise un paramètre de requête `#listing-listing-page=` pour la pagination
= "https://quarto.org/docs/blog/#listing-listing-page="
base_url = 1
page_number = []
all_data
# Exemple : extraire les 2 premières pages
while page_number <= 2:
= base_url + str(page_number)
url = scrape_page(url)
soup # 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"):
= h3.find("a")
a_tag if a_tag:
= a_tag.text.strip()
title = a_tag.get("href")
link "title": title, "url": link})
posts.append({
all_data.extend(posts)+= 1
page_number # Délai respectueux entre les requêtes
1)
time.sleep(
# Convertir la sortie en DataFrame et imprimer les données
= pd.DataFrame(all_data)
df 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
= requests.Session()
session "User-Agent": "Mozilla/5.0"})
session.headers.update({
# Utiliser la session pour faire des requêtes
= "https://www.worldometers.info/world-population/population-by-country/"
url = session.get(url)
response = BeautifulSoup(response.text, "html.parser")
soup 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.txt
et 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_page
té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')
).