cURL i Python: Komplett guide med PycURL-eksempler

cURL er et kommandolinjeverktøy som fungerer som en HTTP-klient. Det er en populær metode for å sende HTTP-forespørsler direkte fra kommandolinjen. Med cURL kan du automatisere oppgaver som nettskraping, verifisere et nettsteds funksjonalitet og laste ned filer, alt via kommandolinjen.

Verktøyet er svært brukervennlig og kompatibelt med en rekke programmeringsspråk. Denne artikkelen gir en innføring i hva cURL er og hvordan du kan anvende det i Python-prosjekter.

Hva er cURL?

Som navnet indikerer, står cURL for «client URL». Det er et kommandolinjeverktøy og et bibliotek designet for dataoverføring ved hjelp av ulike nettverksprotokoller på applikasjonsnivå, inkludert HTTP, HTTPS, FTP og IMAP.

cURL er et svært utbredt verktøy, med over 10 milliarder installasjoner på alt fra radioer og TV-er til rutere, skrivere og datamaskiner. Det er helt kostnadsfritt og basert på åpen kildekode. Kildekoden er tilgjengelig på GitHub for de som er interessert i å bidra eller undersøke hvordan det fungerer.

Bruksområder for cURL

cURL er et fleksibelt og allsidig verktøy som kan brukes til mange formål. Her er noen av de vanligste bruksområdene:

  • API-testing: cURL er ideelt for å verifisere at et API fungerer som forventet og returnerer de korrekte dataene basert på gitte forespørsler. Du kan også bruke det til å måle API-ets ytelse, som for eksempel responshastigheten. Ved hjelp av script kan du automatisere overvåkingen av API-helse og motta varsler ved eventuelle feil.
  • Nettskraping: Verktøyet kan brukes til automatisk uthenting av data fra nettsider. cURL fungerer godt med mange programmeringsspråk og kan også brukes direkte i Bash-kommandoer. Dette gir deg muligheten til å hente data fra nettsider dynamisk. Etter å ha mottatt HTML-responsen, kan du analysere og hente ut den spesifikke informasjonen du trenger. Hvis du er interessert i nettskraping, kan du undersøke alternativer som tipsbilk.net Web Scraping API for å forenkle prosessen.
  • Nedlasting av data: Du kan bruke cURL til å lagre svaret på forespørsler i en fil. Dette kan være data fra et API-kall eller filer fra en server. Ved å lagre svaret i en fil, har du effektivt lastet ned filen. Ettersom cURL er et kommandolinjeverktøy, er det enkelt å automatisere denne prosessen for å laste ned flere filer samtidig.

Hvordan bruke cURL i Python (PycURL)

Installere PycURL

For å integrere cURL i Python, bruker vi PycURL-biblioteket. PycURL fungerer som et Python-grensesnitt til det underliggende cURL-biblioteket, og skaper et tynt lag som gir høy ytelse. Dette gjør PycURL ofte raskere enn alternativer som urllib og requests når det gjelder å utføre forespørsler. Før du bruker PycURL, må du installere det. Du finner detaljerte installasjonsinstruksjoner, men en rask måte å gjøre det på er ved å bruke pip:

pip install PycURL

På Ubuntu 22.04 var det nødvendig å installere ytterligere verktøy før installasjonen av PycURL. Før du forsøker å installere PycURL med pip, bør du kjøre følgende kommando:

sudo apt install libcurl4-openssl-dev libssl-dev

Gjennomføre en enkel GET-forespørsel

For å starte en forespørsel, opprett et Python-script for å skrive koden. Åpne filen i en teksteditor. For eksempel, hvis du bruker Vim, kan du starte filen med følgende kommando:

vim pycurl.py

Her er pycurl.py navnet på filen, men du kan velge et hvilket som helst navn du foretrekker.

Importer deretter Curl-klassen fra PycURL-modulen:

from pycurl import Curl

Etter å ha importert PycURL, må du også importere BytesIO fra io. Dette er nødvendig for å skape en buffer som kan lagre svaret fra PycURL:

from io import BytesIO

Nå kan du instansiere et nytt Curl-objekt:

c = Curl()

Deretter instansierer vi BytesIO for å skape en ny buffer. PycURL har ikke en innebygd mekanisme for lagring av svar. Derfor må vi manuelt skape en buffer og angi hvor dataene skal lagres:

