Retour au blog
Guides
Andrei Ogiolan12 décembre 202212 minutes de lecture

Découvrez comment utiliser cURL en Python

Découvrez comment utiliser cURL en Python

Qu'est-ce que cURL ?

Afin d'aborder le sujet de cet article, à savoir l'apprentissage de l'utilisation de cURL en Python, nous devons d'abord présenter cURL. Client URL (cURL) est, en bref, une interface en ligne de commande facile à utiliser, conçue pour permettre aux développeurs de récupérer des données depuis un serveur.

Comment utiliser cURL ?

Comme je l'ai déjà mentionné plus haut, l'utilisation de cURL est assez simple et permet d'extraire des informations à l'aide d'une seule ligne de commande. Vous devez d'abord ouvrir un terminal et taper « curl » suivi d'un lien vers un site web, par exemple :

$ curl 'https://www.webscrapingapi.com/'

Félicitations, vous venez d'effectuer votre première requête avec cURL. Cette commande simple demande des informations au serveur, tout comme le ferait un navigateur classique, et renvoie le code HTML de la page. Tous les sites web ne renvoient pas nécessairement du code HTML ; certains points de terminaison renvoient les données sous forme d'objet JSON. Prenons cet exemple :

$ curl 'https://jsonplaceholder.typicode.com/todos/1'

Tapez cette commande dans votre terminal et vous devriez obtenir cette réponse :

{
  "userId": 1,
  "id": 1,
  "title": "delectus aut autem",
  "completed": false
}

La plupart des API vous renverront soit du code HTML, soit du JSON lorsque vous leur envoyez des commandes cURL. Mais ce n’est pas tout ce que cURL peut faire pour nous. En réalité, c’est un outil très sophistiqué. Si vous souhaitez en savoir plus sur cURL, je vous recommande vivement de consulter la documentation de cURL pour mieux comprendre ses paramètres. Vous pouvez également exécuter la commande suivante :

$ curl --help

Cela vous montrera certaines options que vous pouvez définir pour cURL :

Usage: curl [options...] <url>
 -d, --data <data>   HTTP POST data
 -f, --fail          Fail silently (no output at all) on HTTP errors
 -h, --help <category>  Get help for commands
 -i, --include       Include protocol response headers in the output
 -o, --output <file>  Write to file instead of stdout
 -O, --remote-name   Write output to a file named as the remote file
 -s, --silent        Silent mode
 -T, --upload-file <file>  Transfer local FILE to destination
 -u, --user <user:password>  Server user and password
 -A, --user-agent <name>  Send User-Agent <name> to server
 -v, --verbose       Make the operation more talkative
 -V, --version       Show version number and quit

This is not the full help, this menu is stripped into categories.
Use "--help category" to get an overview of all categories.
For all options use the manual or "--help all".

Comme vous pouvez le constater, ce ne sont même pas toutes les options disponibles pour cURL ; il s'agit d'un menu divisé en catégories. Vous avez sans doute deviné que pour obtenir toutes les options que vous souhaitez exécuter :

$ curl --help all

Comment utiliser cURL en Python ?

Pour cette étape, il y a deux conditions préalables. La première est assez évidente : vous devez installer Python sur votre machine. Vous pouvez le faire en vous rendant sur le site officiel de Python et en installant la version adaptée à votre système d'exploitation. Assurez-vous qu'il s'agit d'une version récente, car les anciennes versions ne comprennent probablement pas pip, qui est requis pour la plupart des paquets que nous souhaitons utiliser. Exécutez ensuite la commande suivante :

 $ pip --version

Une fois l'installation réussie, cela devrait vous indiquer la version de pip que vous avez installée. 

Sinon, vous obtiendrez probablement ce message :

"pip" is not considered to be an external or internal command. A batch file is a program to operate.

Il est très important que pip soit installé pour pouvoir continuer, car vous en aurez besoin pour installer les paquets.

La deuxième condition préalable est que vous deviez être familiarisé avec la syntaxe de Python ou avoir au moins un niveau débutant dans un autre langage de programmation.

Pourquoi utiliser cURL en Python ?

Vous vous demandez sans doute : ne suffit-il pas d'utiliser cURL depuis la ligne de commande ? Nous exécutons une seule ligne de commande et l'API nous renvoie les informations. C'est vrai, mais dans la pratique, nous voudrons traiter d'une manière ou d'une autre les données que nous recevons du serveur, et c'est pourquoi nous avons besoin d'un langage de programmation. C'est là que Python entre en jeu.

Pourquoi utiliser Python ?

Python est un langage de programmation de haut niveau utilisé à de nombreuses fins. Sa syntaxe simple et sa facilité d’utilisation le rendent très accessible aux débutants. De plus, il dispose d’une immense communauté prête à vous aider ; si vous rencontrez des difficultés, n’hésitez donc pas à poser une question. StackOverflow est un excellent endroit où vous pouvez vous lancer et poser une question : quelqu’un vous répondra à coup sûr.

Comment intégrer cURL dans Python

Tout comme précédemment, l'utilisation de cURL en Python est très simple. Rappelez-vous lorsque nous avons écrit une ligne de commande pour récupérer les données du serveur. La différence est que vous devez désormais écrire deux lignes de code pour cet appel simple, par exemple :

import os
os.system(f'curl "https://www.webscrapingapi.com/product/"')

Voyons maintenant le véritable avantage de l'utilisation d'un langage de programmation. Nous pouvons créer une fonction capable de prendre une URL personnalisée et d'exécuter la commande cURL dessus :

import os

def cURL(url):
   return os.system(f'curl "{url}"')

cURL('https://www.webscrapingapi.com/blog/')

Vous pouvez remplacer https://www.webscrapingapi.com/blog/ par n'importe quel autre site web dont vous souhaitez récupérer les données. Félicitations, vous venez de créer un script qui prend une URL, exécute la commande cURL et affiche le résultat dans la console. Vous pouvez exécuter Python directement dans votre terminal, mais pour une meilleure expérience de programmation, je vous recommande vivement d'utiliser un environnement de développement intégré. Il existe de nombreux choix possibles, mais pour Python, je recommande PyCharm, que vous pouvez télécharger ici

Comme je l'ai déjà mentionné plus haut, cURL ne se limite pas à cela. Il peut effectuer une multitude de tâches en plus d'envoyer des requêtes GET. Il peut également télécharger des fichiers ou envoyer des requêtes POST, PUT ou DELETE. Voici un exemple de fonction Python qui envoie une requête POST à https://httpbin.org/post :

import os

def cURL(method,url,data):
   return os.system(f'curl -X "{method}" --url "{url}" --data {data} ')

data = '{"foo":"bar"}'

cURL('POST', 'https://httpbin.org/post', data)

Comme vous l'avez sans doute remarqué, la commande est légèrement différente lorsqu'on envoie une requête POST. Dans la requête précédente, vous n'aviez pas besoin d'utiliser les paramètres -X et –data, car la méthode par défaut de cURL est GET. Après avoir exécuté cette commande, vous devriez recevoir de l'API httpbin une réponse contenant votre requête, votre adresse IP, les paramètres et le corps que vous avez soumis, qui ressemblerait à quelque chose comme ça.

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "{foo:bar}": ""
  }, 
  "headers": {
    "Accept": "*/*", 
    "Content-Length": "9", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/X.XX.X", 
    "X-Amzn-Trace-Id": "Root=X-XXXXX-XXXXXX"
  }, 
  "json": null, 
  "origin": "0.0.0.0", 
  "url": "https://httpbin.org/post"
}

À ce stade, vous avez déjà créé un outil simple capable d'envoyer des requêtes GET, POST, PUT, PATCH, DELETE, etc. pour récupérer des données depuis une API. Nous pouvons désormais définir l'URL, la méthode et le corps directement depuis notre script Python au lieu de les saisir manuellement. Cependant, il s'agit là d'un avantage mineur lié à l'utilisation de cURL en Python. Le principal avantage est que nous pouvons désormais traiter les données comme nous le souhaitons, même si l'API ne nous offre pas la possibilité de les obtenir de la manière que nous souhaitons. Par exemple, supposons que l'on nous fournisse une liste de tous les utilisateurs, mais que nous souhaitions les diviser en deux groupes et récupérer les utilisateurs du deuxième groupe.

Nous pouvons le faire grâce à Python en stockant la réponse dans une variable appelée users, que nous pouvons convertir en un tableau d’objets JSON à l’aide de la méthode json.loads(), sur laquelle vous trouverez plus d’informations ici. Ensuite, nous pouvons parcourir le tableau users et afficher uniquement les utilisateurs de la deuxième moitié de la liste ou ceux dont les numéros d’identification sont supérieurs à la moitié de la liste. Pour mieux comprendre, voici comment cela se traduit en code :

import subprocess
import json

def cURL(url):
   return subprocess.check_output(['curl',url])

users = json.loads(cURL('https://jsonplaceholder.typicode.com/users'))

for user in users:
   if(user['id'] > len(users) / 2): print(user)

Vous avez sans doute remarqué qu’au lieu de os, nous utilisons désormais les bibliothèques subprocess et json. Nous utilisons la bibliothèque subprocess car nous voulons pouvoir enregistrer la sortie de la commande, contrairement au module os qui se contente d’exécuter la commande sans la stocker. Le code est une simple requête GET vers une API qui nous renvoie une liste d’utilisateurs sous la forme d’objets JSON. La sortie devrait être :

{'id': 6, 'name': 'Mrs. Dennis Schulist', 'username': 'Leopoldo_Corkery', 'email': 'Karley_Dach@jasper.info', 'address': {'street': 'Norberto Crossing', 'suite': 'Apt. 950', 'city': 'South Christy', 'zipcode': '23505-1337', 'geo': {'lat': '-71.4197', 'lng': '71.7478'}}, 'phone': '1-477-935-8478 x6430', 'website': 'ola.org', 'company': {'name': 'Considine-Lockman', 'catchPhrase': 'Synchronised bottom-line interface', 'bs': 'e-enable innovative applications'}}

{'id': 7, 'name': 'Kurtis Weissnat', 'username': 'Elwyn.Skiles', 'email': 'Telly.Hoeger@billy.biz', 'address': {'street': 'Rex Trail', 'suite': 'Suite 280', 'city': 'Howemouth', 'zipcode': '58804-1099', 'geo': {'lat': '24.8918', 'lng': '21.8984'}}, 'phone': '210.067.6132', 'website': 'elvis.io', 'company': {'name': 'Johns Group', 'catchPhrase': 'Configurable multimedia task-force', 'bs': 'generate enterprise e-tailers'}}

{'id': 8, 'name': 'Nicholas Runolfsdottir V', 'username': 'Maxime_Nienow', 'email': 'Sherwood@rosamond.me', 'address': {'street': 'Ellsworth Summit', 'suite': 'Suite 729', 'city': 'Aliyaview', 'zipcode': '45169', 'geo': {'lat': '-14.3990', 'lng': '-120.7677'}}, 'phone': '586.493.6943 x140', 'website': 'jacynthe.com', 'company': {'name': 'Abernathy Group', 'catchPhrase': 'Implemented secondary concept', 'bs': 'e-enable extensible e-tailers'}}

{'id': 9, 'name': 'Glenna Reichert', 'username': 'Delphine', 'email': 'Chaim_McDermott@dana.io', 'address': {'street': 'Dayna Park', 'suite': 'Suite 449', 'city': 'Bartholomebury', 'zipcode': '76495-3109', 'geo': {'lat': '24.6463', 'lng': '-168.8889'}}, 'phone': '(775)976-6794 x41206', 'website': 'conrad.com', 'company': {'name': 'Yost and Sons', 'catchPhrase': 'Switchable contextually-based project', 'bs': 'aggregate real-time technologies'}}

{'id': 10, 'name': 'Clementina DuBuque', 'username': 'Moriah.Stanton', 'email': 'Rey.Padberg@karina.biz', 'address': {'street': 'Kattie Turnpike', 'suite': 'Suite 198', 'city': 'Lebsackbury', 'zipcode': '31428-2261', 'geo': {'lat': '-38.2386', 'lng': '57.2232'}}, 'phone': '024-648-3804', 'website': 'ambrose.net', 'company': {'name': 'Hoeger LLC', 'catchPhrase': 'Centralized empowering task-force', 'bs': 'target end-to-end models'}}

Ce n'est là qu'une des utilisations de cURL en Python. Nous ne dépendons plus de l'API pour renvoyer les données comme nous le souhaitons ; nous pouvons les traiter de nombreuses façons différentes, par exemple en affichant si une personne figure dans une liste de réponses en fonction de son nom, de son adresse e-mail, de son numéro de téléphone ou de toute autre propriété unique la concernant. 

Par exemple, supposons que nous souhaitions vérifier si un nom spécifique figure ou non dans une liste. Pour cela, nous pouvons créer une fonction capable de traiter la réponse que nous avons convertie en un tableau JSON prêt à être analysé par Python.

import subprocess
import json

def cURL(url):
   return subprocess.check_output(['curl',url])

users = json.loads(cURL('https://jsonplaceholder.typicode.com/users'))

def check_if_user_exists(users,name):
   for user in users:
       if(user['name'] == name): print(f'An user called {name} exists in the list and has the id of {user["id"]}')

check_if_user_exists(users,'Clementina DuBuque')

Ce bloc de code nous renverra alors le résultat suivant :

An user called Clementina DuBuque exists in the list and has the id of 10

Félicitations. Vous avez créé un script qui récupère des données depuis un serveur, les stocke et les analyse par la suite. Les avantages de l'utilisation de Python ne s'arrêtent pas là : Python dispose même d'une interface spéciale conçue pour utiliser cURL, appelée PycURL, dont nous allons parler maintenant.

Qu&#x27;est-ce que PycURL ?

Comme nous l'avons mentionné précédemment, PycURL est, en bref, un outil Python qui nous aide à utiliser cURL de manière plus naturelle. L'un des grands avantages est que PycURL est fortement optimisé et prend en charge la concurrence, ce qui signifie qu'il est très rapide (plus rapide que la célèbre bibliothèque Python request). En revanche, l'utilisation de PycURL n'est pas aussi simple que ce que nous avons vu précédemment, car il s'agit d'un outil destiné aux développeurs avancés. Cependant, ne vous laissez pas intimider par cela, car au final, vous acquerrez une compréhension plus approfondie des réseaux et vous vous sentirez plus à l'aise avec Python.

Comment l&#x27;installer ?

Comme n'importe quel autre paquet, vous pouvez l'installer avec pip : 

$ pip install pycurl 

Vous devriez également installer certifi cette fois-ci pour des raisons de sécurité lors de l'utilisation de pycurl. Certifi est un outil qui valide les certificats SSL tout en vérifiant l'identité de l'hôte TLS. Pour en savoir plus sur certifi, je vous recommande vivement de consulter leur documentation. Vous pouvez l'installer de la même manière : 

$ pip install certifi

Vous pouvez maintenant vérifier que l'installation a bien réussi en exécutant le script suivant : 

import certifi
print(certifi.where())

La sortie devrait indiquer l'emplacement où le paquet a été installé :

/usr/local/lib/python3.10/site-packages/certifi/cacert.pem

Comment utiliser pycURL ?

La différence par rapport à ce que nous avons fait précédemment est que nous écrivons désormais uniquement du code sans exécuter directement de commandes. En bref, nous créons une instance de la classe pycurl.Curl(), nous récupérons les données et les écrivons dans un tampon que nous décoderons plus tard afin de pouvoir lire les données reçues :

import pycurl
import certifi
from io import BytesIO

buffer = BytesIO()
c = pycurl.Curl()
c.setopt(c.URL, 'https://docs.webscrapingapi.com/')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())
c.perform()
c.close()

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

Vous l'avez deviné, tout comme dans nos exemples précédents, cela récupère le contenu HTML de la page Web de WebScrapingAPI et l'affiche dans la ligne de commande.

Une requête POST n'est pas très différente, sauf que vous devez indiquer à votre instance de la classe pycurl.Curl() que vous allez utiliser une méthode POST, définir votre corps et vos en-têtes, le cas échéant. Voici à quoi cela ressemble :

​​import pycurl
import certifi
import json
from io import BytesIO

buffer = BytesIO()
c = pycurl.Curl()
c.setopt(c.URL, 'https://httpbin.org/post')
c.setopt(pycurl.HTTPHEADER, [ 'Content-Type: application/json' , 'Accept: application/json'])
data = json.dumps({"foo": "bar"})

c.setopt(pycurl.POST, 1)
c.setopt(pycurl.POSTFIELDS, data)
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())

c.perform()
c.close()

body = buffer.getvalue()

print(body.decode('iso-8859-1'))

Et nous devrions obtenir, comme précédemment, une réponse contenant votre requête, votre adresse IP, les paramètres et le corps :

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "{foo:bar}": ""
  }, 
  "headers": {
    "Accept": "*/*", 
    "Content-Length": "9", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/X.XX.X", 
    "X-Amzn-Trace-Id": "Root=X-XXXXX-XXXXXX"
  }, 
  "json": null, 
  "origin": "0.0.0.0", 
  "url": "https://httpbin.org/post"
}

Comme je l'ai déjà mentionné, ce ne sont là que quelques fonctionnalités de base que pycURL peut nous offrir. C'est un outil très complexe et sophistiqué sur lequel on pourrait écrire de nombreux articles. Si vous souhaitez découvrir tout ce qu'il est possible de faire avec, je vous encourage vivement à consulter leur documentation.

Résumé

En conclusion, l'utilisation de cURL en Python est très efficace et permet de gagner beaucoup de temps ; en outre, elle peut servir de point de départ à des projets intéressants dans des domaines tels que l'analyse de données ou le web scraping. L'approche que je recommande consiste d'abord à se familiariser avec cURL et Python, puis à passer à pycURL. J'espère que vous avez trouvé cette ressource utile pour apprendre à utiliser cURL en Python et que vous allez vous amuser avec cet outil et créer quelques scripts.

À propos de l'auteur
Andrei Ogiolan, Développeur Full Stack @ WebScrapingAPI
Andrei OgiolanDéveloppeur Full Stack

Andrei Ogiolan est développeur Full Stack chez WebScrapingAPI ; il participe à l'ensemble du produit et contribue à la mise au point d'outils et de fonctionnalités fiables pour la plateforme.

Commencez à créer

Prêt à faire évoluer votre système de collecte de données ?

Rejoignez plus de 2 000 entreprises qui utilisent WebScrapingAPI pour extraire des données Web à l'échelle de l'entreprise, sans aucun coût d'infrastructure.