Le Web Scraping en pratique

couverture web scraping pratique

Le web scraping est une technique qui permet d’extraire automatiquement de grandes quantités d’informations d’un site web, ce qui fait gagner énormément de temps et d’efforts. Voici le web scraping en pratique avec Python : un exemple simple pour récupérer les titres, les prix, les notes et les couvertures des livres d’un site conçu pour s’entraîner, Books to Scrape.

C’est un excellent exercice pour les débutants qui cherchent à comprendre comment scraper le Web. Le web scraping peut sembler intimidant au premier abord : dans cet article, je te prends par la main pour y voir plus clair.

Mise à jour (octobre 2026) : la première version de cet article scrapait le site du MTA de New York, dont la page a changé de forme et n’est plus utilisable pour cet exercice. J’ai donc refait l’exemple sur un site fait pour s’entraîner, stable dans le temps. La méthode, elle, reste exactement la même.

En bref : le web scraping extrait automatiquement des informations d’un site web. Ici, on récupère les 20 livres de la première page de Books to Scrape en cinq étapes : inspecter la page pour repérer la balise <article class="product_pod">, accéder à la page avec requests, analyser le HTML avec BeautifulSoup, extraire le titre, le prix, la note et l’image de chaque livre, puis télécharger les couvertures dans une boucle for, avec une pause d’une seconde entre deux téléchargements. Les résultats finissent dans un tableau Pandas.

Tu peux aussi exécuter tout le code de cet article dans ce notebook Google Colab : chaque étape est dans sa propre cellule, prête à être modifiée.

Quelles données récupère-t-on (Books to Scrape) ?

Nous allons scraper ce site web : https://books.toscrape.com/

Books to Scrape est une fausse librairie en ligne, créée pour s’entraîner au web scraping. Elle propose 1 000 livres répartis sur 50 pages de 20 livres. Pour chaque livre, on trouve une couverture, un titre, un prix et une note de 1 à 5 étoiles.

Copier ces informations à la main, livre par livre, puis enregistrer chaque couverture avec un clic droit serait long et pénible. C’est ici qu’entre en jeu le web scraping !

Quelles précautions prendre avant de scraper un site ?

  1. Lis les conditions générales du site Web pour comprendre comment utiliser les données en toute légalité. La plupart des sites interdisent d’utiliser les données à des fins commerciales. Pense aussi à consulter le fichier robots.txt du site.
  2. Ne télécharge pas les données trop rapidement : cela pourrait surcharger le site Web, et tu pourrais être bloqué.

Books to Scrape est fait pour ça : tu peux le scraper librement, et il n’a pas de fichier robots.txt (le serveur renvoie une erreur 404). Sur un vrai site, applique toujours ces deux règles.

Comment inspecter un site web pour trouver les éléments à extraire ?

La première chose à faire est de trouver où se cachent les informations à récupérer, parmi les multiples niveaux de balises HTML. Une page Web contient beaucoup de code, et nous voulons repérer les éléments qui contiennent nos données.

Si tu ne connais pas bien les balises HTML, reporte-toi aux tutos w3schools. Comprendre les bases du HTML est indispensable pour réussir à scraper le Web.

Sur le site Web, fais un clic droit sur la couverture d’un livre puis clique sur « Inspecter ». Tu peux aussi utiliser le raccourci F12, ou Ctrl + Maj + I (Cmd + Option + I sur Mac). Tu vois ainsi le code brut derrière le site.

Une console s’ouvre alors avec le code de la page. En haut à gauche de la console, un petit bouton en forme de flèche dans un carré permet de sélectionner un élément de la page (raccourci Ctrl + Maj + C, ou Cmd + Maj + C sur Mac).

Clique sur cette flèche puis sur une zone du site : le code de cet élément est mis en surbrillance dans la console.

J’ai cliqué sur le premier livre de la page, « A Light in the Attic » : voici son code (légèrement simplifié, sans les retours à la ligne en trop) :

<article class="product_pod">
    <div class="image_container">
        <a href="catalogue/a-light-in-the-attic_1000/index.html"><img src="media/cache/2c/da/2cdad67c44b002e7ead0cc35693c0e8b.jpg" alt="A Light in the Attic" class="thumbnail"></a>
    </div>
    <p class="star-rating Three">
        <i class="icon-star"></i><i class="icon-star"></i><i class="icon-star"></i><i class="icon-star"></i><i class="icon-star"></i>
    </p>
    <h3><a href="catalogue/a-light-in-the-attic_1000/index.html" title="A Light in the Attic">A Light in the ...</a></h3>
    <div class="product_price">
        <p class="price_color">£51.77</p>
        <p class="instock availability">In stock</p>
        <form><button type="submit" class="btn btn-primary btn-block">Add to basket</button></form>
    </div>
