fr
English
Español
中國人
Tiếng Việt
Deutsch
Українська
Português
भारतीय
Türkçe
한국인
Italiano
Indonesia
Polski 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.
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"
Pour utiliser cURL, installez la bibliothèque Python PycURL.
L'installation:
pip install pycurl
L'utilisation de curl en Python permet un contrôle détaillé des requêtes HTTP. 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'))
L'envoi de données avec POST - curl pour les requêtes Python - est courant. Avec la bibliothèque, 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'))
Des en-têtes personnalisés ou une authentification sont souvent nécessaires pour les requêtes HTTP. Gestion des en-têtes personnalisés: Les requêtes HTTP nécessitent souvent des jetons d'authentification ou des en-têtes personnalisés. La gestion des en-têtes personnalisés peut être effectuée efficacement lorsque vous savez comment utiliser les techniques d'analyse Python curl json:
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 Lorsque l'on travaille avec l'analyse XML et que l'on traite avec diverses API, il est essentiel de traiter les réponses XML. Vous trouverez ci-dessous un exemple de gestion 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)
La gestion des erreurs pour les requêtes HTTP est un aspect important du travail avec des intégrations externes. 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
Le code corrigé ajuste l'URL à https://example.com, ce qui résout le problème de protocole. Ensuite, l'auteur répète les mêmes étapes de configuration de la requête, d'exécution et de traitement des erreurs que dans le premier extrait. Une fois l'exécution réussie, le corps de la réponse est à nouveau décodé et imprimé. Cela souligne l'importance de construire correctement les URL, de maintenir un flux de requêtes adéquat et, surtout, de mettre en œuvre une gestion robuste des erreurs lors des 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
Lorsque l'on travaille avec des conversions Python de demandes cURL, il est utile de savoir que cURL offre de nombreuses options avancées pour contrôler le comportement HTTP, comme la gestion des cookies et des délais d'attente. Vous trouverez ci-dessous un exemple démontrant les options avancées permettant d'exécuter des commandes curl en Python.
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'))
Quatre bibliothèques sont populaires lorsque l'on travaille en Python avec des requêtes HTTP: 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 |
Les utilisateurs avancés apprécieront les contrôles personnalisés offerts par les commandes HTTP; ils trouveront que PycURL dépasse leurs attentes en termes de performances. 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 gérer les requêtes asynchrones, notamment lorsqu’elles sont combinées avec des proxys fiables fournis par des services spécialisés comme Proxy-Seller.
Comme vous pouvez le constater, votre choix peut varier en fonction de l'ampleur du projet - flexibilité contre rapidité. Dans les contextes avancés, PycURL s'impose comme le choix préféré, voire unique.
Si la performance et le contrôle de bas niveau sont vos priorités lorsque vous effectuez des requêtes HTTP, PycURL est une option solide. Apprendre à utiliser cURL en Python n'est peut-être pas le chemin le plus facile pour les débutants, mais il permet d'accéder à des fonctionnalités puissantes que les bibliothèques plus abstraites cachent souvent. PycURL gère tout avec précision, du web scraping à la gestion XML en passant par la gestion d'en-têtes et de cookies personnalisés. Cependant, pour des tâches plus simples, des flux de travail asynchrones ou une facilité d'utilisation, des bibliothèques comme Requests, HTTPX et AIOHTTP peuvent être plus appropriées.
Commentaires: 0