Retour au blog
Guides
Mihnea-Octavian Manolache30 novembre 202211 min de lecture

Comment utiliser CURL avec Python pour le web scraping

Comment utiliser CURL avec Python pour le web scraping

Comment utiliser cURL avec Python ?

En bref, cURL est principalement un outil en ligne de commande utilisé pour récupérer des données depuis un serveur. Je sais que lorsque l'on évoque la ligne de commande, cela peut sembler compliqué. Cependant, je peux vous assurer que dans la pratique, comme vous le découvrirez tout au long de cet article, cURL est peut-être l'un des outils les plus simples que vous utiliserez en tant que programmeur.

Pour utiliser cURL depuis la ligne de commande, il suffit d'ouvrir une nouvelle fenêtre de terminal et de taper `curl` suivi de l'URL que vous souhaitez scraper. Par exemple :

~ » curl 'https://api.ipify.org?format=json'

Cette simple commande accède à l’API d’ipify, demandant des informations au serveur, exactement comme le ferait un navigateur traditionnel. Le résultat de cet exemple sera un objet JSON contenant votre adresse IP. Même si cela ne semble pas être le cas, vous venez de mettre en place l’infrastructure d’un futur scraper web. Le tout en une seule ligne de code.

cURL est en réalité un outil plus avancé. Si vous souhaitez en savoir plus sur l'utilisation de curl, vous pouvez consulter la documentation officielle. Vous pouvez également utiliser l'option `--help` pour découvrir les différentes options disponibles. 

Comment utiliser cURL pour récupérer des fichiers HTML

Dans l’exemple ci-dessus, la réponse que nous avons reçue du serveur ipify était un fichier JSON. En effet, ce point de terminaison API particulier renvoie des données au format JSON. En matière de web scraping, vous rencontrerez généralement des sites web traditionnels qui servent des fichiers HTML, que vous devrez ensuite analyser et dont vous devrez extraire les données.

Cependant, pour l'instant, notre objectif n'est pas la manipulation des données, mais plutôt leur extraction. Et nous savons que nous pouvons utiliser cURL pour scraper des sites web, mais comment s'y prendre concrètement ? Eh bien, si vous n'avez pas encore été curieux et que vous n'avez pas encore essayé, demandez simplement à cURL d'accéder à n'importe quelle URL générique dont vous savez qu'elle correspond à un site web traditionnel basé sur HTML. Prenons l'exemple de httpbin.org :

curl 'https://httpbin.org/forms/post'

Tapez cette commande dans votre terminal et vous recevrez le code HTML brut en réponse :

<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
  <!-- Example form from HTML5 spec http://www.w3.org/TR/html5/forms.html#writing-a-form's-user-interface -->
  <form method="post" action="/post">
   <p><label>Customer name: <input name="custname"></label></p>
   <p><label>Telephone: <input type=tel name="custtel"></label></p>
   <p><label>E-mail address: <input type=email name="custemail"></label></p>
   <fieldset>
    <legend> Pizza Size </legend>
    <p><label> <input type=radio name=size value="small"> Small </label></p>
    <p><label> <input type=radio name=size value="medium"> Medium </label></p>
    <p><label> <input type=radio name=size value="large"> Large </label></p>
   </fieldset>
   <fieldset>
    <legend> Pizza Toppings </legend>
    <p><label> <input type=checkbox name="topping" value="bacon"> Bacon </label></p>
    <p><label> <input type=checkbox name="topping" value="cheese"> Extra Cheese </label></p>
    <p><label> <input type=checkbox name="topping" value="onion"> Onion </label></p>
    <p><label> <input type=checkbox name="topping" value="mushroom"> Mushroom </label></p>
   </fieldset>
   <p><label>Preferred delivery time: <input type=time min="11:00" max="21:00" step="900" name="delivery"></label></p>
   <p><label>Delivery instructions: <textarea name="comments"></textarea></label></p>
   <p><button>Submit order</button></p>
  </form>
  </body>
</html>

Comment utiliser cURL en Python 

Comme vous l'avez vu, l'extraction de données avec cURL est une solution simple qui ne nécessite aucun codage. Il s'agit simplement d'envoyer une commande et de recevoir des informations. Si vous souhaitez mettre en place un véritable projet de scraping web, vous devrez utiliser d'une manière ou d'une autre les données que vous avez collectées. Et comme nous sommes des programmeurs, nous voulons manipuler ces données par programmation. C'est là que Python entre en jeu.

Pourquoi choisir Python pour un projet de web scraping

Il ne fait aucun doute que Python est l’un des langages de programmation les plus populaires. Non seulement il est très puissant, mais sa syntaxe simple le rend parfait pour les programmeurs débutants. Il dispose également d’une formidable communauté toujours prête à intervenir et à aider. Ainsi, si à un moment donné vous rencontrez un problème et que vous êtes bloqué, n’hésitez pas à poser une question sur Stackoverflow par exemple, et quelqu’un vous aidera sûrement. 

