Utilisation de curl_cffi pour le Scraping web en Python

Découvrez comment curl_cffi permet un scraping web Python discret et efficace en imitant les empreintes TLS réelles des navigateurs.
13 min de lecture
web scraping with curl-cffi blog image

Dans ce guide, vous apprendrez :

  • Ce qu’est curl_cffi et les fonctionnalités qu’il offre
  • Comment il minimise la détection des bots basée sur les empreintes TLS
  • Comment l’utiliser avec Python pour le Scraping web
  • Utilisation avancée et méthodes
  • Une comparaison avec des clients HTTP similaires

C’est parti !

Qu’est-ce que curl_cffi?

curl_cffi est une bibliothèque qui fournit des liaisons Python pour le fork curl-impersonate via CFFI. En d’autres termes, il s’agit d’un client HTTP capable d’usurper l’identité des empreintes TLS/JA3/HTTP2 des navigateurs. Cela fait de cette bibliothèque une excellente solution pour contourner les blocages anti-bot basés sur les empreintes TLS.

⚙️ Caractéristiques

  • Prend en charge l’usurpation d’empreintes JA3/TLS et HTTP2, y compris les navigateurs récents et les empreintes personnalisées
  • Beaucoup plus rapide que requests et httpx, comparable à aiohttp
  • Imitation de l’API requests
  • Prend en charge asyncio pour les requêtes HTTP asynchrones
  • Prise en charge de la rotation des proxys à chaque requête
  • Prend en charge HTTP/2.0
  • Prend en charge les WebSockets

Comment ça marche

curl_cffi est basé sur cURL Impersonate, une bibliothèque qui génère des empreintes TLS correspondant à celles des navigateurs réels.

Lorsque vous envoyez une requête HTTPS, une poignée de main TLS se produit, produisant une empreinte TLS unique. Comme les clients HTTP diffèrent des navigateurs, leurs empreintes peuvent exposer l’automatisation, déclenchant des défenses anti-bot.

cURL Impersonate modifie cURL pour correspondre aux empreintes TLS des navigateurs réels :

  • Modifications de la bibliothèque TLS: s’appuie sur les bibliothèques utilisées par les navigateurs pour les connexions TLS plutôt que sur celles de cURL.
  • Modifications de configuration: ajustez les extensions TLS et les options SSL pour imiter les navigateurs.
  • Personnalisation HTTP/2: correspondez aux paramètres de poignée de main du navigateur.
  • Indicateurs cURL non par défaut: définissez --ciphers, --curves et des en-têtes personnalisés pour plus de précision.

Cela permet aux requêtes d’apparaître comme provenant d’un navigateur, ce qui aide à contourner la détection des bots. Pour plus d’informations, consultez notre guide sur cURL Impersonate.

Comment utiliser curl_cffi pour le Scraping web : guide étape par étape

Supposons que votre objectif soit de scraper la page « Clavier » de Walmart :

The Walmart “Keyboard” product page

Si vous essayez d’accéder à cette page à l’aide d’un client HTTP, vous obtiendrez la page d’erreur suivante :

Note the response from the server

Ne vous laissez pas tromper par le statut de réponse 200 OK. La page renvoyée par le serveur de Walmart est en fait une page de détection des bots. Elle vous demande spécifiquement de vérifier que vous êtes bien un humain à l’aide d’un CAPTCHA.

Vous vous demandez peut-être comment cela est possible, même si vous avez configuré l'agent utilisateur pour simuler un navigateur réel ? La réponse est le fingerprinting TLS !

Voyons maintenant comment utiliser curl_cffi pour contourner les mesures anti-bot et effectuer facilement du Scraping web.

Étape n° 1 : configuration du projet

Tout d’abord, assurez-vous que Python 3+ est installé sur votre machine. Sinon, téléchargez-le depuis le site officiel et suivez les instructions d’installation.

Ensuite, créez un répertoire pour votre projet de scraping curl_cffi à l’aide de cette commande :

mkdir curl-cfii-Scraper

Accédez à ce répertoire et configurez un environnement virtuel à l’intérieur :

cd curl-cfii-Scraper
python -m venv env

Ouvrez le dossier du projet dans votre IDE Python préféré. Visual Studio Code avec l’extension Python ou PyCharm Community Edition sont deux choix valables.

Créez maintenant un fichier scraper.py dans le dossier du projet. Il sera vide au début, mais vous y ajouterez bientôt la logique de scraping.

Dans le terminal de votre IDE, activez l’environnement virtuel. Sous Linux ou macOS, utilisez :

./env/bin/activate

