Guide d'utilisation de cURL avec Python

Commentaires: 0

Le web scraping consiste à extraire des données de sites web pour des tâches telles que l'analyse de données, la recherche et l'automatisation. Bien que Python propose des bibliothèques pour envoyer des requêtes HTTPS et effectuer du scraping, l'utilisation de cURL via PycURL peut s'avérer plus efficace. Dans ce tutoriel, nous allons montrer comment utiliser Python cURL pour récupérer des pages web. Nous fournirons des exemples et comparerons ses performances avec d'autres bibliothèques populaires telles que Requests, HTTPX et AIOHTTP.

Démarrer avec cURL et Python

Avant de plonger dans l'intégration de Python, il est essentiel de comprendre les bases de cURL. Vous pouvez utiliser les commandes cURL directement dans le terminal pour effectuer des tâches telles que les requêtes GET et POST.

Exemples de commandes cURL :

# Demande GET
curl -X GET "https://httpbin.org/get"

# Demande POST
curl -X POST "https://httpbin.org/post"

1.png

2.png

Installation des bibliothèques requises

Pour utiliser cURL en Python, nous avons besoin de la bibliothèque pycurl, qui fournit une interface Python à la bibliothèque cURL.

Installation de PycURL :

pip install pycurl

Faire des requêtes HTTP avec PycURL

PycURL offre un contrôle détaillé des requêtes HTTP en Python. L'exemple ci-dessous montre comment effectuer une requête GET avec PycURL :

import pycurl
import certifi
from io import BytesIO

# Créer un objet BytesIO pour contenir les données de la réponse
buffer = BytesIO()

# Initialiser un objet cURL
c = pycurl.Curl()

# Définir l'URL pour la requête HTTP GET
c.setopt(c.URL, 'https://httpbin.org/get')

# Définir la mémoire tampon pour capturer les données de sortie
c.setopt(c.WRITEDATA, buffer)

# Définir le chemin d'accès au fichier bundle de l'autorité de certification pour la vérification SSL/TLS
c.setopt(c.CAINFO, certifi.where())

# Effectuer la requête HTTP
c.perform()

# Fermer l'objet cURL pour libérer des ressources
c.close()

# Récupérer le contenu de la réponse dans la mémoire tampon
body = buffer.getvalue()

# Décoder et imprimer le corps de la réponse
print(body.decode('iso-8859-1'))

Traitement des demandes POST

L'envoi de données avec des requêtes POST est courant. Avec PycURL, utilisez l'option POSTFIELDS. Voici un exemple de requête POST avec PycURL :

import pycurl
import certifi
from io import BytesIO

# Créer un objet BytesIO pour contenir les données de la réponse
buffer = BytesIO()

# Initialiser un objet cURL
c = pycurl.Curl()

# Définir l'URL pour la requête HTTP POSTv
c.setopt(c.URL, 'https://httpbin.org/post')

# Définir les données à enregistrer
post_data = 'param1="pycurl"¶m2=article'
c.setopt(c.POSTFIELDS, post_data)

# Définir la mémoire tampon pour capturer les données de sortie
c.setopt(c.WRITEDATA, buffer)

# Définir le chemin d'accès au fichier bundle de l'autorité de certification pour la vérification SSL/TLS
c.setopt(c.CAINFO, certifi.where())

# Effectuer la requête HTTP
c.perform()

# Fermer l'objet cURL pour libérer des ressources
c.close()

# Récupérer le contenu de la réponse dans la mémoire tampon
body = buffer.getvalue()

# Décoder et imprimer le corps de la réponse
print(body.decode('iso-8859-1'))

Gestion des en-têtes HTTP personnalisés

Des en-têtes personnalisés ou une authentification sont souvent nécessaires pour les requêtes HTTP. Vous trouverez ci-dessous un exemple de définition d'en-têtes personnalisés avec PycURL :

import pycurl
import certifi
from io import BytesIO

# Créer un objet BytesIO pour contenir les données de la réponse
buffer = BytesIO()

# Initialiser un objet cURL
c = pycurl.Curl()

