Comment extraire les données d’une page web en Python ?

Comment extraire les données d'une page web en Python ?

Dans cet article

  • Python dispose de 3 bibliothèques majeures pour le scraping : Requests, BeautifulSoup et Scrapy
  • Un script d’extraction basique se code en moins de 10 lignes avec Requests et BeautifulSoup
  • Le scraping est légal en France sous certaines conditions, notamment le respect du fichier robots.txt
  • Scrapy permet de traiter plusieurs milliers de pages par minute grâce à son architecture asynchrone
  • Les sites dynamiques nécessitent un navigateur headless comme Selenium ou Playwright
  • Python surpasse R en scraping grâce à un écosystème de bibliothèques plus mature et une communauté plus large

Depuis que je travaille sur des projets d’automatisation et de collecte de données, le scraping web page python fait partie de mes outils quotidiens. Que ce soit pour surveiller les prix d’un concurrent, alimenter une base de données produits ou analyser des tendances, Python reste le langage de référence pour extraire des informations depuis n’importe quelle page web. Je vais vous guider pas à pas dans cette pratique, des bases jusqu’aux techniques avancées.

Pourquoi choisir Python pour le scraping web

Python s’est imposé comme le langage dominant pour l’extraction de données web, et ce n’est pas un hasard. Après avoir testé plusieurs approches au fil des années, je constate que trois facteurs expliquent cette domination.

Premièrement, la simplicité syntaxique de Python permet d’écrire un script fonctionnel en quelques minutes. Là où un développeur Java aurait besoin de dizaines de lignes de code et de configuration, Python offre une approche directe et lisible. Deuxièmement, l’écosystème de bibliothèques est incomparable : Requests, BeautifulSoup, Scrapy, Selenium, Playwright forment un arsenal complet pour tous les cas d’usage.

Troisièmement, la communauté Python autour du scraping est immense. Sur Reddit et Stack Overflow, vous trouverez des solutions à pratiquement tous les problèmes rencontrés. Cette richesse communautaire accélère considérablement l’apprentissage.

L'installation des bibliothèques Python est la première étape de tout projet de scraping
L’installation des bibliothèques Python est la première étape de tout projet de scraping

Si vous débutez en développement Python, je vous recommande de consulter mon guide sur le scraping web avec Python qui couvre les fondamentaux du langage appliqués à l’extraction de données.

Python versus R pour le web scraping

On me pose souvent la question : faut-il choisir R ou Python pour le scraping ? Ma réponse est claire : Python l’emporte dans la majorité des cas. R possède certes le package rvest qui fonctionne correctement, mais Python offre plusieurs avantages décisifs :

  • Un écosystème de bibliothèques plus vaste et mieux maintenu
  • Une gestion native de l’asynchrone pour les crawls massifs
  • Une meilleure intégration avec les navigateurs headless
  • Des frameworks complets comme Scrapy sans équivalent en R
  • Une communauté plus active sur les problématiques de scraping

R reste pertinent si votre objectif final est l’analyse statistique et que vous ne scrapez que quelques pages. Mais dès que le volume augmente ou que les sites deviennent complexes, Python s’impose.

Prérequis et installation de l’environnement

Avant de coder votre premier scraper, vous devez préparer votre environnement. Voici la procédure que je suis systématiquement pour chaque nouveau projet d’extraction.

Installation de Python et des bibliothèques

Assurez-vous d’avoir Python 3.9 ou supérieur installé sur votre machine. Je recommande de toujours travailler dans un environnement virtuel pour isoler les dépendances :

python -m venv env_scraping
source env_scraping/bin/activate  # Linux/Mac
env_scraping\Scripts\activate     # Windows

pip install requests beautifulsoup4 lxml

Ces trois packages constituent le kit de base : Requests pour envoyer des requêtes HTTP, BeautifulSoup4 pour parser le HTML, et lxml comme parseur rapide. Pour les projets plus ambitieux, ajoutez Scrapy :

pip install scrapy

Structure recommandée d’un projet

Pour garder votre code maintenable, j’organise toujours mes projets de scraping ainsi :

mon_projet_scraping/
├── scraper/
│   ├── __init__.py
│   ├── extracteur.py
│   └── parseur.py
├── data/
│   └── resultats.csv
├── config.py
└── main.py

Cette organisation facilite la maintenance, surtout quand le projet grossit. Si vous travaillez sur des projets plus larges impliquant du déploiement, un passage par une formation Docker peut s’avérer utile pour conteneuriser vos scrapers.

Votre premier script d’extraction en 10 lignes

Passons à la pratique. Voici comment extraire les données d’une page web en Python avec un script minimaliste mais fonctionnel :

import requests
from bs4 import BeautifulSoup

