Hvordan bruger man Python cURL?

Curl er et kommandolinjeværktøj, der bruges som HTTP-klient. Det er populært at lave HTTP-anmodninger fra kommandolinjen. cURL kan bruges til at skrive scripts til webscraping, kontrollere et websteds sundhed og downloade filer fra kommandolinjen.

Det er utrolig enkelt og kan bruges på mange programmeringssprog. Denne artikel guider, hvad cURL er, og hvordan man bruger det i Python.

Hvad er cURL?

Ifølge hjemmesiden står cURL for “klient-URL”. Det er et kommandolinjeværktøj og et bibliotek til overførsel af data ved hjælp af forskellige applikationslagnetværksprotokoller såsom HTTP, HTTPS, FTP og IMAP.

Den er utrolig populær og bruges i over 10 milliarder installationer på tværs af enheder som radioer, tv’er, routere, printere og computere. cURL er helt gratis og open source. Dens kildekode er tilgængelig på GitHub.

cURL Use Cases

cURL er meget nyttig og alsidig. Nedenfor er de mest populære anvendelsesmuligheder for cURL. Selvom listen ikke er udtømmende, er følgende blot nogle af de mest populære tilfælde:

  • Test af API’er: Det kan kontrollere, om API’en fungerer korrekt, og returnerer de korrekte data for en given anmodning. Derudover kan den også bruges til at tjekke API-hastigheden, altså hvor hurtigt den reagerer på forespørgsler. Du kan skrive et script for at kontrollere API-tilstanden med jævne mellemrum og sende advarsler, når noget går galt.
  • Web Scraping: Det kan også automatisk udtrække data fra websteder. cURL kan bruges sammen med mange programmeringssprog og som en Bash-kommando. Med cURL kan du hente data fra websteder dynamisk. Fra respons HTML kan du parse og udtrække de data, du har brug for. Hvis du er interesseret i web-skrabning, kan du prøve at tjekke toadmin.dk Web Scraping API, der gør det nemmere at skrabe data.
  • Download af data: Med cURL kan du gemme svaret på anmodninger i en fil. Disse svar kan være data fra API-anmodninger eller filer fra en server. Effektivt, ved at skrive svaret til en fil, har du downloadet filen. Da cURL er et kommandolinjeværktøj, kan du automatisere denne proces for at downloade masser af filer på én gang.
  Sådan får du adgang til GPT-4 lige nu!

Sådan bruger du cURL i Python (PycURL)

Installerer PycURL

For at bruge cURL i Python bruger vi PycURL-biblioteket. PycURL er en Python-grænseflade til cURL-biblioteket. Det skaber en tynd indpakning over det allerede hurtige cURL-bibliotek. Dette gør PycURL hurtigere end andre biblioteker til at lave anmodninger såsom urllib og anmodninger. For at bruge PycURL skal du først installere det. Der er detaljerede instruktioner her, men en nem måde at installere det på er at bruge pip.

pip install PycURL

På Ubuntu 22.04 var jeg nødt til at installere yderligere værktøjer, før jeg installerede PycURL. Brug denne kommando, før du prøver at installere PycURL med pip:

sudo apt install libcurl4-openssl-dev libssl-dev

Lav en simpel GET-anmodning

For at lave en anmodning skal du begynde med at oprette et Python-script til at skrive koden i. Åbn filen med en teksteditor. Jeg vil bruge Vim, men du kan bruge hvad du vil. For at åbne filen med Vim, bruger du kommandoen nedenfor:

vim pycurl.py

Her er pycurl.py navnet på den fil, jeg skal skrive min kode i, men du kan navngive din fil hvad som helst.

Dernæst importerer vi cURL-klassen fra PycURL-modulet

from pycurl import Curl

Efter import af PycURL importerer vi BytesIO fra io. Vi skal bruge dette for at oprette en buffer til at skrive svaret fra PycURL.

from io import BytesIO

Derefter instansierer vi en ny Curl-instans.

c = Curl()

Dernæst instansierer vi BytesIO for at skabe en ny buffer. PycURL har ikke en indbygget lagermekanisme til at gemme svar. Så vi er nødt til at oprette en buffer og fortælle den, hvor dataene skal skrives.

buffer = BytesIO()

Med bufferen oprettet, kan vi indstille muligheder på vores klientobjekt. I dette tilfælde ønsker vi at angive to muligheder; den første er den URL, vi anmoder om. Det andet er, hvor vi vil skrive svarteksten. Her er koden til at gøre det:

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

Når vi har gjort dette, kan vi anmode ved at kalde udføre-metoden for klientobjektet og derefter lukke anmodningen ved at kalde luk-metoden.

c.perform()
c.close()

For at få svaret kalder vi getvalue()-metoden for bufferobjektet og afkoder det. Vi kan derefter printe det til konsollen.

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

Din fil skal se sådan ud:

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'))

Efter at have udført scriptet, bør du få følgende output:

  Tynde bogmærker giver dig mulighed for at tilpasse bogmærkelinjen [Firefox]

Lav en POST-anmodning

For at lave en POST-anmodning skal du indstille POSTFIELDS-indstillingerne for cURL-klientobjektet. For eksempel er her en anmodning, der foretager en POST-anmodning 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 oprettede jeg et ordbogsobjekt med de data, jeg vil sende som en del af anmodningen. Dernæst kodede jeg dataene til JSON og sendte dem vedhæftet som nyttelast til anmodningen ved at indstille POSTFIELDS-indstillingen til de kodede data. Jeg specificerede også overskrifter for at angive anmodningens indholdstype og accepterede svardatatype. Når du kører koden, bør du få et svar som dette.

  Optager apps virkelig din iPhones skærm?

Skrivning af svar til filer

Du kan også overføre en filbuffer til indstillingen cURL WRITEDATA. Dette vil skrive svardataene til filen. Følgende eksempel illustrerer konceptet:

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 giver kun et tyndt lag over cURL-biblioteket. Dette gør det meget tilpasseligt, da du har mere kontrol over funktioner på lavere niveau.

Det gør det dog sværere at bruge og er derfor mere målrettet mod den avancerede udvikler. Ofte vil du måske have et enklere alternativ til PycURL. I dette afsnit vil vi diskutere alternativerne.

#1. Andre biblioteker

Ud over PycURL har Python andre biblioteker, der kan bruges til at lave anmodninger. Disse inkluderer anmodningsbiblioteket og urllib-biblioteket. Begge er populære annoncelettere alternativer til pycURL.

#2. Andre sprog

cURL har grænseflader implementeret på andre sprog. Et populært websted til konvertering af cURL-websteder er Curl Converter. Med cURL-konverteren skriver du en cURL-kommando til den anmodning, du vil lave, og den konverterer automatisk din kommando til et hvilket som helst valgt programmeringssprog. Du kan også bare kalde cURL-kommandoen direkte i din terminal eller skrive et Bash-script.

Konklusion

I denne artikel introducerede jeg cURL og forklarede, hvordan man bruger det i Python ved hjælp af PycURL-modulet. Vi diskuterede også alternativer til PycURL, såsom anmodningsmodulet og i det hele taget at bruge forskellige sprog til dine programmer.

Tjek derefter cURL-kommandobrugen med eksempler i realtid.