Hur man använder Python cURL?

By rik

Curl är ett verktyg som körs från kommandoraden och agerar som en HTTP-klient. Det används ofta för att göra HTTP-anrop direkt från kommandotolken. Med cURL kan man skapa skript för att hämta data från webbplatser, kontrollera tillgängligheten av en webbplats och ladda ner filer, allt via kommandoraden.

Verktyget är mycket flexibelt och kan integreras i många programmeringsspråk. Den här artikeln beskriver vad cURL är och hur man använder det i Python.

Vad är cURL?

Enligt den officiella webbplatsen står cURL för ”client URL”. Det är ett kommandoradsverktyg och ett bibliotek för att överföra information med hjälp av olika nätverksprotokoll på applikationsnivå, som till exempel HTTP, HTTPS, FTP och IMAP.

cURL är oerhört populärt och används i över 10 miljarder installationer på enheter som radioapparater, TV-apparater, routrar, skrivare och datorer. Det är en helt gratis programvara med öppen källkod. Källkoden finns tillgänglig på GitHub.

Användningsområden för cURL

cURL är ett mångsidigt och kraftfullt verktyg. Nedan följer några av de mest typiska användningsområdena. Listan är inte fullständig, men ger en översikt över de vanligaste användningsområdena:

  • Testa API:er: cURL kan användas för att verifiera att ett API fungerar som det ska och att det returnerar korrekt data för en given förfrågan. Det kan också användas för att mäta API:ets hastighet, det vill säga hur snabbt det svarar på anrop. Genom att skapa ett skript kan man regelbundet övervaka API:ets status och få varningar om något går fel.
  • Webbskrapning: cURL kan automatiskt samla in data från webbplatser. Det kan användas i kombination med olika programmeringsspråk eller direkt som ett Bash-kommando. Med cURL kan man dynamiskt hämta data från webbsidor. Genom att analysera HTML-svaret kan man extrahera den information som behövs. Om du är intresserad av webbskrapning kan du undersöka adminvista.com Web Scraping API, vilket underlättar insamling av webbdata.
  • Ladda ner data: cURL kan spara svaren på förfrågningar till en fil. Dessa svar kan vara data från API-anrop eller filer från en server. Genom att spara svaret i en fil laddar man i praktiken ner filen. Eftersom cURL är ett kommandoradsverktyg kan denna process automatiseras för att ladda ner många filer samtidigt.

Hur man använder cURL i Python (PycURL)

Installera PycURL

För att använda cURL i Python använder vi biblioteket PycURL. PycURL är ett Python-gränssnitt för cURL-biblioteket. Det skapar ett tunt lager ovanpå det snabba cURL-biblioteket, vilket gör PycURL snabbare än andra bibliotek för att göra förfrågningar, som till exempel urllib och requests. För att använda PycURL måste det först installeras. Det finns detaljerade instruktioner tillgängliga, men ett enkelt sätt att installera det är att använda pip.

pip install PycURL

På Ubuntu 22.04 behövde jag installera ytterligare verktyg innan jag kunde installera PycURL. Använd följande kommando innan du försöker installera PycURL med pip:

sudo apt install libcurl4-openssl-dev libssl-dev

Gör en enkel GET-begäran

För att göra en begäran, börja med att skapa ett Python-skript där du skriver koden. Öppna filen med en textredigerare. Jag använder Vim, men du kan använda vilken du vill. För att öppna filen med Vim använder du följande kommando:

vim pycurl.py

Här är pycurl.py namnet på filen där jag skriver min kod, men du kan namnge filen som du vill.

Därefter importerar vi cURL-klassen från PycURL-modulen:

from pycurl import Curl

Efter att ha importerat PycURL importerar vi BytesIO från io. Vi kommer att behöva detta för att skapa en buffert som PycURL kan skriva svaret till.

from io import BytesIO

Sedan skapar vi en ny instans av Curl-klassen:

c = Curl()

Därefter skapar vi en instans av BytesIO för att skapa en ny buffert. PycURL har ingen inbyggd mekanism för att lagra svar, så vi måste skapa en buffert och ange var den ska skriva information.