De manière équivalente, sous Windows, lancez :

env/Scripts/activate

Super ! Vous êtes prêt à commencer.

Étape n° 2 : installer curl_cffi

Dans un environnement virtuel activé, installez le client HTTP via le paquet pip curl-cffi:

pip install curl-cffi

En arrière-plan, cette bibliothèque télécharge automatiquement les binaires d’imitation curl pour Windows, macOS et Linux.

Étape n° 3 : connectez-vous à la page cible

Importez les requêtes depuis curl_cffi:

from curl_cffi import requests

Cet objet expose une API de haut niveau similaire à celle de la bibliothèque Python Requests.

Vous pouvez l’utiliser pour effectuer une requête HTTP GET vers la page cible comme suit :

response = requests.get("https://www.walmart.com/search?q=keyboard", impersonate="chrome")

L’argument impersonate="chrome" indique à curl_cffi de faire en sorte que la requête HTTP semble provenir de la dernière version de Chrome. Ainsi, Walmart traitera la requête automatisée comme une requête de navigateur classique et renverra la page Web standard au lieu d’une page anti-bot.

Vous pouvez accéder au contenu HTML de la page cible avec :

html = response.text

Si vous imprimez html, vous verrez :

<!DOCTYPE html>
<html lang="en-US">
   <head>
      <meta charSet="utf-8"/>
      <meta property="fb:app_id" content="105223049547814"/>
      <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1, interactive-widget=resizes-content"/>
      <link rel="dns-prefetch" href="https://tap.walmart.com "/>
      <link rel="preload" fetchpriority="high" crossorigin="anonymous" href="https://i5.walmartimages.com/dfw/63fd9f59-a78c/fcfae9b6-2f69-4f89-beed-f0eeb4237946/v1/BogleWeb_subset-Bold.woff2" as="font" type="font/woff2"/>
      <link rel="preload" fetchpriority="high" crossorigin="anonymous" href="https://i5.walmartimages.com/dfw/63fd9f59-a78c/fcfae9b6-2f69-4f89-beed-f0eeb4237946/v1/BogleWeb_subset-Regular.woff2" as="font" type="font/woff2"/>
      <link rel="preconnect" href="https://beacon.walmart.com"/>
      <link rel="preconnect" href="https://b.wal.co"/>
      <title>Électronique - Walmart.com</title>
      <!-- omis pour plus de concision ... -->

Parfait ! Il s’agit du code HTML de la page produit « clavier » standard de Walmart.

Étape n° 4 : ajouter la logique de scraping des données

curl_cffi est simplement un client HTTP qui vous aide à récupérer le code HTML d’une page. Si vous souhaitez effectuer du Scraping web, vous aurez également besoin d’une bibliothèque pour l’analyse HTML, telle que BeautifulSoup. Pour plus d’informations, consultez notre guide sur le Scraping web avec BeautifulSoup.

Dans l’environnement virtuel activé, installez BeautifulSoup :

pip install beautifulsoup4

Importez-le dans scraper.py:

from bs4 import BeautifulSoup

Ensuite, utilisez-le pour analyser le code HTML de la page :

soup = BeautifulSoup(response.text, "html.parser")

« html.parser » est l’analyseur HTML par défaut de la bibliothèque standard Python utilisé par BeautifulSoup pour analyser la chaîne HTML. À présent, soup contient toutes les méthodes dont vous avez besoin pour sélectionner les éléments HTML de la page et en extraire les données.

Dans cet exemple, comme l’analyse des données n’est pas le plus important, nous allons uniquement extraire le titre de la page. Vous pouvez le sélectionner à l’aide d’un sélecteur CSS en utilisant la méthode find(), puis accéder à son texte avec l’attribut text:

title_element = soup.find("title")
title = title_element.text

Pour une logique de scraping plus avancée, consultez notre guide sur la manière de scraper Walmart.

Enfin, affichez le titre de la page :

print(title)

Super ! Vous avez mis en œuvre une logique de Scraping web de base.

Étape n° 5 : assembler le tout

Voici votre script final de scraping web curl_cffi:

from curl_cffi import requests
from bs4 import BeautifulSoup

# Envoyez une requête GET à la page de recherche Walmart pour « keyboard » (clavier)
response = requests.get("https://www.walmart.com/search?q=keyboard", impersonate="chrome")

# Extrayez le code HTML de la page
html = response.text

# Analyser le contenu de la réponse avec BeautifulSoup
soup = BeautifulSoup(response.text, "html.parser")

# Trouver la balise titre à l'aide d'un sélecteur CSS et l'imprimer
title_element = soup.find("title")
# Extraire les données de celle-ci
title = title_element.text