buffer = BytesIO()

Etter å ha opprettet bufferen, kan vi konfigurere alternativer for klientobjektet. I dette eksemplet setter vi to alternativer; den første er URL-en vi vil sende forespørselen til, og den andre er hvor svaret skal skrives. Her er den aktuelle koden:

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

Når disse innstillingene er på plass, kan vi utføre forespørselen ved å kalle `perform()`-metoden på klientobjektet, og deretter avslutte tilkoblingen med `close()`:

c.perform()
c.close()

For å få tak i svaret, kaller vi `getvalue()`-metoden på bufferobjektet og dekoder det. Deretter kan vi printe resultatet til konsollen:

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

Hele filen skal se slik ut:

from pycurl import Curl
from io import BytesIO

# Opprett en PycURL-instans
c = Curl()
buffer = BytesIO()

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

# Utfør forespørselen
c.perform()

# Lukk tilkoblingen
c.close()

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

Etter at du har kjørt scriptet, skal du få utdata som ligner på følgende:

Sende en POST-forespørsel

For å sende en POST-forespørsel, må du definere `POSTFIELDS`-alternativet på cURL-klientobjektet. Nedenfor er et eksempel som sender en POST-forespørsel til JSON Placeholder API:

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

# Opprett en PycURL-instans
c = Curl()
buffer = BytesIO()

# Lag en datadictionary
data = {
    'userId': 1,
    'title': 'Lorem Ipsum',
    'body': 'Dolor sit amet'
}

# Konverter data til JSON
encoded_data = dumps(data)

# Angi forespørselsalternativer
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)

# Utfør forespørselen
c.perform()

# Lukk tilkoblingen
c.close()

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

I koden ovenfor opprettet vi et dictionary-objekt med dataene vi ønsker å sende som en del av forespørselen. Deretter konverterte vi dataene til JSON og sendte dem med som nyttelast ved å sette `POSTFIELDS`-alternativet til de kodede dataene. Vi spesifiserte også header for å definere forespørselens innholdstype og godkjent svardatatype. Etter å ha kjørt koden, skal du motta et svar som ligner på dette:

Skrive svar til filer

Du kan også angi en filbuffer for cURL `WRITEDATA`-alternativet. Dette vil skrive svardataene direkte til filen. Følgende eksempel illustrerer dette:

from pycurl import Curl

file_name="output.json"

# Åpner filen i skrivemodus
with open(file_name, 'wb') as f:
    
    # Oppretter en Curl-instans
    c = Curl()

    # Angi forespørselsalternativer
    c.setopt(c.URL, 'https://jsonplaceholder.typicode.com/users/1')
    c.setopt(c.HTTPHEADER, ['Accept: application/json'])
    c.setopt(c.WRITEDATA, f)

    # Utfør forespørselen
    c.perform()

    # Lukk tilkoblingen
    c.close()

    print(f'Skrev utdata til {file_name}')

Alternativer til PycURL

PycURL gir et enkelt grensesnitt til cURL-biblioteket, noe som gir stor fleksibilitet og kontroll over funksjoner på lavt nivå.

Dette kan imidlertid gjøre det litt mer komplisert å bruke, og det er derfor mer rettet mot erfarne utviklere. Ofte kan det være ønskelig med et enklere alternativ til PycURL. I denne delen skal vi se på noen alternativer.

#1. Andre biblioteker

I tillegg til PycURL, finnes det andre Python-biblioteker som kan brukes til å utføre forespørsler. Dette inkluderer bibliotekene requests og urllib, som begge er populære og enklere alternativer til PycURL.

#2. Andre språk

cURL har også grensesnitt implementert i en rekke andre programmeringsspråk. En populær nettside for konvertering av cURL-kode er Curl Converter. Med Curl Converter kan du lime inn en cURL-kommando for den forespørselen du ønsker å utføre, og verktøyet konverterer automatisk kommandoen til det valgte programmeringsspråket. Du kan også kjøre cURL-kommandoer direkte i terminalen eller skrive Bash-script for å bruke cURL.

Konklusjon

I denne artikkelen har vi introdusert cURL og forklart hvordan du kan bruke det i Python via PycURL-modulen. Vi diskuterte også alternativer til PycURL, inkludert requests-modulen og bruken av forskjellige programmeringsspråk.

Du kan nå utforske mer om cURL kommandoer og se eksempler i praksis.