Hvordan bruker jeg Python cURL?

Curl er et kommandolinjeverktøy som brukes som en HTTP-klient. Det er populært å lage HTTP-forespørsler fra kommandolinjen. cURL kan brukes til å skrive skript for nettskraping, sjekke et nettsteds helse og laste ned filer fra kommandolinjen.

Det er utrolig enkelt og kan brukes på mange programmeringsspråk. Denne artikkelen guider hva cURL er og hvordan du bruker den i Python.

Hva er cURL?

I følge nettstedet står cURL for «klient-URL». Det er et kommandolinjeverktøy og et bibliotek for overføring av data ved hjelp av forskjellige applikasjonslagsnettverksprotokoller som HTTP, HTTPS, FTP og IMAP.

Den er utrolig populær og brukes i over 10 milliarder installasjoner på tvers av enheter som radioer, TV-er, rutere, skrivere og datamaskiner. cURL er helt gratis og åpen kildekode. Kildekoden er tilgjengelig på GitHub.

Brukstilfeller for cURL

cURL er veldig nyttig og allsidig. Nedenfor er de mest populære brukstilfellene for cURL. Selv om listen ikke er uttømmende, er følgende bare noen av de mest populære tilfellene:

  • Testing av APIer: Den kan sjekke om API-en fungerer som den skal, og returnerer de riktige dataene for en gitt forespørsel. I tillegg kan den også brukes til å sjekke API-hastigheten, det vil si hvor raskt den svarer på forespørsler. Du kan skrive et skript for å sjekke API-helsen med jevne mellomrom og sende varsler når noe går galt.
  • Nettskraping: Den kan også automatisk trekke ut data fra nettsteder. cURL kan brukes sammen med mange programmeringsspråk og som en Bash-kommando. Med cURL kan du hente data fra nettsider dynamisk. Fra responsen HTML kan du analysere og trekke ut dataene du trenger. Hvis du er interessert i nettskraping, kan det være lurt å sjekke ut tipsbilk.net Web Scraping API som gjør det enklere å skrape data.
  • Laste ned data: Med cURL kan du lagre svaret på forespørsler til en fil. Disse svarene kan være data fra API-forespørsler eller filer fra en server. Effektivt, ved å skrive svaret til en fil, har du lastet ned filen. Siden cURL er et kommandolinjeverktøy, kan du automatisere denne prosessen for å laste ned mange filer samtidig.
  Slik finner du favorittsanger, artister og mer

Hvordan bruke cURL i Python (PycURL)

Installerer PycURL

For å bruke cURL i Python bruker vi PycURL-biblioteket. PycURL er et Python-grensesnitt til cURL-biblioteket. Det skaper en tynn innpakning over det allerede raske cURL-biblioteket. Dette gjør PycURL raskere enn andre biblioteker for å lage forespørsler som urllib og forespørsler. For å bruke PycURL må du først installere det. Det er detaljerte instruksjoner her, men en enkel måte å installere den på er å bruke pip.

pip install PycURL

På Ubuntu 22.04 måtte jeg installere flere verktøy før jeg installerte PycURL. Bruk denne kommandoen før du prøver å installere PycURL med pip:

sudo apt install libcurl4-openssl-dev libssl-dev

Foreta en enkel GET-forespørsel

For å lage en forespørsel, begynn med å lage et Python-skript for å skrive koden i. Åpne filen med et tekstredigeringsprogram. Jeg kommer til å bruke Vim, men du kan bruke hva du vil. For å åpne filen med Vim, bruker du kommandoen gitt nedenfor:

vim pycurl.py

Her er pycurl.py navnet på filen jeg skal skrive koden min i, men du kan navngi filen hva som helst.

Deretter importerer vi cURL-klassen fra PycURL-modulen

from pycurl import Curl

Etter å ha importert PycURL, importerer vi BytesIO fra io. Vi trenger dette for å lage en buffer for å skrive svaret til PycURL.

from io import BytesIO

Så instansierer vi en ny Curl-forekomst.

c = Curl()

Deretter instansierer vi BytesIO for å lage en ny buffer. PycURL har ikke en innebygd lagringsmekanisme for å lagre svar. Så vi må lage en buffer og fortelle den hvor dataene skal skrives.

buffer = BytesIO()

Med bufferen opprettet, kan vi sette alternativer på klientobjektet vårt. I dette tilfellet ønsker vi å angi to alternativer; den første er URL-en vi ber om. Den andre er der vi ønsker å skrive svarteksten. Her er koden for å gjøre det:

