Comment utiliser Python cURL ?



L’utilitaire en ligne de commande Curl est largement utilisé comme client HTTP. Il est prisé pour lancer des requêtes HTTP directement depuis l’interface de commande. Il se révèle pratique pour élaborer des scripts dédiés au web scraping, pour évaluer l’état de santé d’un site web, ou encore pour télécharger des fichiers en utilisant simplement la ligne de commande.

Sa facilité d’intégration dans de nombreux langages de programmation en fait un outil incontournable. Cet article se propose d’explorer plus en détail ce qu’est cURL et comment on peut l’exploiter dans l’environnement Python.

Qu’est-ce que cURL ?

Selon la définition de son site web officiel, cURL signifie « client URL ». Il s’agit d’un outil de ligne de commande, mais aussi d’une bibliothèque logicielle. Tous deux sont utilisés pour le transfert de données via divers protocoles réseau, notamment ceux de la couche application comme HTTP, HTTPS, FTP ou IMAP.

Sa popularité est indéniable, avec plus de 10 milliards d’installations sur des dispositifs variés tels que les radios, téléviseurs, routeurs, imprimantes et ordinateurs. cURL est un projet totalement gratuit et open-source, dont le code source est disponible sur GitHub.

Cas d’utilisation de cURL

cURL est un outil versatile et puissant, dont voici quelques exemples d’applications courantes, bien que la liste ne soit pas exhaustive :

  • Tester des API : cURL permet de vérifier la bonne exécution d’une API, en s’assurant qu’elle retourne les données attendues en fonction de la requête envoyée. On peut également évaluer sa vitesse de réponse. Des scripts peuvent être programmés pour tester régulièrement la disponibilité de l’API et générer des alertes en cas de dysfonctionnement.
  • Web Scraping : L’extraction automatique de données depuis des sites web est une autre application de cURL. Utilisable via la ligne de commande ou dans des scripts avec divers langages de programmation, cURL permet de récupérer des données de façon dynamique. Les données HTML obtenues peuvent ensuite être analysées et les informations pertinentes extraites. Pour ceux qui sont intéressés par le web scraping, vous pouvez explorer l’API de scraping web toptips.fr qui simplifie ce processus.
  • Téléchargement de données : Avec cURL, il est possible d’enregistrer la réponse à une requête dans un fichier. Ces réponses peuvent être des données issues d’une API ou des fichiers provenant d’un serveur. En sauvegardant la réponse dans un fichier, on effectue en réalité le téléchargement du fichier. La nature de cURL en tant qu’outil en ligne de commande permet d’automatiser le téléchargement d’un grand nombre de fichiers.

Comment utiliser cURL en Python (PycURL)

Installation de PycURL

Pour utiliser cURL dans Python, on se sert de la bibliothèque PycURL. Cette dernière sert d’interface Python à la bibliothèque cURL, en créant une couche d’abstraction fine au-dessus de son code existant. Cela confère à PycURL une rapidité d’exécution supérieure à d’autres bibliothèques comme urllib ou requests. Avant toute chose, il est impératif d’installer PycURL. Des instructions détaillées sont disponibles en ligne, mais l’installation via pip reste la méthode la plus simple.

pip install PycURL

Sous Ubuntu 22.04, il est parfois nécessaire d’installer des outils supplémentaires avant de procéder à l’installation de PycURL. Cette commande est donc à exécuter au préalable :

sudo apt install libcurl4-openssl-dev libssl-dev

Réaliser une requête GET simple

Pour formuler une requête, il faut débuter par créer un script Python. Utilisez votre éditeur de texte préféré pour créer le fichier. L’exemple qui suit utilise Vim mais le choix de l’éditeur est libre. La commande pour ouvrir un fichier avec Vim se présente comme ceci :

vim pycurl.py

Ici, ‘pycurl.py’ est le nom de fichier utilisé pour cet exemple, mais vous êtes libre de choisir le nom qui vous convient le mieux.

La première étape consiste à importer la classe cURL du module PycURL :

from pycurl import Curl

Après l’import de PycURL, il faut importer BytesIO depuis le module io. Cela est nécessaire pour créer un tampon mémoire où la réponse de PycURL sera écrite.

from io import BytesIO

Puis, il faut instancier une nouvelle instance de la classe Curl :

c = Curl()

Ensuite, il faut instancier BytesIO pour créer un nouveau tampon. PycURL ne dispose pas d’un mécanisme interne pour stocker les réponses, il faut donc créer un tampon et y indiquer où écrire les données.

buffer = BytesIO()

Une fois le tampon créé, on peut définir les options de l’objet client. Dans notre cas, il faut renseigner deux options : la première est l’URL cible de la requête, et la seconde est l’endroit où le corps de la réponse sera écrit. Voici le code nécessaire :

c.setopt(c.URL, 'http://pycurl.io/')
c.setopt(c.WRITEDATA, buffer)

Une fois ces options définies, la requête peut être exécutée en appelant la méthode `perform` de l’objet client. Ensuite, la connexion est fermée en appelant la méthode `close`.

c.perform()
c.close()

Pour récupérer la réponse, on appelle la méthode `getvalue()` de l’objet tampon, puis on décode le résultat. On peut ensuite l’afficher dans la console.

body = buffer.getvalue()
print(body.decode('iso-8859-1'))

Votre script devrait ressembler à ceci :

from pycurl import Curl
from io import BytesIO

# Création d'une instance pycUrl
c = Curl()
buffer = BytesIO()

c.setopt(c.URL, 'http://pycurl.io/')
c.setopt(c.WRITEDATA, buffer)

# Exécution de la requête
c.perform()

# Fermeture de la connexion
c.close()

body = buffer.getvalue()
print(body.decode('iso-8859-1'))

Après avoir exécuté ce script, vous devriez obtenir un résultat similaire à l’exemple qui suit :

Réaliser une requête POST

Pour effectuer une requête POST, vous devrez configurer les options POSTFIELDS de l’objet client cURL. Voici un exemple de requête POST envoyée à l’API JSON Placeholder :

from io import BytesIO
from json import dumps
from pycurl import Curl

# Création d'une instance pycUrl
c = Curl()
buffer = BytesIO()

# Création d'un dictionnaire de données
data = {
    'userId': 1,
    'title': 'Lorem Ipsum',
    'body': 'Dolor sit amet'
}

# Encodage des données en JSON
encoded_data = dumps(data)

# Définition des options de requête
c.setopt(c.URL, 'https://jsonplaceholder.typicode.com/posts')
c.setopt(c.HTTPHEADER, ['Accept: application/json', 'Content-Type: application/json'])
c.setopt(c.POSTFIELDS, encoded_data)
c.setopt(c.WRITEDATA, buffer)

# Exécution de la requête
c.perform()

# Fermeture de la connexion
c.close()

body = buffer.getvalue()
print(body.decode('iso-8859-1'))

Dans ce code, un objet dictionnaire est créé, contenant les données à envoyer avec la requête. Ces données sont ensuite encodées au format JSON et envoyées comme charge utile de la requête via l’option POSTFIELDS. Des en-têtes sont aussi définis pour préciser le type de contenu de la requête et le type de données attendu en réponse. L’exécution de ce code devrait produire un résultat semblable à l’exemple suivant :

Écrire les réponses dans des fichiers

Il est également possible de rediriger la sortie de la réponse vers un fichier en utilisant un tampon de fichier dans l’option cURL WRITEDATA. Ceci écrira les données de la réponse directement dans le fichier. L’exemple ci-dessous illustre ce concept :

from pycurl import Curl

file_name="output.json"

# Ouverture du fichier en mode écriture binaire
with open(file_name, 'wb') as f:
    
    # Création d'une instance Curl
    c = Curl()

    # Définition des options de requête
    c.setopt(c.URL, 'https://jsonplaceholder.typicode.com/users/1')
    c.setopt(c.HTTPHEADER, ['Accept: application/json'])
    c.setopt(c.WRITEDATA, f)

    # Exécution de la requête
    c.perform()

    # Fermeture de la connexion
    c.close()

    print(f'Les données ont été écrites dans le fichier {file_name}')

Alternatives à PycURL

PycURL n’est qu’une fine couche d’abstraction au-dessus de la bibliothèque cURL, ce qui offre un contrôle très fin sur les fonctionnalités de bas niveau, et permet une personnalisation très poussée.

Cependant, cela le rend potentiellement plus complexe à utiliser, le réservant plus aux développeurs expérimentés. Une alternative plus simple à PycURL est souvent recherchée. Voici donc quelques alternatives à explorer :

#1. Autres bibliothèques

Outre PycURL, Python met à disposition d’autres bibliothèques pour réaliser des requêtes web, notamment `requests` et `urllib`. Ces deux options sont très populaires et plus faciles à utiliser que PycURL.

#2. Autres langages

cURL possède des interfaces implémentées dans différents langages de programmation. Le site Curl Converter est très pratique pour convertir une requête cURL en code équivalent dans un autre langage. En saisissant la commande cURL de la requête désirée, l’outil génère automatiquement le code correspondant dans le langage choisi. Vous pouvez également exécuter la commande cURL directement dans le terminal, ou l’intégrer dans un script Bash.

Conclusion

Cet article a présenté cURL et expliqué comment l’exploiter dans Python en utilisant le module PycURL. Des alternatives à PycURL, comme le module requests ou l’utilisation de cURL dans d’autres langages, ont été également abordées.

Pour aller plus loin, vous pouvez consulter des exemples concrets d’utilisation de la commande cURL.