# Définir l'URL pour la requête HTTP GET
c.setopt(c.URL, 'https://httpbin.org/get')

# Définir des en-têtes HTTP personnalisés
c.setopt(c.HTTPHEADER, ['User-Agent: MyApp', 'Accept: application/json'])

# Définir la mémoire tampon pour capturer les données de sortie
c.setopt(c.WRITEDATA, buffer)

# Définir le chemin d'accès au fichier bundle de l'autorité de certification pour la vérification SSL/TLS
c.setopt(c.CAINFO, certifi.where())

# Effectuer la requête HTTP
c.perform()

# Fermer l'objet cURL pour libérer des ressources
c.close()

# Récupérer le contenu de la réponse dans la mémoire tampon
body = buffer.getvalue()

# Décoder et imprimer le corps de la réponse
print(body.decode('iso-8859-1'))

Traitement des réponses XML

L'analyse et le traitement des réponses XML sont essentiels lorsque l'on travaille avec des API. Vous trouverez ci-dessous un exemple de traitement des réponses XML avec PycURL :

# Importer les bibliothèques nécessaires
import pycurl  # Bibliothèque permettant d'effectuer des requêtes HTTP
import certifi  # Bibliothèque pour la vérification des certificats SSL
from io import BytesIO  # Bibliothèque pour la gestion des flux d'octets
import xml.etree.ElementTree as ET  # Bibliothèque pour l'analyse syntaxique de XML

# Créer une mémoire tampon pour contenir les données de la réponse
buffer = BytesIO()

# Initialiser un objet cURL
c = pycurl.Curl()

# Définir l'URL pour la requête HTTP GET
c.setopt(c.URL, 'https://www.google.com/sitemap.xml')

# Définir la mémoire tampon pour capturer les données de sortie
c.setopt(c.WRITEDATA, buffer)

# Définir le chemin d'accès au fichier bundle de l'autorité de certification pour la vérification SSL/TLS
c.setopt(c.CAINFO, certifi.where())

# Effectuer la requête HTTP
c.perform()

# Fermer l'objet cURL pour libérer des ressources
c.close()

# Récupérer le contenu de la réponse dans la mémoire tampon
body = buffer.getvalue()

# Analyser le contenu XML dans un objet ElementTree
root = ET.fromstring(body.decode('utf-8'))

# Imprimer la balise et les attributs de l'élément racine de l'arbre XML
print(root.tag, root.attrib)

Gestion des erreurs HTTP

Une gestion robuste des erreurs est essentielle pour que les requêtes HTTP soient fiables. Voici un exemple de gestion des erreurs avec PycURL :

import pycurl  # Importer la bibliothèque pycurl
import certifi  # Importer la bibliothèque certifi
from io import BytesIO  # Importer BytesIO pour gérer les flux d'octets

# Initialiser un objet Curl
c = pycurl.Curl()

buffer = BytesIO()
# Définir l'URL pour la requête HTTP
c.setopt(c.URL, 'http://example.com')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())

try:
    # Effectuer la requête HTTP
    c.perform()
except pycurl.error as e:
    # Si une erreur survient pendant la requête, l'exception pycurl.error est prise en compte.
    errno, errstr = e.args  # Récupérer le numéro et le message d'erreur
    print(f'Error: {errstr} (errno {errno})')  # Imprimer le message d'erreur et le numéro d'erreur
finally:
    # Fermer l'objet Curl pour libérer des ressources
    c.close()
    body = buffer.getvalue()
    print(body.decode('iso-8859-1'))  # Décoder et imprimer le corps de la réponse

3.png

Le code corrigé ajuste l'URL à https://example.com, ce qui résout le problème de protocole. Il répète le processus de configuration de la requête, de son exécution et de la gestion des erreurs comme dans l'extrait initial. Une fois l'exécution réussie, le corps de la réponse est à nouveau décodé et imprimé. Ces extraits soulignent l'importance d'une configuration correcte de l'URL et d'une gestion robuste des erreurs dans les requêtes HTTP avec pycurl.

import pycurl  # Importer la bibliothèque pycurl
import certifi  # Importer la bibliothèque certifi
from io import BytesIO  # Importer BytesIO pour gérer les flux d'octets

# Réinitialiser l'objet Curl
c = pycurl.Curl()

buffer = BytesIO()
# Corriger l'URL pour utiliser HTTPS
c.setopt(c.URL, 'https://example.com')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())

try:
    # Effectuer la requête HTTP corrigée
    c.perform()
except pycurl.error as e:
    # Si une erreur survient pendant la requête, l'exception pycurl.error est prise en compte.
    errno, errstr = e.args  # Récupérer le numéro et le message d'erreur
    print(f'Error: {errstr} (errno {errno})')  # Imprimer le message d'erreur et le numéro d'erreur
finally:
    # Fermer l'objet Curl pour libérer des ressources
    c.close()
    body = buffer.getvalue()
    print(body.decode('iso-8859-1'))  # Décoder et imprimer le corps de la réponse

Fonctionnalités avancées de cURL

cURL propose de nombreuses options avancées pour contrôler le comportement des requêtes HTTP, telles que la gestion des cookies et des délais d'attente. Vous trouverez ci-dessous un exemple démontrant les options avancées avec PycURL.

import pycurl  # Importer la bibliothèque pycurl
import certifi  # Importer la bibliothèque certifi pour la vérification des certificats SSL
from io import BytesIO  # Importer BytesIO pour gérer les flux d'octets

# Créer une mémoire tampon pour contenir les données de la réponse
buffer = BytesIO()

# Initialiser un objet Curl
c = pycurl.Curl()

# Définir l'URL pour la requête HTTP
c.setopt(c.URL, 'http://httpbin.org/cookies')

# Activer les cookies en définissant une paire clé-valeur spécifique
c.setopt(c.COOKIE, 'cookies_key=cookie_value')

# Fixer un délai d'attente de 30 secondes pour la demande
c.setopt(c.TIMEOUT, 30)

# Définir la mémoire tampon pour capturer les données de sortie
c.setopt(c.WRITEDATA, buffer)

# Définir le chemin d'accès au fichier bundle de l'autorité de certification pour la vérification SSL/TLS
c.setopt(c.CAINFO, certifi.where())

# Effectuer la requête HTTP
c.perform()

# Fermer l'objet Curl pour libérer des ressources
c.close()

# Récupérer le contenu de la réponse dans la mémoire tampon
body = buffer.getvalue()

# Décoder le corps de la réponse en utilisant l'encodage UTF-8 et l'imprimer
print(body.decode('utf-8'))

Comparaison de PycURL, Requests, HTTPX et AIOHTTP

Lorsque l'on travaille avec des requêtes HTTP en Python, quatre bibliothèques populaires sont PycURL, Requests, HTTPX, et AIOHTTP. Chacune a ses forces et ses faiblesses. Voici une comparaison qui vous aidera à choisir l'outil le mieux adapté à vos besoins :

Fonctionnalité PycURL Requests HTTPX AIOHTTP
Facilité d'utilisation Modéré Très facile Facile Modéré
Performance Haut Modéré Haut Haut
Support asynchrone Non Non Oui Oui
Streaming Oui Limitée Oui Oui
Soutien au protocole Large (prise en charge de nombreux protocoles) HTTP/HTTPS HTTP/HTTPS, HTTP/2, WebSockets HTTP/HTTPS, WebSockets

L'analyse comparative indique que PycURL offre des performances et une flexibilité élevées, ce qui le rend adapté aux utilisateurs avancés qui ont besoin d'une gestion détaillée des requêtes HTTP. En revanche, Requests et HTTPX sont mieux adaptés à des scénarios plus simples et plus intuitifs. AIOHTTP se distingue dans la gestion des tâches asynchrones, en fournissant des outils efficaces pour la gestion des requêtes asynchrones.

Le choix de la bonne bibliothèque dépend des besoins et des exigences spécifiques de votre projet, PycURL étant une excellente option pour ceux qui ont besoin de rapidité et de capacités avancées.

Commentaires:

0 Commentaires