# Envoyer la requête HTTP
url = "https://exemple.com/produits"
reponse = requests.get(url)

# Parser le HTML
soup = BeautifulSoup(reponse.text, 'lxml')

# Extraire les données
titres = soup.find_all('h2', class_='product-title')
for titre in titres:
    print(titre.get_text(strip=True))

Ce script effectue trois opérations fondamentales : il télécharge la page, parse le HTML en un arbre navigable, puis extrait les éléments ciblés. En moins de 10 lignes, vous avez un scraper fonctionnel.

Gérer les en-têtes HTTP

Dans la pratique, de nombreux sites bloquent les requêtes qui ne présentent pas un User-Agent valide. Je configure toujours mes en-têtes ainsi :

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
    'Accept-Language': 'fr-FR,fr;q=0.9'
}
reponse = requests.get(url, headers=headers, timeout=10)

Le paramètre timeout=10 évite que votre script reste bloqué indéfiniment sur une page qui ne répond pas. C’est une bonne pratique que j’applique systématiquement.

BeautifulSoup permet de transformer le HTML brut en données structurées exploitables
BeautifulSoup permet de transformer le HTML brut en données structurées exploitables

BeautifulSoup : naviguer dans le DOM comme un pro

BeautifulSoup est la bibliothèque que je recommande aux débutants pour sa simplicité d’utilisation. Elle transforme un document HTML en un arbre d’objets Python facilement exploitables.

Les sélecteurs essentiels

Voici les méthodes que j’utilise au quotidien pour cibler les éléments :

# Trouver un élément unique
soup.find('div', id='prix-principal')

# Trouver tous les éléments correspondants
soup.find_all('a', class_='lien-produit')

# Utiliser les sélecteurs CSS (mon préféré)
soup.select('div.carte-produit > h3')
soup.select('table#comparatif tr td:nth-child(2)')

# Extraire les attributs
lien = soup.find('a', class_='download')
url_fichier = lien['href']

# Naviguer dans l'arbre
element.parent
element.next_sibling
element.find_next('p')

La méthode select() avec les sélecteurs CSS est particulièrement puissante. Si vous maîtrisez déjà le CSS, vous serez immédiatement productif. C’est la technique que j’emploie le plus souvent car elle permet des ciblages très précis.

Extraction de données structurées

Pour extraire un tableau HTML complet et le convertir en données exploitables :

import csv

tableau = soup.find('table', class_='donnees')
lignes = tableau.find_all('tr')

with open('resultats.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    for ligne in lignes:
        cellules = ligne.find_all(['td', 'th'])
        writer.writerow([c.get_text(strip=True) for c in cellules])

Ce pattern est celui que j’utilise le plus fréquemment pour alimenter des bases de données ou des fichiers d’analyse. Si vous travaillez avec des données relationnelles, un CRM ou une base de données structurée en aval facilite grandement l’exploitation.

Scrapy pour les projets d’extraction à grande échelle

Quand le volume de pages à scraper dépasse quelques centaines, Requests et BeautifulSoup montrent leurs limites. C’est là que Scrapy entre en jeu. Ce framework complet gère nativement la concurrence, le respect des délais, les pipelines de données et la reprise sur erreur.

Créer un spider Scrapy

import scrapy

class ProduitSpider(scrapy.Spider):
    name = 'produits'
    start_urls = ['https://exemple.com/catalogue']
    
    custom_settings = {
        'DOWNLOAD_DELAY': 1,
        'CONCURRENT_REQUESTS': 4
    }

    def parse(self, response):
        for produit in response.css('div.carte-produit'):
            yield {
                'nom': produit.css('h3::text').get(),
                'prix': produit.css('span.prix::text').get(),
                'url': response.urljoin(produit.css('a::attr(href)').get())
            }
        
        # Suivre la pagination
        page_suivante = response.css('a.page-suivante::attr(href)').get()
        if page_suivante:
            yield response.follow(page_suivante, self.parse)

Scrapy traite facilement plusieurs milliers de pages par minute grâce à son moteur asynchrone basé sur Twisted. Le paramètre DOWNLOAD_DELAY impose un délai entre les requêtes pour respecter le serveur cible.

Les pipelines de traitement

L’un des points forts de Scrapy est son système de pipelines qui permet de nettoyer, valider et stocker les données automatiquement :

class NettoyagePipeline:
    def process_item(self, item, spider):
        item['prix'] = float(item['prix'].replace('€', '').replace(',', '.').strip())
        item['nom'] = item['nom'].strip().title()
        return item

Pour lancer le spider et exporter en JSON ou CSV :

scrapy crawl produits -o resultats.json
scrapy crawl produits -o resultats.csv

Gérer les sites dynamiques avec JavaScript

De plus en plus de sites modernes chargent leur contenu via JavaScript (React, Vue, Angular). Dans ce cas, Requests ne récupère qu’une page vide. Il faut alors simuler un vrai navigateur.

Selenium : le classique

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

options = webdriver.ChromeOptions()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)

