
À la une
TypeScript avec React : décryptage et bonnes pratiques
Utiliser Map en TypeScript : guide complet avec exemples
L’accessibilité web : pourquoi est-ce indispensable ?
Qu’est-ce que le Lean UX et pourquoi l’adopter ?
Les interfaces en TypeScript : guide complet et pratique
Node.js, c’est quoi ? Tout comprendre en 5 minutes
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
Sommaire
- Pourquoi choisir Python pour le scraping web
- Prérequis et installation de l’environnement
- Votre premier script d’extraction en 10 lignes
- BeautifulSoup : naviguer dans le DOM comme un pro
- Scrapy pour les projets d’extraction à grande échelle
- Gérer les sites dynamiques avec JavaScript
- Comparatif des bibliothèques de scraping Python
- Aspects légaux et bonnes pratiques
- Erreurs courantes et solutions
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.

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.
Voir aussi Utiliser Map en TypeScript : guide complet avec exemples
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 : 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()

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 est spécialiste de l'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.
Sources
À lire aussi

L’accessibilité web : pourquoi est-ce indispensable ?
Qu'est-ce que l'accessibilité web exactement ? Depuis que je conçois des sites web, en 2014, j'ai vu la…

Qu’est-ce que le Lean UX et pourquoi l’adopter ?
Définition du lean ux design Après plus de dix ans à concevoir des interfaces pour des projets web variés, je…

Les interfaces en TypeScript : guide complet et pratique
Quand j'ai commencé à travailler avec TypeScript sur mes projets professionnels, la première fonctionnalité…

Node.js, c’est quoi ? Tout comprendre en 5 minutes
Quand j'ai découvert Node.js en 2015, je venais de huit ans de développement PHP en agence. Je me souviens…

Installer Node.js sur Ubuntu : le guide pas à pas
Pourquoi installer Node.js sur Ubuntu Depuis que je travaille comme développeur full-stack, Node.js est…

Vue.js contre React : quel outil choisir en 2026 ?
Depuis plus de douze ans, je développe des applications web pour des clients aux profils très variés. J'ai…

















