Guida all'uso di cURL con Python

Commenti: 0

Il web scraping consiste nell'estrarre dati da siti web per attività come l'analisi dei dati, la ricerca e l'automazione. Sebbene Python offra librerie per l'invio di richieste HTTPS e l'esecuzione di scraping, l'uso di cURL tramite PycURL può essere più efficiente. In questo tutorial dimostreremo come utilizzare Python cURL per effettuare lo scraping di pagine web. Forniremo esempi e confronteremo le sue prestazioni con quelle di altre librerie popolari come Requests, HTTPX e AIOHTTP.

Iniziare con cURL e Python

Prima di immergersi nell'integrazione con Python, è essenziale comprendere le basi di cURL. È possibile utilizzare i comandi cURL direttamente nel terminale per eseguire operazioni come le richieste GET e POST.

Esempi di comandi cURL:

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

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

1.png

2.png

Installazione delle librerie necessarie

Per utilizzare cURL in Python, è necessaria la libreria pycurl, che fornisce un'interfaccia Python alla libreria cURL.

Installazione di PycURL:

pip install pycurl

Fare richieste HTTP con PycURL

PycURL offre un controllo dettagliato sulle richieste HTTP in Python. Di seguito è riportato un esempio che dimostra come effettuare una richiesta GET con PycURL:

import pycurl
import certifi
from io import BytesIO

# Creare un oggetto BytesIO per contenere i dati della risposta
buffer = BytesIO()

# Inizializzare un oggetto cURL
c = pycurl.Curl()

# Impostare l'URL per la richiesta HTTP GET
c.setopt(c.URL, 'https://httpbin.org/get')

# Impostare il buffer per catturare i dati di uscita
c.setopt(c.WRITEDATA, buffer)

# Impostare il percorso del file del bundle della CA per la verifica SSL/TLS.
c.setopt(c.CAINFO, certifi.where())

# Eseguire la richiesta HTTP
c.perform()

# Chiudere l'oggetto cURL per liberare risorse
c.close()

# Recuperare il contenuto della risposta dal buffer
body = buffer.getvalue()

# Decodificare e stampare il corpo della risposta
print(body.decode('iso-8859-1'))

Gestione delle richieste POST

L'invio di dati con richieste POST è comune. Con PycURL, utilizzare l'opzione POSTFIELDS. Ecco un esempio di richiesta POST con PycURL:

import pycurl
import certifi
from io import BytesIO

# Creare un oggetto BytesIO per contenere i dati della risposta
buffer = BytesIO()

# Inizializzare un oggetto cURL
c = pycurl.Curl()

# Impostare l'URL per la richiesta HTTP POST
c.setopt(c.URL, 'https://httpbin.org/post')

# Impostare i dati da pubblicare
post_data = 'param1="pycurl"¶m2=article'
c.setopt(c.POSTFIELDS, post_data)

# Impostare il buffer per catturare i dati di uscita
c.setopt(c.WRITEDATA, buffer)

# Impostare il percorso del file del bundle della CA per la verifica SSL/TLS.
c.setopt(c.CAINFO, certifi.where())

# Eseguire la richiesta HTTP
c.perform()

# Chiudere l'oggetto cURL per liberare risorse
c.close()

# Recuperare il contenuto della risposta dal buffer
body = buffer.getvalue()

# Decodificare e stampare il corpo della risposta
print(body.decode('iso-8859-1'))

Gestione delle intestazioni HTTP personalizzate

Le intestazioni personalizzate o l'autenticazione sono spesso richieste con le richieste HTTP. Di seguito è riportato un esempio di impostazione di intestazioni personalizzate con PycURL:

import pycurl
import certifi
from io import BytesIO

# Creare un oggetto BytesIO per contenere i dati di risposta
buffer = BytesIO()

# Inizializzare un oggetto cURL
c = pycurl.Curl()

