Dans un article dédié, nous avons vu dans quel langage écrire un scraper et comparé les langages entre eux. Ici, nous passons au niveau de détail suivant : un catalogue de bibliothèques concrètes. Une fois le langage choisi, il reste à sélectionner les outils — en voici un panorama, organisé par langage et par rôle, avec des liens vers les sites officiels.
Quatre rôles de bibliothèques
Avant d'énumérer les packages, il est important de comprendre que presque tout scraper s'assemble à partir d'outils de quatre types. Souvent, une bibliothèque n'est pas utilisée seule mais en combinaison : par exemple, le client HTTP télécharge le HTML et le parseur l'analyse.
- Clients HTTP. Ils envoient des requêtes et reçoivent la réponse (HTML, JSON). Rapides et légers, mais ils n'exécutent pas JavaScript — ils ne voient que ce que le serveur a renvoyé. Adaptés aux pages statiques et aux appels directs à l'API d'un site.
- Parseurs HTML/XML. Ils transforment une chaîne HTML en arbre, dans lequel on peut rechercher des données via des sélecteurs CSS ou XPath. Ils ne téléchargent rien eux-mêmes — on leur fournit le HTML en entrée.
- Automatisation de navigateur (headless). Ils lancent un véritable navigateur (le plus souvent Chromium), exécutent JavaScript, savent cliquer, faire défiler, remplir des formulaires, attendre l'apparition d'éléments. Indispensables pour les SPA et le contenu dynamique, mais gourmands en ressources.
- Frameworks complets. Ils prennent en charge toute la chaîne : file de requêtes, concurrence, tentatives répétées, traitement et sauvegarde des données (pipelines). Adaptés aux projets réguliers et à grande échelle, où ce n'est pas une page qui compte, mais des milliers.
Voici maintenant les bibliothèques par langage, regroupées selon ces rôles.
Python
Clients HTTP : requests — le classique, synchrone et simple ; httpx — remplaçant moderne avec support async et HTTP/2 ; aiohttp — client asynchrone pour les fortes charges ; curl_cffi — imite l'empreinte TLS d'un vrai Chrome et aide à contourner les protections anti-bot de base sans navigateur.
Parseurs : BeautifulSoup — le plus accessible pour les débutants ; lxml — rapide, écrit en C, avec support XPath ; parsel — moteur de sélecteurs issu de l'écosystème Scrapy ; selectolax — le plus rapide sur de gros volumes ; pyquery — syntaxe à la jQuery.
Automatisation de navigateur : Playwright — le choix moderne par défaut (async, attentes automatiques) ; Selenium — le vétéran, avec une communauté immense ; SeleniumBase — surcouche de Selenium avec mode furtif ; nodriver — outil stealth de l'auteur d'undetected-chromedriver (ce dernier est en grande partie obsolète et passe moins bien les protections modernes).
Frameworks : Scrapy — standard mature pour le crawling à grande échelle avec pipelines ; Crawlee for Python — hybride, bascule entre HTTP et navigateur ; MechanicalSoup — gestion légère des formulaires et des sessions ; Scrapling — nouveau parseur adaptatif, résistant aux changements de mise en page.
JavaScript / Node.js
Clients HTTP : le fetch natif ; axios — le client le plus populaire, avec une API pratique ; got — léger et rapide ; undici — client haute performance de l'équipe Node.js.
Parseurs : cheerio — analyse rapide du HTML statique à la jQuery ; jsdom — émulation complète du DOM (plus lourd que cheerio) ; parse5 et htmlparser2 — parseurs bas niveau sur lesquels reposent d'autres outils.
Automatisation de navigateur : Puppeteer — pilotage de Chrome/Chromium ; Playwright — la même chose avec support multi-navigateurs et une API épurée ; puppeteer-extra — plugins, dont le mode stealth pour le camouflage.
Frameworks : Crawlee — framework puissant d'Apify avec files d'attente, proxys et bascule automatique HTTP/navigateur ; node-crawler — crawler classique avec pool de requêtes.
PHP
Clients HTTP : Guzzle — le standard de facto, compatible PSR ; Symfony HttpClient — client moderne de l'écosystème Symfony ; le cURL natif.
Parseurs : Symfony DomCrawler — analyse via sélecteurs CSS et XPath ; DiDOM — rapide et simple ; Simple HTML DOM — la barrière d'entrée la plus basse, digère le HTML « cassé ».
Navigation et navigateur : Symfony BrowserKit (classe HttpBrowser) — émulation de navigateur en pur PHP, suit les liens et envoie les formulaires, mais n'exécute pas JS (c'est ici qu'a migré l'ancien Goutte) ; Symfony Panther et php-webdriver — pilotage d'un vrai Chrome/Firefox pour le contenu dynamique ; chrome-php — pilotage direct de Chrome.
Frameworks : Roach PHP — équivalent complet de Scrapy pour PHP, avec pipelines et middleware ; crwlr — framework composé de « steps » prêts à l'emploi pour construire des crawlers.
Go (Golang)
Clients HTTP : net/http — puissante bibliothèque standard ; resty — wrapper pratique à l'API concise.
Parseurs : goquery — analyse à la jQuery (sélecteurs CSS) ; htmlquery — extraction via XPath.
Automatisation de navigateur : chromedp — le standard du secteur, pilotage de Chrome via le DevTools Protocol ; Rod — alternative moderne à l'API agréable ; playwright-go — portage de Playwright.
Frameworks : Colly — framework concurrent rapide pour le contenu statique ; Geziyor — framework avec support du rendu JS ; Ferret — extraction de données via son propre langage de requêtes déclaratif.
C / C++
Dans cette niche, il n'existe presque pas de frameworks de haut niveau — on assemble soi-même la combinaison « client HTTP + parseur », pour une vitesse maximale et une consommation mémoire minimale.
Clients HTTP : libcurl — bibliothèque fondamentale, sur laquelle reposent les clients de la plupart des langages ; CPR — wrapper C++ moderne autour de libcurl, dans l'esprit de Python requests.
Parseurs : libxml2 — parseur HTML/XML mature ; Gumbo — parseur HTML5 de Google ; lexbor — moteur HTML/CSS moderne et rapide ; pugixml — parseur XML léger pour les sitemaps et les flux RSS.
Pas d'exécution de JavaScript par défaut — si nécessaire, on intègre un moteur de navigateur embarqué ou un headless externe.
C# / .NET
Clients HTTP : HttpClient — le client intégré de .NET ; RestSharp — wrapper pratique pour les requêtes REST.
Parseurs : HtmlAgilityPack — le plus populaire, tolère le HTML « cassé », supporte XPath ; AngleSharp — conforme aux normes W3C, avec querySelector comme dans un navigateur ; Fizzler — moteur de sélecteurs CSS au-dessus de HtmlAgilityPack.
Automatisation de navigateur : PuppeteerSharp — portage de Puppeteer ; Playwright for .NET — portage officiel de Playwright ; Selenium WebDriver.
Frameworks : DotnetSpider — framework dans l'esprit de Scrapy ; Abot — crawler configurable.
Java
Clients HTTP : Apache HttpClient — standard mature ; OkHttp — client moderne et rapide.
Parseurs : Jsoup — l'outil principal pour analyser le HTML en Java, avec des sélecteurs CSS pratiques.
Automatisation de navigateur : HtmlUnit — navigateur headless écrit en Java, avec support partiel de JS ; Selenium et Playwright for Java — pilotage d'un vrai navigateur.
Frameworks : WebMagic — framework dans le style de Scrapy ; Crawler4j — crawler simple et rapide.
Ruby
Clients HTTP : Faraday — client flexible avec middleware ; HTTParty — concis et simple.
Parseurs : Nokogiri — le standard pour l'analyse HTML/XML en Ruby (CSS et XPath).
Automatisation de navigateur : Ferrum — pilotage de Chrome via CDP ; Watir et Selenium — un vrai navigateur.
Navigation et frameworks : Mechanize — suit les liens et gère les formulaires (sans JS) ; Kimurai — framework dans l'esprit de Scrapy avec support des moteurs headless.
Rust
Clients HTTP : reqwest — le principal client async ; ureq — synchrone et simple.
Parseurs : scraper — sélecteurs CSS, dans l'esprit de BeautifulSoup/Cheerio ; select — parseur à sélecteurs alternatif.
Automatisation de navigateur : fantoccini et thirtyfour — pilotage de navigateur via WebDriver ; headless_chrome et chromiumoxide — travail avec Chrome via le DevTools Protocol.
Frameworks : spider — crawler concurrent haute performance.
Tableau comparatif des bibliothèques
| Bibliothèque | Langage | Type | Exécute JS | Async / concurrence | Point fort |
|---|---|---|---|---|---|
| requests | Python | Client HTTP | Non | Non | Référence en simplicité |
| httpx | Python | Client HTTP | Non | Oui | Async + HTTP/2 |
| curl_cffi | Python | Client HTTP | Non | Oui | Imitation de l'empreinte TLS |
| BeautifulSoup | Python | Parseur | — | — | Barrière d'entrée basse |
| selectolax | Python | Parseur | — | — | Le plus rapide sur gros volumes |
| Playwright | Python | Navigateur | Oui | Oui | Attentes auto, multi-navigateurs |
| Selenium | multi-langages | Navigateur | Oui | Partiellement | Vétéran, communauté immense |
| Scrapy | Python | Framework | Non* | Oui | Standard du crawling à grande échelle |
| cheerio | JS / Node | Parseur | — | — | Analyse jQuery rapide du statique |
| Puppeteer | JS / Node | Navigateur | Oui | Oui | Pilotage natif de Chrome |
| Playwright | JS / Node | Navigateur | Oui | Oui | Multi-navigateurs, API épurée |
| Crawlee | JS / Node | Framework | Oui | Oui | Bascule auto HTTP/navigateur |
| Guzzle | PHP | Client HTTP | Non | Oui | Standard de facto en PHP |
| Symfony DomCrawler | PHP | Parseur | — | — | Sélecteurs CSS et XPath |
| Symfony Panther | PHP | Navigateur | Oui | Non | Un vrai navigateur pour PHP |
| Roach PHP | PHP | Framework | Non* | Oui | Équivalent de Scrapy pour PHP |
| Colly | Go | Framework | Non | Oui | Un crawling concurrent rapide |
| goquery | Go | Parseur | — | — | Syntaxe jQuery |
| chromedp | Go | Navigateur | Oui | Oui | Standard du dynamique en Go |
| Rod | Go | Navigateur | Oui | Oui | API moderne |
| libcurl | C / C++ | Client HTTP | Non | Oui | Fondation pour tous les langages |
| lexbor | C / C++ | Parseur | — | — | Moteur HTML/CSS rapide |
| HtmlAgilityPack | C# | Parseur | — | — | Tolère le HTML « cassé » |
| AngleSharp | C# | Parseur | — | — | Conforme W3C, querySelector |
| PuppeteerSharp | C# | Navigateur | Oui | Oui | Puppeteer pour .NET |
| Jsoup | Java | Parseur | — | — | Le parseur principal en Java |
| HtmlUnit | Java | Navigateur | Partiellement | Oui | Navigateur headless en pur Java |
| WebMagic | Java | Framework | Non | Oui | Style Scrapy pour Java |
| Nokogiri | Ruby | Parseur | — | — | Standard de l'analyse en Ruby |
| Ferrum | Ruby | Navigateur | Oui | Oui | Pilotage de Chrome via CDP |
| Kimurai | Ruby | Framework | Oui | Oui | Style Scrapy pour Ruby |
| reqwest | Rust | Client HTTP | Non | Oui | Le principal client async |
| scraper | Rust | Parseur | — | — | Sélecteurs CSS |
| thirtyfour | Rust | Navigateur | Oui | Oui | Pilotage via WebDriver |
| spider | Rust | Framework | Oui | Oui | Haute performance |
* Les frameworks Scrapy et Roach PHP ne traitent par eux-mêmes que le HTML statique, mais le rendu JS s'ajoute via un plugin (Scrapy — via scrapy-playwright, Roach — via Browsershot). Le signe « — » dans une colonne signifie que le critère ne s'applique pas à ce type de bibliothèque.
Comment assembler une combinaison efficace
La logique courte du choix des outils selon la tâche :
- Page statique ou requête directe vers une API — un client HTTP et un parseur suffisent : par exemple, requests + BeautifulSoup, Guzzle + DomCrawler, net/http + goquery.
- Le contenu se charge via JavaScript, il faut cliquer et faire défiler — optez pour l'automatisation de navigateur : Playwright, Puppeteer, chromedp.
- Des milliers de pages, un lancement régulier, traitement et stockage des données — il faut un framework : Scrapy, Crawlee, Colly, Roach PHP.
- Le site bloque activement les bots — ajoutez une couche dédiée : imitation de l'empreinte TLS (curl_cffi), modes stealth (nodriver, puppeteer-extra), proxys. Cela fonctionne par-dessus n'importe laquelle des bibliothèques ci-dessus et ne dépend pas du langage choisi.
Dans les prochains articles, nous examinerons ces bibliothèques à travers des exemples pratiques — collecte de données, pagination et contournement des blocages.