</article>

Tout ce qu’il nous faut est dans la balise <article class="product_pod">, une par livre : le titre complet dans l’attribut title du lien du <h3> (le texte affiché est tronqué : « A Light in the … »), le prix dans <p class="price_color">, la note dans la classe de <p class="star-rating Three">, et l’adresse de la couverture dans l’attribut src de la balise <img>.

Maintenant que nous avons identifié l’emplacement des informations, commençons à coder !

Comment scraper les livres avec Python ?

Nous commençons par importer les bibliothèques suivantes :

import time
from pathlib import Path
from urllib.parse import urljoin

import pandas as pd
import requests
from bs4 import BeautifulSoup
Python

Ensuite, nous définissons l’URL du site Web et nous y accédons avec la bibliothèque requests. La page est en UTF-8 mais ne le précise pas dans ses en-têtes : sans la ligne response.encoding, le symbole « £ » s’afficherait « £ » :

url = "https://books.toscrape.com/"
response = requests.get(url)
response.encoding = "utf-8"  # la page est en UTF-8 mais ne le précise pas dans ses en-têtes
Python

Si l’accès a réussi, tu devrais voir le résultat suivant (le code 200 signifie que la requête a abouti) :

response  # 200 si tout est ok
Python
<Response [200]>

Nous analysons ensuite le code HTML avec BeautifulSoup, pour obtenir une structure de données imbriquée, plus lisible et plus simple à parcourir. Pour en savoir plus sur cette bibliothèque, consulte la documentation de BeautifulSoup.

soup = BeautifulSoup(response.text, "html.parser")
Python

Nous utilisons la méthode .find_all pour localiser toutes les balises <article> de classe product_pod, c’est-à-dire un élément par livre :

livres = soup.find_all("article", class_="product_pod")
len(livres)
Python
20

Il y a bien 20 livres, comme sur la page. Prenons le premier et extrayons son titre, qui se trouve dans l’attribut title du lien :

livre = livres[0]
titre = livre.h3.a["title"]
titre
Python
'A Light in the Attic'

Le prix est le texte de la balise <p class="price_color"> :

prix = livre.find("p", class_="price_color").text
prix
Python
'£51.77'

Pour la note, nous lisons la classe CSS du paragraphe star-rating. BeautifulSoup la renvoie sous forme de liste (['star-rating', 'Three']) : la note est donc le deuxième élément :

note = livre.find("p", class_="star-rating")["class"][1]
note
Python
'Three'

Enfin, l’adresse de la couverture est dans l’attribut src de l’image :

src = livre.img["src"]
src
Python
'media/cache/2c/da/2cdad67c44b002e7ead0cc35693c0e8b.jpg'

Cette adresse est relative : elle ne commence pas par https://. La fonction urljoin la complète à partir de l’URL de la page :

image_url = urljoin(url, src)
image_url
Python
'https://books.toscrape.com/media/cache/2c/da/2cdad67c44b002e7ead0cc35693c0e8b.jpg'

Nous pouvons maintenant télécharger la couverture. Nous créons un dossier couvertures, nous demandons l’image avec requests et nous enregistrons son contenu (.content) dans un fichier, nommé d’après la fin de l’adresse :

Path("couvertures").mkdir(exist_ok=True)

nom_fichier = "couvertures/" + src.split("/")[-1]
image = requests.get(image_url)
Path(nom_fichier).write_bytes(image.content)
nom_fichier
Python
'couvertures/2cdad67c44b002e7ead0cc35693c0e8b.jpg'

Enfin, nous ajoutons une ligne de code qui met notre programme en pause pendant une seconde entre deux téléchargements. Cela évite d’envoyer trop de requêtes d’affilée au site Web, et d’être signalé comme spam :

time.sleep(1)
Python

Maintenant que nous savons traiter un livre, traitons les 20 livres de la page avec une boucle for. À chaque tour, nous téléchargeons la couverture et nous gardons le titre, le prix et la note dans une liste de dictionnaires, que nous transformons en tableau Pandas. Le code ci-dessous contient l’ensemble du code permettant de récupérer les livres de la première page :

# Importer les bibliothèques
import time
from pathlib import Path
from urllib.parse import urljoin

import pandas as pd
import requests
from bs4 import BeautifulSoup

# Accéder à la page et analyser son code HTML
url = "https://books.toscrape.com/"
response = requests.get(url)
response.encoding = "utf-8"
soup = BeautifulSoup(response.text, "html.parser")

Path("couvertures").mkdir(exist_ok=True)