En ce qui concerne le web scraping en particulier, Python est un excellent choix grâce à tous les paquets dont il dispose. Comme vous le verrez plus loin dans cet article, la manipulation des données nécessite l'analyse des fichiers HTML, afin que vous puissiez ensuite « extraire » les éléments et ne récupérer que les informations que vous visez sur cette page web particulière.

Web scraping avec cURL et Python

Jusqu’à présent, nous avons découvert comment utiliser cURL dans le terminal, mais comment l’intégrer concrètement à Python ? Eh bien, il existe en réalité plusieurs façons de s’y prendre. Par exemple, vous pourriez utiliser le module `os` de Python et envoyer des commandes au terminal :

import os 
curl = os.system(f'curl "https://httpbin.org/forms/post"') 
print(curl)

Ou vous pouvez même créer votre propre fonction autour de cela et l'utiliser tout au long du projet :

import os  
def curl(website):     
    return os.system(f'curl "{website}"')
  
print(curl('https://httpbin.org/forms/post'))

Cependant, comme je l’ai dit, l’une des plus grandes forces de Python réside dans la diversité de ses paquets. Comme cURL est beaucoup plus varié, notre fonction devrait être bien plus complexe pour prendre en charge toutes ses fonctionnalités. Donc, plutôt que de réinventer la roue, je recommande d’utiliser un paquet existant pour l’intégration de cURL dans Python : PycURL.

Qu&#x27;est-ce que PycURL et comment l&#x27;installer

Selon son site web, PycURL est une interface vers la bibliothèque cURL, héritant ainsi de toutes les capacités de libcURL. En bref, PycURL est le moyen par lequel nous utiliserons cURL en Python. Pour l'installer, comme pour tout autre paquet Python, nous utiliserons pip. Si vous ne connaissez pas pip, il s'agit d'un système de gestion de paquets pour Python que les développeurs Python utilisent tout le temps pour installer rapidement des dépendances.

Cela étant dit, pour installer PycURL, il suffit d'ajouter la commande suivante dans votre terminal :

~ » pip install pycurl 

Analyse du HTML à l&#x27;aide de BeautifulSoup

Puisque nous parlons de dépendances et de pip, il convient également de mentionner que la communauté Python a proposé plusieurs solutions pour l'analyse HTML. L'un des paquets d'analyse HTML les plus populaires est BeautifulSoup. Chez WebScrapingAPI, nous avons d'ailleurs consacré un article de blog entier à la manière d'extraire et d'analyser des données web avec Python et BeautifulSoup

Tout comme pour PycURL, l'installation de BeautifulSoup ne nécessite qu'une seule commande :

~ » pip install beautifulsoup4

Comment créer un scraper web avec Python et cURL

Maintenant que nous avons abordé la partie théorique et que nous savons comment utiliser cURL à la fois en ligne de commande et en Python, passons directement au codage. Dans cette section, nous allons apprendre à utiliser cURL en Python en créant un véritable scraper web. Alors, sans plus attendre, que le codage commence !

1. Configuration du répertoire

En tant qu'ingénieur logiciel, il est important de structurer nos projets de manière à ce qu'ils soient faciles à maintenir et à lire, tant pour nous-mêmes que pour les autres développeurs. Pour que tout reste bien organisé, commençons par créer un nouveau répertoire qui contiendra tous les fichiers de notre projet. Ouvrez une nouvelle fenêtre de terminal, accédez au bureau avec `cd` et créez un nouveau dossier nommé `py_scraper` :

~ » cd desktop && mkdir py_scraper && cd py_scraper

Permettez-moi d'expliquer brièvement les commandes que nous avons utilisées jusqu'à présent :

  • `cd` - changer de répertoire
  • `&&` - exécute la commande suivante uniquement si la précédente a réussi
  • `mkdir` - créer un nouveau répertoire

Ouvrez votre projet dans votre IDE préféré et créez un nouveau fichier nommé « scraper.py » dans le répertoire `py_scraper`. Astuce : vous pouvez également le faire depuis la ligne de commande en utilisant cette commande :

~/desktop/py_scraper » touch scraper.py && code .

Si vous utilisez VSCode (comme moi), une fenêtre qui devrait ressembler à ceci s'affiche alors :

Dark code editor window open to a blank Python file named scraper.py

2. Installation des paquets

Votre terminal devrait maintenant se trouver dans le répertoire `py_scraper`.  La dernière chose à faire avant de coder le scraper proprement dit est d’installer les paquets que nous avons présentés précédemment, ainsi qu’un autre. Cependant, nous voulons les confiner uniquement au répertoire `py_scraper` (et ne pas les installer globalement). Pour ce faire, nous devrons utiliser les environnements virtuels de Python. Ceux-ci nous permettent d’isoler l’interpréteur Python, les bibliothèques et les scripts installés.

Pour configurer un nouvel environnement virtuel dans le répertoire `py_scraper`, utilisez la commande suivante :

~/desktop/py_scraper » python3 -m venv env

Cela créera un nouveau dossier `env` que nous devons activer avant d'installer les paquets souhaités. Activez-le à l'aide de cette commande :