# Impostare l'URL per la richiesta HTTP GET
c.setopt(c.URL, 'https://httpbin.org/get')

# Impostare intestazioni HTTP personalizzate
c.setopt(c.HTTPHEADER, ['User-Agent: MyApp', 'Accept: application/json'])

# Impostare il buffer per catturare i dati di uscita
c.setopt(c.WRITEDATA, buffer)

# Impostare il percorso del file del bundle della CA per la verifica SSL/TLS.
c.setopt(c.CAINFO, certifi.where())

# Eseguire la richiesta HTTP
c.perform()

# Chiudere l'oggetto cURL per liberare risorse
c.close()

# Recuperare il contenuto della risposta dal buffer
body = buffer.getvalue()

# Decodificare e stampare il corpo della risposta
print(body.decode('iso-8859-1'))

Gestione delle risposte XML

Il parsing e la gestione delle risposte XML sono fondamentali quando si lavora con le API. Di seguito è riportato un esempio di gestione delle risposte XML con PycURL:

# Importare le librerie necessarie
import pycurl  # Libreria per effettuare richieste HTTP
import certifi  # Libreria per la verifica dei certificati SSL
from io import BytesIO  # Libreria per la gestione di flussi di byte
import xml.etree.ElementTree as ET  # Libreria per il parsing di XML

# Creare un buffer per contenere i dati di risposta
buffer = BytesIO()

# Inizializzare un oggetto cURL
c = pycurl.Curl()

# Impostare l'URL per la richiesta HTTP GET
c.setopt(c.URL, 'https://www.google.com/sitemap.xml')

# Impostare il buffer per catturare i dati di uscita
c.setopt(c.WRITEDATA, buffer)

# Impostare il percorso del file del bundle della CA per la verifica SSL/TLS.
c.setopt(c.CAINFO, certifi.where())

# Eseguire la richiesta HTTP
c.perform()

# Chiudere l'oggetto cURL per liberare risorse
c.close()

# Recuperare il contenuto della risposta dal buffer
body = buffer.getvalue()

# Analizzare il contenuto XML in un oggetto ElementTree
root = ET.fromstring(body.decode('utf-8'))

# Stampa il tag e gli attributi dell'elemento radice dell'albero XML
print(root.tag, root.attrib)

Gestione degli errori HTTP

Una solida gestione degli errori è essenziale per rendere affidabili le richieste HTTP. Di seguito è riportato un esempio di gestione degli errori con PycURL:

import pycurl  # Importare la libreria pycurl
import certifi  # Importare la libreria dei certificati
from io import BytesIO  # Importazione di BytesIO per la gestione dei flussi di byte

# Inizializzare un oggetto Curl
c = pycurl.Curl()

buffer = BytesIO()
# Impostare l'URL per la richiesta HTTP
c.setopt(c.URL, 'http://example.com')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())

try:
    # Eseguire la richiesta HTTP
    c.perform()
except pycurl.error as e:
    # Se si verifica un errore durante la richiesta, catturare l'eccezione pycurl.error
    errno, errstr = e.args  # Recuperare il numero e il messaggio di errore
    print(f'Error: {errstr} (errno {errno})')  # Stampa del messaggio di errore e del numero di errore
finally:
    # Chiudere l'oggetto Curl per liberare risorse
    c.close()
    body = buffer.getvalue()
    print(body.decode('iso-8859-1'))  # Decodificare e stampare il corpo della risposta

3.png

Il codice corretto adatta l'URL a https://example.com, risolvendo il problema del protocollo. Ripete il processo di configurazione della richiesta, la sua esecuzione e la gestione degli errori come nello snippet iniziale. Quando l'esecuzione ha successo, il corpo della risposta viene nuovamente decodificato e stampato. Questi snippet evidenziano l'importanza di una corretta configurazione degli URL e di una solida gestione degli errori nelle richieste HTTP con pycurl.