driver.get('https://exemple.com/spa')

# Attendre le chargement du contenu dynamique
WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, 'div.contenu-charge'))
)

elements = driver.find_elements(By.CSS_SELECTOR, 'div.produit')
for el in elements:
    print(el.text)

driver.quit()
Les projets de scraping à grande échelle nécessitent une infrastructure serveur dédiée
Les projets de scraping à grande échelle nécessitent une infrastructure serveur dédiée

Playwright : l’alternative moderne

Depuis 2023, je préfère Playwright à Selenium pour sa rapidité et sa fiabilité. L’API est plus intuitive et la gestion de l’attente est native :

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    navigateur = p.chromium.launch(headless=True)
    page = navigateur.new_page()
    page.goto('https://exemple.com/spa')
    
    # Attente automatique intelligente
    page.wait_for_selector('div.contenu-charge')
    
    produits = page.query_selector_all('div.produit')
    for produit in produits:
        print(produit.inner_text())
    
    navigateur.close()

Playwright gère nativement Chromium, Firefox et WebKit, ce qui en fait un outil polyvalent pour les tests comme pour le scraping.

Comparatif des bibliothèques de scraping Python

Pour vous aider à choisir la bonne approche selon votre projet, voici un tableau comparatif basé sur mon expérience :

Bibliothèque Cas d’usage Vitesse Courbe d’apprentissage Sites JS
Requests + BeautifulSoup Pages statiques simples Rapide Facile Non
Scrapy Crawl massif multi-pages Très rapide Moyenne Avec plugin
Selenium Sites dynamiques JS Lent Moyenne Oui
Playwright Sites dynamiques modernes Moyen Facile Oui
lxml (seul) Parsing XML/HTML haute perf Très rapide Difficile Non
httpx + selectolax Scraping asynchrone léger Très rapide Moyenne Non

Mon conseil : commencez toujours par Requests + BeautifulSoup. Si le site est en JavaScript, passez à Playwright. Si vous devez scraper des milliers de pages, adoptez Scrapy. Cette progression logique vous évitera de sur-ingénierer vos projets.

Aspects légaux et bonnes pratiques

Le web scraping est-il légal ? La réponse est nuancée. En France et en Europe, le cadre juridique repose sur plusieurs textes qu’il faut connaître avant de lancer un scraper en production.

Ce que dit la loi

Le Code de la propriété intellectuelle (article L342-1) protège les bases de données contre l’extraction substantielle. Par ailleurs, le RGPD encadre strictement la collecte de données personnelles. En pratique, le scraping est légal si :

  • Vous n’extrayez que des données publiquement accessibles
  • Vous respectez le fichier robots.txt du site
  • Vous ne collectez pas de données personnelles sans base légale
  • Vous ne surchargez pas les serveurs (respect des délais)
  • Vous n’extrayez pas une partie substantielle d’une base de données protégée

La CNIL rappelle que même les données publiques restent soumises au RGPD lorsqu’elles concernent des personnes physiques identifiables.

Bonnes pratiques techniques

Au-delà du cadre légal, voici les règles que j’applique sur tous mes projets :

  • Ajouter un délai d’au moins 1 seconde entre chaque requête
  • Identifier votre bot avec un User-Agent explicite
  • Vérifier les conditions d’utilisation du site cible
  • Privilégier les API officielles quand elles existent
  • Stocker les résultats localement pour éviter de re-scraper
import time
import random

def pause_respectueuse():
    """Délai aléatoire entre 1 et 3 secondes"""
    time.sleep(random.uniform(1, 3))

Pour les projets nécessitant une infrastructure de déploiement, la sécurité en cloud computing est un aspect à ne pas négliger, surtout si vous manipulez des données sensibles.

Erreurs courantes et solutions

Après des années de pratique, je retrouve systématiquement les mêmes problèmes chez les débutants en scraping. Voici comment les résoudre efficacement.

Erreur 403 : accès refusé

C’est le problème le plus fréquent. Le serveur détecte que votre requête ne provient pas d’un navigateur classique. Solutions :

# Solution 1 : ajouter des en-têtes complets
session = requests.Session()
session.headers.update({
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
    'Accept': 'text/html,application/xhtml+xml',
    'Accept-Language': 'fr-FR,fr;q=0.9',
    'Accept-Encoding': 'gzip, deflate, br',
    'Connection': 'keep-alive'
})

# Solution 2 : utiliser une session avec cookies
reponse = session.get('https://exemple.com')  # Récupère les cookies
reponse = session.get('https://exemple.com/page-cible')  # Requête authentifiée