~/desktop/py_scraper » source env/bin/activate

Maintenant que vous avez créé et activé votre environnement virtuel, il ne vous reste plus qu'à installer les paquets requis à l'aide des commandes pip que nous avons présentées précédemment.

~/desktop/py_scraper » pip install pycurl beautifulsoup4 certify

3. Création du scraper Web Python et cURL

Vous êtes désormais prêt à utiliser PycURL et BeautifulSoup. Pour utiliser ces paquets, nous devons d'abord les importer dans notre fichier `scraper.py`. Ajoutez simplement cet extrait de code en haut du fichier :

import pycurl
import certify
from io import BytesIO
from bs4 import BeautifulSoup

# All our logic will go underneath this line

Maintenant que vous avez importé les paquets, occupons-nous de la logique de notre scraper Web. D'après ce que nous avons vu jusqu'à présent, nous savons que nous devons aborder deux aspects : l'extraction des données et le traitement des données. La première partie est gérée par PycURL et la seconde par BeautifulSoup. Pour une meilleure structure, je suggère de traiter chaque partie séparément.

3.1. Récupération de données avec cURL et Python

Quand je parle de scraping, je fais référence à la partie extraction du scraper web. En gardant cela à l'esprit et en sachant comment utiliser curl en Python via l'interface PycURL, écrivons le code :

# Setting global variables
TARGET_URL = 'https://httpbin.org/forms/post'

# Using cURL and Python to gather data from a server via PycURL
buffer = BytesIO()
curl = pycurl.Curl()
curl.setopt(curl.URL, TARGET_URL)
curl.setopt(curl.WRITEDATA, buffer)
curl.setopt(curl.CAINFO, certifi.where())
curl.perform()
curl.close()

# Using BytesIO to retrieve the scraped data
body = buffer.getvalue()

# Saving the output and printing it in terminal
data = body.decode('iso-8859-1')
print(data)

Dans le code ci-dessus, nous commençons par déclarer la variable globale `TARGET_URL` qui contient l'URL du site web dont nous voulons extraire les données. Ensuite, nous créons un tampon à l'aide de `BufferIO`, nous initialisons PycURL et définissons deux options : l'une pour le transfert de données, l'autre pour le nom du fichier contenant les certificats. Enfin, nous exécutons l'action curl et fermons la session par la suite. 

Et voilà, vous avez réussi à utiliser Python pour effectuer une requête cURL et afficher le fichier HTML dans votre console. Il ne nous reste plus qu’à nous occuper de la deuxième partie, à savoir le traitement des données.

3.2. Analyse du code HTML avec Python et BeautifulSoup

Disposer des données brutes est superflu en web scraping, à moins d’effectuer une action quelconque sur celles-ci. L’objectif le plus fondamental de tout web scraper est d’extraire des données du code HTML. Pour notre exemple, supposons que nous souhaitions extraire tout le texte contenu dans les éléments `<p>` de la variable `data` (qui contient actuellement tout le code HTML extrait). Voici comment procéder à l’aide de BeautifulSoup :

# Parsing data using BeautifoulSoup
soup = BeautifulSoup(data, 'html.parser')
# Finding elements using BeautifoulSoup
paragraphs = soup.find_all("p")
for p in paragraphs:
   print(p.text)

Comme vous pouvez le voir, avec BeautifulSoup, il suffit de 4 lignes de code pour obtenir le résultat souhaité. L'exécution du script complet devrait maintenant afficher le texte contenu dans chaque paragraphe du fichier HTML que nous avons récupéré sur le site web ciblé. 

Donc, en supposant que vous ayez suivi les instructions et que votre fichier `scraper.py` contienne tout le code que nous avons écrit dans cette section, retournons au terminal et exécutons le script :

~/desktop/py_scraper » python3 scraper.py
Customer name: 
Telephone: 
E-mail address: 
  Small 
  Medium 
  Large 
  Bacon 
  Extra Cheese 
  Onion 
  Mushroom 
Preferred delivery time: 
Delivery instructions: 
Submit order

Conclusion

Créer un scraper web avec Python et cURL est un projet très utile et peut constituer le point de départ d’une application de scraping web plus ambitieuse. L’approche recommandée pour intégrer ces deux technologies consiste à utiliser PycURL. Vous pouvez également écrire votre propre interface ou fonction pour interagir avec cURL en Python. Cela demande simplement un peu plus de temps et d’efforts :).

J'espère que cet article vous aura été utile pour apprendre cURL, l'utiliser avec Python et créer un scraper web basique. De plus, je vous invite à modifier le code et à vous l'approprier, afin d'ajouter un nouveau projet à votre portfolio.

À propos de l'auteur
Mihnea-Octavian Manolache, Développeur Full Stack @ WebScrapingAPI
Mihnea-Octavian ManolacheDéveloppeur Full Stack

Mihnea-Octavian Manolache est ingénieur Full Stack et DevOps chez WebScrapingAPI ; il développe des fonctionnalités pour les produits et assure la maintenance de l'infrastructure qui garantit le bon fonctionnement de 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.