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.
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"
Per utilizzare cURL in Python, è necessaria la libreria pycurl, che fornisce un'interfaccia Python alla libreria cURL.
Installazione di PycURL:
pip install 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'))
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'))
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'))
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)
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
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
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'))
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 | Sì | Sì |
Streaming | Sì | Limitato | Sì | Sì |
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.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Commenti: 0