buffer = BytesIO()

Med bufferten skapad kan vi ställa in alternativ för vårt klientobjekt. I det här fallet vill vi ställa in två alternativ: den första är URL:en vi begär, och det andra är var vi vill skriva svarstexten. Här är koden för att göra det:

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

När det är gjort kan vi göra förfrågan genom att anropa `perform`-metoden för klientobjektet, och sedan stänga anslutningen genom att anropa `close`-metoden.

c.perform()
c.close()

För att få svaret anropar vi metoden `getvalue()` för buffertobjektet och avkodar det. Sedan kan vi skriva ut det i konsolen.

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

Din fil ska se ut så här:

from pycurl import Curl
from io import BytesIO

# Skapa en pycUrl-instans
c = Curl()
buffer = BytesIO()

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

# Gör begäran
c.perform()

# Stäng anslutningen
c.close()

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

När du har kört skriptet ska du få följande utdata:

Göra en POST-begäran

För att göra en POST-begäran måste du ställa in `POSTFIELDS`-alternativen för cURL-klientobjektet. Här är ett exempel på en begäran som gör en POST-begäran till JSON Placeholder API:

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

# Skapa en pycUrl-instans
c = Curl()
buffer = BytesIO()

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

# Koda datan till JSON
encoded_data = dumps(data)

# Ange begäransalternativ
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)

# Gör begäran
c.perform()

# Stäng anslutningen
c.close()

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

I koden ovan skapade jag ett dictionary-objekt med den data som jag kommer att skicka som en del av förfrågan. Därefter kodade jag datan till JSON och skickade den som last i begäran genom att ställa in `POSTFIELDS`-alternativet till den kodade datan. Jag angav också rubriker för att ange innehållstypen för begäran och vilken typ av svarsdata som accepteras. När du kör koden bör du få ett svar som liknar detta.

Skriva svar till filer

Du kan också skicka en filbuffert till cURL-alternativet `WRITEDATA`. Detta skriver svarsdata till filen. Följande exempel illustrerar detta koncept:

from pycurl import Curl

file_name="output.json"

# Öppna filen i skrivläge
with open(file_name, 'wb') as f:
    
    # Skapa en Curl-instans
    c = Curl()

    # Ange begäransalternativ
    c.setopt(c.URL, 'https://jsonplaceholder.typicode.com/users/1')
    c.setopt(c.HTTPHEADER, ['Accept: application/json'])
    c.setopt(c.WRITEDATA, f)

    # Gör begäran
    c.perform()

    # Stäng anslutningen
    c.close()

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

Alternativ till PycURL

PycURL skapar endast ett tunt lager ovanpå cURL-biblioteket. Detta gör det mycket anpassningsbart eftersom du har mer kontroll över funktioner på lägre nivå.

Detta gör det dock svårare att använda, och riktar sig därför mer till avancerade utvecklare. Ibland kan det vara mer önskvärt med ett enklare alternativ till PycURL. I det här avsnittet går vi igenom några alternativ.

#1. Andra bibliotek

Förutom PycURL har Python andra bibliotek som kan användas för att göra förfrågningar. Dessa inkluderar requests-biblioteket och urllib-biblioteket. Båda är populära och enklare alternativ till pycURL.

#2. Andra språk

cURL har gränssnitt implementerade i andra språk. En populär webbplats för att konvertera cURL-anrop är Curl Converter. Med Curl Converter skriver du ett cURL-kommando för den begäran du vill göra, och verktyget konverterar automatiskt kommandot till valfritt programmeringsspråk. Du kan också anropa cURL-kommandot direkt i terminalen eller i ett Bash-skript.

Slutsats

I den här artikeln har vi introducerat cURL och förklarat hur man använder det i Python med hjälp av PycURL-modulen. Vi har också diskuterat alternativ till PycURL, som till exempel `requests`-modulen och användning av andra språk för dina program.

För vidare läsning, se exempel på cURL-kommandos användning i realtid.