# Logique de scraping plus complexe...

# Imprimer les données scrapées
print(title)

Lancez-le avec la commande suivante :

python3 Scraper.py

Ou, de manière équivalente, sous Windows :

python Scraper.py

Le résultat sera :

Électronique - Walmart.com

Si vous supprimez l’argument impersonate="chrome", vous obtiendrez à la place :

Robot ou humain ?

Cela démontre à quel point l’usurpation d’identité du navigateur fait toute la différence lorsqu’il s’agit d’éviter les mesures anti-scraping.

Mission accomplie !

curl_cffi: utilisation avancée

Maintenant que vous savez comment fonctionne la bibliothèque, vous êtes prêt à explorer des scénarios plus avancés.

Sélection de l’usurpation d’identité du navigateur

curl_cffi prend en charge l’usurpation de plusieurs navigateurs. Chaque navigateur est associé à une étiquette unique que vous pouvez passer à l’argument impersonate comme ci-dessous :

response = requests.get("<VOTRE_URL>", impersonate="<ÉTIQUETTE_DU_NAVIGATEUR>")

Voici les étiquettes des navigateurs pris en charge :

  • chrome99, chrome100, chrome101, chrome104, chrome107, chrome110, chrome116, chrome119, chrome120, chrome123, chrome124, chrome131
  • chrome99_android, chrome131_android
  • edge99, edge101
  • safari15_3, safari15_5, safari17_0, safari17_2_ios, safari18_0, safari18_0_ios

Remarques:

  1. Pour toujours utiliser les dernières versions des navigateurs, vous pouvez simplement utiliser chrome, safari et safari_ios.
  2. Firefox n’est actuellement pas disponible, car seuls les navigateurs basés sur WebKit sont pris en charge.
  3. Les versions des navigateurs ne sont ajoutées que lorsque leurs empreintes changent. Si une version, telle que chrome122, est ignorée, vous pouvez toujours l’imiter en utilisant les en-têtes de la version précédente.
  4. Pour les cibles non liées à un navigateur, utilisez ja3, akamai et des arguments similaires pour spécifier vos propres empreintes TLS personnalisées. Pour plus de détails, consultez la documentation sur l’usurpation d’identité.

Gestion des sessions

Tout comme la bibliothèque requests, curl-cfii prend en charge les sessions. Les objets de session vous permettent de conserver certains paramètres sur plusieurs requêtes, tels que les cookies, les en-têtes ou d’autres données spécifiques à la session.

Voici comment définir une session à l’aide des liaisons Python pour la bibliothèque cURL Impersonate :

# Créer une nouvelle session
session = requests.Session()

# Ce point de terminaison définit un cookie sur le serveur
session.get("https://httpbin.io/cookies/set/userId/5", impersonate="chrome")

# Imprimer les cookies de la session pour confirmer qu'ils sont stockés
print(session.cookies)

Le résultat du script ci-dessus sera le suivant :

<Cookies[<Cookie userId=5 for httpbin.org />]>

Le résultat prouve que la session conserve son état d’une requête à l’autre, par exemple en stockant les cookies définis par le serveur.

Intégration du Proxy

Tout comme la bibliothèque requests, curl_cffi prend en charge l’intégration de Proxy via un objet Proxy:

# Définissez votre URL Proxy
proxy = "VOTRE_URL_PROXY"

# Créez un dictionnaire de proxys pour HTTP et HTTPS
proxies = {"http": proxy, "https": proxy}

# Effectuez une requête à l'aide d'un Proxy et d'une usurpation d'identité du navigateur
response = requests.get("<VOTRE_URL>", impersonate="chrome", proxies=proxies)

Étant donné que les API sous-jacentes sont très similaires à requests, consultez notre guide sur l’utilisation d’un Proxy dans Requests.

API asynchrone

curl_cffi prend en charge les requêtes asynchrones via asyncio à l’aide de l’objet AsyncSession:

from curl_cffi.requests import AsyncSession
import asyncio

# Définir une fonction asynchrone pour exécuter le code asynchrone
async def fetch_data():
    async with AsyncSession() as session:
        # Effectuer la requête GET asynchrone
        response = await session.get("https://httpbin.org/anything", impersonate="chrome")
        # Imprimer le texte de la réponse
        print(response.text)

# Exécuter la fonction asynchrone
asyncio.run(fetch_data())

L’utilisation d'AsyncSession facilite le traitement efficace de plusieurs requêtes asynchrones, ce qui est essentiel pour accélérer le Scraping web.

Connexion WebSockets