import pycurl  # Importare la libreria pycurl
import certifi  # Importare la libreria dei certificati
from io import BytesIO  # Importazione di BytesIO per la gestione dei flussi di byte

# Reinizializzare l'oggetto Curl
c = pycurl.Curl()

buffer = BytesIO()
# Correggere l'URL per utilizzare HTTPS
c.setopt(c.URL, 'https://example.com')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())

try:
    # Eseguire la richiesta HTTP corretta
    c.perform()
except pycurl.error as e:
    # Se si verifica un errore durante la richiesta, catturare l'eccezione pycurl.error
    errno, errstr = e.args  # Recuperare il numero e il messaggio di errore
    print(f'Error: {errstr} (errno {errno})')  # Stampa del messaggio di errore e del numero di errore
finally:
    # Chiudere l'oggetto Curl per liberare risorse
    c.close()
    body = buffer.getvalue()
    print(body.decode('iso-8859-1'))  # Decodificare e stampare il corpo della risposta

Caratteristiche avanzate di cURL

cURL fornisce molte opzioni avanzate per controllare il comportamento delle richieste HTTP, come la gestione dei cookie e dei timeout. Di seguito è riportato un esempio che dimostra le opzioni avanzate con PycURL.

import pycurl  # Importare la libreria pycurl
import certifi  # Importare la libreria certifi per la verifica dei certificati SSL
from io import BytesIO  # Importazione di BytesIO per la gestione dei flussi di byte

# Creare un buffer per contenere i dati di risposta
buffer = BytesIO()

# Inizializzare un oggetto Curl
c = pycurl.Curl()

# Impostare l'URL per la richiesta HTTP
c.setopt(c.URL, 'http://httpbin.org/cookies')

# Abilitare i cookie impostando una specifica coppia chiave-valore
c.setopt(c.COOKIE, 'cookies_key=cookie_value')

# Impostare un timeout di 30 secondi per la richiesta.
c.setopt(c.TIMEOUT, 30)

# Impostare il buffer per catturare i dati di uscita
c.setopt(c.WRITEDATA, buffer)

# Impostare il percorso del file del bundle della CA per la verifica SSL/TLS.
c.setopt(c.CAINFO, certifi.where())

# Eseguire la richiesta HTTP
c.perform()

# Chiudere l'oggetto Curl per liberare risorse
c.close()

# Recuperare il contenuto della risposta dal buffer
body = buffer.getvalue()

# Decodificare il corpo della risposta utilizzando la codifica UTF-8 e stamparlo
print(body.decode('utf-8'))

Confronto tra PycURL, Requests, HTTPX e AIOHTTP

Quando si lavora con le richieste HTTP in Python, quattro librerie popolari sono PycURL, Requests, HTTPX e AIOHTTP. Ognuna ha i suoi punti di forza e di debolezza. Ecco un confronto per aiutarvi a scegliere lo strumento giusto per le vostre esigenze:

Caratteristica PycURL Requests HTTPX AIOHTTP
Facilità d'uso Moderato Molto facile Facile Moderato
Prestazioni Alto Moderato Alto Alto
Supporto asincrono No No
Streaming Limitato
Supporto del protocollo Ampio (supporta molti protocolli) HTTP/HTTPS HTTP/HTTPS, HTTP/2, WebSockets HTTP/HTTPS, WebSockets

L'analisi comparativa indica che PycURL offre elevate prestazioni e flessibilità, rendendolo adatto a utenti avanzati che richiedono una gestione dettagliata delle richieste HTTP. D'altra parte, Requests e HTTPX sono più adatti a scenari più semplici e intuitivi. AIOHTTP si distingue nella gestione delle attività asincrone, fornendo strumenti efficaci per la gestione delle richieste asincrone.

La scelta della libreria giusta dipende dalle esigenze e dai requisiti specifici del progetto; PycURL è un'opzione eccellente per chi ha bisogno di velocità e capacità avanzate.

Commenti:

0 Commenti