c.setopt(c.URL, 'http://pycurl.io/')
c.setopt(c.WRITEDATA, buffer)

Når vi har gjort dette, kan vi forespørre ved å kalle opp utføre-metoden til klientobjektet og deretter lukke forespørselen ved å kalle lukkemetoden.

c.perform()
c.close()

For å få svaret kaller vi getvalue()-metoden til bufferobjektet og dekoder det. Vi kan deretter skrive det ut til konsollen.

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

Filen din skal se slik ut:

from pycurl import Curl
from io import BytesIO

# Create a pycUrl instance
c = Curl()
buffer = BytesIO()

c.setopt(c.URL, 'http://pycurl.io/')
c.setopt(c.WRITEDATA, buffer)

# Make the request
c.perform()

# Close the connection
c.close()

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

Etter å ha utført skriptet, bør du få følgende utdata:

  13 beste CSS-animasjonsbiblioteker for fantastiske webdesignprosjekter

Gir en POST-forespørsel

For å lage en POST-forespørsel, må du angi POSTFIELDS-alternativene til cURL-klientobjektet. For eksempel, her er en forespørsel som sender en POST-forespørsel til JSON Placeholder API.

from io import BytesIO
from json import dumps
from pycurl import Curl

# Create a pycUrl instance
c = Curl()
buffer = BytesIO()

# Create a data dictionary
data = {
    'userId': 1,
    'title': 'Lorem Ipsum',
    'body': 'Dolor sit amet'
}

# Encode the data to json
encoded_data = dumps(data)

# Set request options
c.setopt(c.URL, 'https://jsonplaceholder.typicode.com/posts')
c.setopt(c.HTTPHEADER, ['Accept: application/json', 'Content-Type: application/json'])
c.setopt(c.POSTFIELDS, encoded_data)
c.setopt(c.WRITEDATA, buffer)

# Make the request
c.perform()

# Close the connection
c.close()

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

I koden ovenfor opprettet jeg et ordbokobjekt med dataene jeg skal sende som en del av forespørselen. Deretter kodet jeg dataene til JSON og sendte dem vedlagt som nyttelast til forespørselen ved å sette POSTFIELDS-alternativet til de kodede dataene. Jeg spesifiserte også overskrifter for å spesifisere forespørselens innholdstype og akseptert svardatatype. Når du kjører koden, bør du få et svar som dette.

  Python Threading: An Introduction – tipsbilk.net

Skrive svar på filer

Du kan også sende inn en filbuffer til alternativet cURL WRITEDATA. Dette vil skrive svardataene til filen. Følgende eksempel illustrerer konseptet:

from pycurl import Curl

file_name="output.json"

# Opening the file in write mode
with open(file_name, 'wb') as f:
    
    # Creating a Curl instance
    c = Curl()

    # Set request options
    c.setopt(c.URL, 'https://jsonplaceholder.typicode.com/users/1')
    c.setopt(c.HTTPHEADER, ['Accept: application/json'])
    c.setopt(c.WRITEDATA, f)

    # Make the request
    c.perform()

    # Close the connection
    c.close()

    print(f'Wrote output to {file_name}')

Alternativer til PycURL

PycURL gir bare et tynt lag over cURL-biblioteket. Dette gjør den svært tilpassbar ettersom du har mer kontroll over funksjoner på lavere nivå.

Det gjør det imidlertid vanskeligere å bruke og er derfor mer målrettet mot den avanserte utvikleren. Ofte vil du kanskje ha et enklere alternativ til PycURL. I denne delen skal vi diskutere alternativene.

#1. Andre biblioteker

Annet enn PycURL, har Python andre biblioteker som kan brukes til å lage forespørsler. Disse inkluderer forespørselsbiblioteket og urllib-biblioteket. Begge er populære annonse-enklere alternativer til pycURL.

#2. Andre språk

cURL har grensesnitt implementert på andre språk. Et populært nettsted for konvertering av cURL-nettsteder er Curl Converter. Med cURL Converter skriver du en cURL-kommando for forespørselen du vil gjøre, og den konverterer automatisk kommandoen din til et hvilket som helst valgt programmeringsspråk. Du kan også bare ringe cURL-kommandoen direkte i terminalen eller skrive et Bash-skript.

Konklusjon

I denne artikkelen introduserte jeg cURL og forklarte hvordan du bruker den i Python ved å bruke PycURL-modulen. Vi diskuterte også alternativer til PycURL, for eksempel forespørselsmodulen og bruk av forskjellige språk totalt for programmene dine.

Deretter kan du sjekke ut cURL-kommandobruk med sanntidseksempler.