donnees = []
for livre in soup.find_all("article", class_="product_pod"):
    src = livre.img["src"]
    nom_fichier = "couvertures/" + src.split("/")[-1]

    # Télécharger la couverture
    image = requests.get(urljoin(url, src))
    Path(nom_fichier).write_bytes(image.content)

    # Garder les informations du livre
    donnees.append({
        "titre": livre.h3.a["title"],
        "prix": livre.find("p", class_="price_color").text,
        "note": livre.find("p", class_="star-rating")["class"][1],
        "fichier": nom_fichier,
    })

    time.sleep(1)  # pause d'une seconde pour ne pas surcharger le site

df = pd.DataFrame(donnees)
print(len(list(Path("couvertures").glob("*.jpg"))), "couvertures téléchargées")
Python
20 couvertures téléchargées

Les 20 couvertures sont dans le dossier couvertures, et voici les premières lignes du tableau :

df[["titre", "prix", "note"]].head()
Python
                                   titre    prix   note
0                   A Light in the Attic  £51.77  Three
1                     Tipping the Velvet  £53.74    One
2                             Soumission  £50.10    One
3                          Sharp Objects  £47.82   Four
4  Sapiens: A Brief History of Humankind  £54.23   Five

Les prix sont encore du texte (« £51.77 »). Nous retirons le symbole « £ » et nous convertissons la colonne en nombres pour calculer, par exemple, le prix moyen des 20 livres :

df["prix"] = df["prix"].str.replace("£", "", regex=False).astype(float)
print(round(df["prix"].mean(), 2))
Python
38.05

Comment scraper plusieurs pages d’un site ?

Pour parcourir tout le catalogue, on suit le bouton « next » de chaque page, jusqu’à ce qu’il disparaisse (à la page 50). Ses adresses sont relatives à la page courante (catalogue/page-2.html sur la première page, puis page-3.html sur la deuxième) : urljoin gère les deux cas. Pour tester vite, le code ci-dessous s’arrête à 3 pages, soit 60 livres. Avec MAX_PAGES = None, il parcourt les 1 000 livres, en comptant une bonne minute à cause des pauses :

MAX_PAGES = 3  # mets None pour parcourir les 50 pages (1 000 livres)

page_url = "https://books.toscrape.com/"
titres = []
n_pages = 0

while page_url and (MAX_PAGES is None or n_pages < MAX_PAGES):
    reponse = requests.get(page_url)
    reponse.encoding = "utf-8"
    soup = BeautifulSoup(reponse.text, "html.parser")

    titres += [livre.h3.a["title"] for livre in soup.find_all("article", class_="product_pod")]
    n_pages += 1

    # Le bouton « next » disparaît sur la dernière page
    suivant = soup.find("li", class_="next")
    page_url = urljoin(page_url, suivant.a["href"]) if suivant else None

    time.sleep(1)

len(titres)
Python
60

Pour maîtriser les bases de Python avant de scraper des sites web, le parcours Python de DataXp te fait pratiquer sur des exercices corrigés, avec un coach IA qui t’aide quand tu bloques. Les premiers modules sont gratuits.

Questions fréquentes sur le web scraping

Qu’est-ce que le web scraping ?

C’est une technique qui permet d’extraire automatiquement de grandes quantités d’informations d’un site web, ce qui fait gagner énormément de temps et d’efforts, par exemple pour récupérer les titres, les prix et les couvertures de centaines de livres au lieu de les copier un par un.

Quelles précautions prendre avant de scraper un site ?

Lis les conditions générales du site pour savoir comment utiliser les données en toute légalité : la plupart des sites interdisent un usage commercial. Consulte aussi son fichier robots.txt, et ne télécharge pas les données trop rapidement pour ne pas surcharger le site ni être bloqué.

Comment éviter d’être bloqué quand on scrape un site ?

Ne fais pas tes requêtes trop vite : ajoute une pause d’une seconde entre deux téléchargements ou deux pages dans ta boucle avec time.sleep(1). Cela évite d’envoyer trop de requêtes d’affilée au site et d’être signalé comme spam.

Quelles bibliothèques Python utiliser pour faire du web scraping ?

Dans cet article : requests pour accéder à la page (le code 200 signifie que la requête a abouti), BeautifulSoup pour analyser le code HTML et localiser les balises avec find_all, urljoin pour reconstruire les adresses relatives, et Pandas pour ranger les résultats dans un tableau.

Comment repérer les éléments à extraire dans une page web ?

Fais un clic droit puis « Inspecter », et utilise la flèche en haut à gauche de la console : en cliquant sur un élément du site, son code est mis en surbrillance. Sur Books to Scrape, chaque livre se trouve dans une balise <article class="product_pod">.

Pour aller plus loin avec Python, consulte aussi notre guide des 21 astuces et concepts Python pour améliorer ton code.

Publications similaires

2 commentaires

  1. est-ce que c’est possible d’utiliser Selenium en multithreading ? prévoir un nombre exact de navigateur et les faire travailler en toute indépendance, tous en même temps ?

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *