Python Web Scraping en 2026 : httpx + BeautifulSoup + Playwright — Quand utiliser lequel
La plupart des tutoriels « Python web scraping » de 2018 recommandent toujours « request + BeautifulSoup ». La partie « requêtes » est correcte, mais il existe désormais de meilleures valeurs par défaut, et la moitié du Web moderne restitue le contenu en JavaScript, de sorte que la pile classique renvoie silencieusement les pages vides.
Ce guide couvre l'arbre de décision 2026 : quand « httpx + BeautifulSoup » est correct (toujours plus de 90 % des sites), quand recourir à « Playwright », comment éviter d'être bloqué et les deux règles qui maintiennent votre grattoir à la fois légal et éthique.
L'arbre de décision en une seule image
C'est tout. Quatre-vingt-dix pour cent des tâches de scraping sont du HTML statique — la pile classique (renommée) est le bon outil. Le reste nécessite une exécution JS et Playwright est la réponse moderne.
Étape 1 : httpx + BeautifulSoup (le cas à 90 %)
httpx est le remplacement instantané de requests. Même API, plus prise en charge HTTP/2 et asynchrone native. BeautifulSoup est inchangé par rapport à 2015 — le choix de l'analyseur est important (lxml est 5 fois plus rapide que la valeur par défaut).
Choix clés :
- `headers={"User-Agent": ...}` — définit toujours un véritable UA (une adresse de contact est polie). L'UA
httpxpar défaut est souvent bloquée. - `timeout=10` — ne faites jamais de requête illimitée ; les connexions bloquées fuient les descripteurs de fichiers.
- `raise_for_status()` — augmente à 4xx/5xx donc les échecs sont bruyants et non silencieux.
- `"lxml"` analyseur — 5x plus rapide que le
html.parserpar défaut, et plus indulgent avec le HTML mal formé. - `soup.select("css-selector")` — traite le scraping comme "faire semblant d'utiliser
document.querySelectorAllde JavaScript". Les sélecteurs CSS sont généralement ce que vous voulez, pas l'API arborescente.
Étape 2 : Dramaturge (lorsque JS restitue le contenu)
De nombreux SPA modernes (React, Vue, Angular) fournissent un <div id="root"> vide et hydratent tout côté client. httpx.get vous obtient un shell vide — les données souhaitées sont chargées via fetch après le chargement de la page.
Test : httpx.get(url).text — recherchez les données souhaitées. Si ce n'est pas le cas, le site nécessite une exécution JS.
Installer : pip install playwright && playwright install chromium (le téléchargement du navigateur fait ~ 150 Mo — ça vaut le coup une fois, pénible à chaque exécution de CI sans mise en cache).
Coût : Playwright est 10 à 50 fois plus lent que « httpx » (chargement de la page + exécution JS + surcharge du navigateur). Ne l'atteignez que lorsque les données ne sont pas dans le HTML statique.
Les quatre façons d'être bloqué
La plupart des systèmes anti-grattage surveillent ces quatre empreintes digitales :
1. Agent utilisateur manquant/évident
2. Aucun délai entre les demandes
Les requêtes séquentielles brutes martèlent un serveur. Ajoutez un délai proportionnel à leur temps de réponse : si une page met 500 ms à être diffusée, attendez 500 à 2 000 ms entre les requêtes. asyncio.sleep(random.uniform(0.5, 2.0)).
3. Demander des chemins non autorisés /robots.txt
Certains sites utilisent « robots.txt » pour les signaux de taux légitimes — vérifiez avant de supprimer :
4. Incompatibilité d'empreinte digitale TLS/navigateur
Anti-scraping avancé (Cloudflare, DataDome) empreinte digitale de votre poignée de main TLS et de votre environnement JS. httpx ne ressemble en rien à Chrome au niveau de la couche TLS. Possibilités :
curl_cffi— une bibliothèque basée sur l'usurpation d'identité curl qui imite le vrai TLS du navigateur.- Playwright — vrai navigateur TLS par définition.
- Rotation des proxys résidentiels – l'option nucléaire.
Pour 99% des cas d'utilisation (sites non hostiles, volume modéré, aucune connexion requise), le respect de httpx + UA réel + délai + robots.txt suffit. Si vous supprimez à grande échelle des sites protégés par Cloudflare, vous avez besoin de vrais navigateurs ou de services de déblocage payants.
Limiter votre rythme (le sémaphore + le rythme du sommeil)
Pour le scraping en masse, combinez « asyncio.Semaphore » (maximum simultané) avec « asyncio.sleep » (délai par requête) :
Le plafonnement à 5-10 simultanés + 500 ms-2 s par requête vous maintient bien en dessous de ce qui déclenche des alarmes de limite de débit sur la plupart des sites.
Règles juridiques + éthiques
1. Lisez les conditions d'utilisation du site. Beaucoup interdisent carrément le scraping - vous pouvez toujours le faire (les ToS sont le droit des contrats, pas le droit pénal dans la plupart des juridictions), mais vous assumez le risque juridique. LinkedIn contre hiQ (2022) a établi que la récupération de données visibles publiquement ne constitue pas une violation de la CFAA aux États-Unis, mais que le port d'un sweat à capuche ne vous rend pas invisible.
2. Ne supprimez pas les données personnelles. Le RGPD/CCPA/tout le reste pénalise la collecte d'informations personnelles sans consentement. Si vous créez un ensemble de données « d’employés de l’entreprise X », arrêtez-vous.
Ajouts éthiques que tout le monde oublie :
- Envoyez une véritable adresse de contact dans votre UA. Si votre bot pose des problèmes, le propriétaire du site devrait pouvoir vous envoyer un e-mail.
- Si vous mettez en cache les données du site, mettez-le en cache de manière agressive : n'atteignez pas leurs serveurs à chaque exécution.
- Préférez les API publiques même si elles sont payantes. Moins cher que le risque juridique.
Le résumé de l'outillage 2026
| Tâche | Atteindre |
|---|---|
| Pages HTML statiques | httpx + BeautifulSoup(html, "lxml") |
| SPA rendu en JS | « Dramaturge » (Chromium sans tête) |
| Cloudflare / anti-bot | curl_cffi ou Dramaturge + proxy résidentiel |
| Grattage de gros volumes | httpx.AsyncClient + Sémaphore + veille |
| Données API structurées | httpx.get + .json() — aucune soupe n'est nécessaire |
Le scraping Web en 2026 est toujours à 90 % « httpx + BeautifulSoup », en plus de savoir quand passer à un vrai navigateur. Maîtrisez les habitudes de polite-scraper (véritable UA, sémaphore, sommeil, robots.txt) et vous construirez des pipelines de données durables sans être bloqué ou poursuivi en justice.
Prochaine étape : le piste Data Science comprend 15 leçons sur le scraping, l'ETL et les pandas : vous construirez un véritable pipeline de bout en bout, de la récupération HTTP au DataFrame en passant par l'exportation CSV.