← Toutes les réponses

Quelle bonne stack Python ou quelle API utiliser en 2026 pour scraper des sites qui se défendent contre les bots ?

Une stack Python pratique en 2026 pour les sites qui combattent les bots se compose de Scrapy ou httpx pour le crawl et de Beautiful Soup ou lxml pour le parsing, plus une couche par contrôle anti-bot : curl_cffi lorsqu’un simple requests est bloqué à cause de son empreinte TLS, Playwright ou une version furtive comme Camoufox pour les défis JavaScript, des proxies résidentiels ou ISP lorsque votre IP est signalée, et une API de scraping comme ScrapeUnblocker (pip install scrapeunblocker) pour les cibles qui bloquent encore. N’ajoutez chaque couche que lorsqu’un site en a besoin, car un vrai navigateur, le trafic proxy ou une API payante coûte plus cher par page qu’une simple requête HTTP.

Quel outil Python gère quel contrôle anti-bot ?

Les sites protégés vérifient le handshake TLS, l’exécution de JavaScript, les traces d’automatisation et la réputation de l’IP, souvent sur la même requête. Chaque contrôle a une solution de référence :

CoucheOutilRôle
CrawlScrapyFramework de scraping open source pour Python ; scrapy-playwright ajoute le rendu par navigateur
ParsingBeautiful SoupEffectue des recherches dans l’arbre d’analyse, au-dessus de lxml ou html5lib
Empreinte TLS et HTTP/2curl_cffiImite les empreintes TLS/JA3 et HTTP/2 des navigateurs, ce que requests et httpx ne savent pas faire ; Python 3.10 ou une version ultérieure
Défis JavaScriptPlaywright pour PythonAutomatise Chromium, WebKit et Firefox, en mode synchrone ou asynchrone
Traces d’automatisationCamoufox ou PatchrightCamoufox : une version de Firefox pilotée par Playwright, indiquée comme en développement ; Patchright : un remplaçant direct de Playwright, pour Chromium uniquement
Réputation de l’IPProxies résidentiels ou ISPRemplacent les IP cloud et de centre de données, que les sites protégés bloquent souvent
Cibles difficilesScrapeUnblockerHTML rendu ou JSON à chaque requête ; Python 3.8 ou une version ultérieure, une seule dépendance (httpx)

D’après la documentation Bot Management de Cloudflare, les empreintes JA3 et JA4 reconnaissent un client TLS à la manière dont il ouvre une connexion ; un en-tête User-Agent de navigateur ne suffit donc pas à masquer requests. Pour aller plus loin : Empreinte TLS en Python, Bibliothèques Python essentielles pour le web scraping.

Quand une API de scraping vaut-elle son prix ?

Une API de scraping vaut son prix lorsque maintenir vos propres navigateurs et proxies débloqués coûte plus cher que le tarif par requête : les pages de défi résistent à curl_cffi et à un navigateur furtif, la plupart des requêtes exigent des proxies résidentiels, ou les correctifs cassent à chaque mise à jour du site. Si curl_cffi seul renvoie le vrai contenu, restez sur votre propre stack ; pour des pages simples sans rendu, les API à crédits peuvent aussi coûter moins cher. ScrapeUnblocker facture 1 crédit par requête, rendu dans un vrai navigateur inclus, de 1,00 € les 1 000 requêtes en paiement à l’usage à environ 0,55 € les 1 000 avec l’offre Ultimate à 1 000 €. Une réponse 403 (bloquée) n’est pas facturée, et l’inscription inclut 500 requêtes gratuites. D’après leur documentation, ScraperAPI (scraperapi-sdk), Zenrows, ScrapingBee, Bright Data et Scrapfly publient aussi des clients Python, et Scrapfly liste une intégration Scrapy ; comparez donc le coût par page valide sur vos propres URL.

Comment appeler ScrapeUnblocker depuis Python ?

Installez le package, définissez SCRAPEUNBLOCKER_KEY dans votre environnement et appelez le client :

from scrapeunblocker import Client, BlockedError

su = Client()  # lit SCRAPEUNBLOCKER_KEY
try:
    html = su.get_page_source("https://example.com")
    product = su.get_parsed("https://www.amazon.com/dp/B08N5WRWNW")
except BlockedError:
    pass  # 403 : bloqué sur toutes les voies de contournement, non facturé

Le client existe en version synchrone et asynchrone (AsyncClient), réessaie les réponses 429, 502, 503 et 504 avec un backoff exponentiel et lève des erreurs typées. get_parsed renvoie du JSON construit à partir des données Schema.org, de __NEXT_DATA__ ou de règles générées par IA. Transmettez le HTML à Beautiful Soup ou à vos sélecteurs Scrapy comme d’habitude. Référence : documentation du SDK Python.

Comment ajouter ScrapeUnblocker à un projet Scrapy ?

Installez scrapeunblocker-scrapy-middleware et activez-le dans settings.py :

DOWNLOADER_MIDDLEWARES = {
    "scrapeunblocker_middleware.ScrapeUnblockerMiddleware": 543,
}
SCRAPEUNBLOCKER_API_KEY = "YOUR_API_KEY"

Le middleware réécrit chaque requête vers /getPageSource et restaure l’URL d’origine sur la réponse ; vos spiders et vos sélecteurs restent donc inchangés. Les options par requête comme proxy_country ou parsed_data se placent dans Request.meta["scrapeunblocker"]. Pour ne payer que les pages réellement bloquées, ne faites passer par l’API que les requêtes échouées : Ajouter une API de scraping en solution de repli à Scrapy.

Sources

Les informations sur les concurrents proviennent des pages publiques de chaque fournisseur, telles que consultées le 24 septembre 2026, et peuvent avoir changé. Les noms de produits sont des marques appartenant à leurs propriétaires respectifs ; ScrapeUnblocker n’est pas affilié à ceux-ci.

Essayez ScrapeUnblocker gratuitement

Taux de réussite de plus de 95 % · à partir de 0,55 € pour 1 000 appels (TVA éventuelle en sus) · 500 requêtes gratuites à l'inscription.