curl_cffi prend également en charge les WebSocketsvia la classe WebSocket:

from curl_cffi.requests import WebSocket


# Définir une fonction de rappel pour traiter les messages entrants
def on_message(ws, message):
    print(message)

# Initialiser la connexion WebSocket avec le rappel
ws = WebSocket(on_message=on_message)

# Se connecter à un exemple de serveur WebSocket et écouter les messages
ws.run_forever("wss://api.gemini.com/v1/marketdata/BTCUSD")

Cela est particulièrement utile pour extraire des données en temps réel à partir de sites ou d’API qui utilisent WebSocket pour remplir les données de manière dynamique. Citons par exemple les sites proposant des données sur les marchés financiers, les résultats sportifs en direct ou les chats en direct.

Au lieu d’extraire des pages rendues, vous pouvez cibler directement le canal WebSocket pour une récupération efficace des données.

Remarque: vous pouvez utiliser WebSocketsde manière asynchrone grâce à la classe AsyncWebSocket.

curl_cffi vs Requests vs AIOHTTP vs HTTPX pour le Scraping web

Vous trouverez ci-dessous un tableau récapitulatif comparant curl_cffi à d’autres clients HTTP Python populaires pour le Scraping web:

Fonctionnalité curl_cffi Requests AIOHTTP HTTPX
API de synchronisation ✔️ ✔️ ✔️
API asynchrone ✔️ ✔️ ✔️
Prise en charge des **WebSocket** ✔️ ✔️
Mise en commun des connexions ✔️ ✔️ ✔️ ✔️
Prise en charge de HTTP/2 ✔️ ✔️
**Personnalisation de l'agent utilisateur ** ✔️ ✔️ ✔️ ✔️
Usurpation d’empreinte TLS ✔️
Vitesse Élevée Moyenne Élevée Moyenne
Mécanisme de réessai Disponible via HTTPAdapters Disponible uniquement via une bibliothèque tierce Disponible via les transportsintégrés
Intégration Proxy ✔️ ✔️ ✔️ ✔️
Gestion des cookies ✔️ ✔️ ✔️ ✔️

curl_cffi Alternatives pour le Scraping web

curl_cffi implique une approche manuelle du Scraping web, où vous devez écrire vous-même la plupart du code. Bien que cela convienne aux sites web statiques simples, cela peut poser des difficultés lorsque vous ciblez des sites dynamiques ou plus sécurisés.

Bright Data propose toute une gamme d’alternatives à curl_cffi pour le Scraping web :

  • Navigateur de scraping: instances de navigateur cloud entièrement gérées et intégrées à Puppeteer, Selenium et Playwright. Ces navigateurs offrent une fonction intégrée de Résolution de CAPTCHA et une rotation automatisée des proxys, contournant les défenses anti-bot tout en interagissant avec les sites web comme de vrais utilisateurs.
  • API Web Scraper: points de terminaison préconfigurés pour récupérer des données fraîches et structurées à partir de plus de 100 domaines populaires. Ces API sont éthiques et conformes, permettant une extraction facile des données à l’aide de HTTPX ou de tout autre client HTTP.
  • No-Code Scraper: un service de collecte de données intuitif et à la demande qui élimine le codage. Il offre contrôle, évolutivité et flexibilité sans avoir à gérer l’infrastructure, les Proxies ou les obstacles anti-scraping.
  • Jeux de données: accédez à des jeux de données pré-construits provenant de divers sites web ou personnalisez les collectes de données en fonction de vos besoins.

Ces solutions simplifient le scraping en offrant des outils d’extraction de données robustes, évolutifs et conformes qui réduisent les efforts manuels.

Conclusion

Dans cet article, vous avez découvert comment utiliser la bibliothèque curl_cffi pour le Scraping web. Vous avez exploré son objectif, ses principales fonctionnalités et ses avantages. Ce client HTTP excelle en tant qu’option rapide et fiable pour effectuer des requêtes qui imitent les navigateurs réels.

Cependant, les requêtes HTTP automatisées peuvent exposer votre adresse IP publique, révélant potentiellement votre identité et votre emplacement, ce qui pose un risque pour votre vie privée. Pour protéger votre sécurité et votre anonymat, l’une des solutions les plus efficaces consiste à utiliser un Proxy pour masquer votre adresse IP.

Bright Data contrôle les meilleurs serveurs Proxy au monde, au service des entreprises du Fortune 500 et de plus de 20 000 clients. Son offre comprend une large gamme de types de Proxy :

Créez dès aujourd’hui un compte Bright Data gratuit pour tester nos Proxies et nos solutions de scraping !