Contenu vide ou incomplet

Si BeautifulSoup ne trouve rien, le contenu est probablement chargé en JavaScript. Vérifiez en affichant le HTML brut :

print(reponse.text[:500])  # Inspecter les 500 premiers caractères

Si vous voyez des balises <script> sans contenu HTML, passez à Selenium ou Playwright.

Gestion robuste des erreurs

import requests
from requests.exceptions import RequestException

def scraper_page(url, max_tentatives=3):
    for tentative in range(max_tentatives):
        try:
            reponse = requests.get(url, headers=headers, timeout=10)
            reponse.raise_for_status()
            return BeautifulSoup(reponse.text, 'lxml')
        except RequestException as e:
            print(f"Tentative {tentative + 1} échouée : {e}")
            time.sleep(2 ** tentative)  # Backoff exponentiel
    return None

Ce pattern de retry avec backoff exponentiel est indispensable en production. Il gère gracieusement les erreurs réseau temporaires sans surcharger le serveur.

Exporter les données en PDF ou CSV

Pour ceux qui cherchent à réaliser du web scraping avec export PDF, la bibliothèque pdfkit ou reportlab permet de transformer vos données extraites en documents formatés. L’export CSV avec le module natif csv reste néanmoins le format le plus pratique pour l’analyse ultérieure.

Si vous souhaitez approfondir vos compétences en développement PHP pour créer des applications qui consomment ces données, mon article sur les nouveautés de PHP 8 détaille les dernières fonctionnalités du langage. Pour manipuler les chaînes extraites, la fonction PHP implode s’avère très utile côté back-end.

Enfin, pour stocker et requêter efficacement les données scrapées, maîtriser le formatage des dates en SQL vous fera gagner un temps précieux lors de l’import en base.

À retenir

  • Commencez toujours par Requests + BeautifulSoup avant d’utiliser des outils plus complexes
  • Ajoutez un délai de 1 à 3 secondes entre chaque requête pour respecter les serveurs
  • Vérifiez le fichier robots.txt et les conditions d’utilisation avant tout scraping
  • Utilisez Playwright plutôt que Selenium pour les sites JavaScript modernes
  • Implémentez un système de retry avec backoff exponentiel pour la robustesse en production

Questions fréquentes


Peut-on utiliser Python pour scraper un site web ?

Oui, Python est le langage le plus utilisé pour le web scraping grâce à ses bibliothèques spécialisées comme Requests, BeautifulSoup et Scrapy. Un script basique d’extraction se code en moins de 10 lignes. Python gère aussi bien les pages statiques que les sites dynamiques via Selenium ou Playwright.


Le web scraping avec Python est-il légal ?

Le scraping est légal sous certaines conditions en France : vous devez respecter le fichier robots.txt, ne pas collecter de données personnelles sans base légale (RGPD), ne pas extraire une partie substantielle d’une base de données protégée, et ne pas surcharger les serveurs. Vérifiez toujours les conditions d’utilisation du site ciblé.


Python ou R : lequel est meilleur pour le web scraping ?

Python surpasse R pour le web scraping dans la majorité des cas. Son écosystème de bibliothèques est plus complet (Scrapy, Playwright, Selenium), sa gestion de l’asynchrone est native, et sa communauté dédiée au scraping est plus active. R avec rvest convient uniquement pour des extractions simples suivies d’analyses statistiques.


Comment scraper une page web étape par étape ?

Les étapes sont : installer Python et les bibliothèques (pip install requests beautifulsoup4), envoyer une requête HTTP vers l’URL cible avec requests.get(), parser le HTML avec BeautifulSoup, cibler les éléments avec find_all() ou select(), extraire le texte ou les attributs, puis sauvegarder les données en CSV ou JSON.


Quelle est la meilleure bibliothèque Python pour le scraping ?

Pour les débutants et les projets simples, BeautifulSoup couplée à Requests est idéale. Pour les projets à grande échelle nécessitant le crawl de milliers de pages, Scrapy est le framework de référence. Pour les sites dynamiques chargés en JavaScript, Playwright offre le meilleur compromis entre performance et facilité d’utilisation.


Le scraping avec BeautifulSoup est-il légal ?

BeautifulSoup est un simple outil de parsing HTML ; c’est l’usage que vous en faites qui détermine la légalité. Tant que vous respectez les robots.txt, les CGU du site, le RGPD et que vous n’extrayez pas de contenu protégé de manière substantielle, l’utilisation de BeautifulSoup pour du scraping est parfaitement légale.


Damien Roux
Damien Roux

Ingénieur système et expert hébergement web. Fondateur de web-city.fr, il partage guides pratiques, comparatifs objectifs et outils gratuits pour choisir le bon hébergeur et créer son site WordPress.

Scroll to Top