Hur man använder Python cURL?

Curl är ett kommandoradsverktyg som används som en HTTP-klient. Det är populärt att göra HTTP-förfrågningar från kommandoraden. cURL kan användas för att skriva skript för webbskrapning, kontrollera en webbplatss hälsa och ladda ner filer från kommandoraden.

Det är otroligt enkelt och kan användas i många programmeringsspråk. Den här artikeln vägleder vad cURL är och hur man använder det i Python.

Vad är cURL?

Enligt webbplatsen står cURL för ”klient-URL”. Det är ett kommandoradsverktyg och ett bibliotek för att överföra data med hjälp av olika nätverksprotokoll i applikationslager som HTTP, HTTPS, FTP och IMAP.

Det är otroligt populärt och används i över 10 miljarder installationer över enheter som radio, TV, routrar, skrivare och datorer. cURL är helt gratis och öppen källkod. Dess källkod är tillgänglig på GitHub.

Användningsfall för cURL

cURL är mycket användbar och mångsidig. Nedan listas de mest populära användningsfallen för cURL. Även om listan inte är uttömmande, är följande bara några av de mest populära fallen:

  • Testa API:er: Det kan kontrollera om API:et fungerar korrekt och returnerar korrekt data för en given begäran. Dessutom kan den också användas för att kontrollera API-hastigheten, det vill säga hur snabbt den svarar på förfrågningar. Du kan skriva ett skript för att kontrollera API-tillståndet regelbundet och skicka varningar när något går fel.
  • Web Scraping: Det kan också automatiskt extrahera data från webbplatser. cURL kan användas i kombination med många programmeringsspråk och som ett Bash-kommando. Med cURL kan du hämta data från webbplatser dynamiskt. Från responsens HTML kan du analysera och extrahera den data du behöver. Om du är intresserad av webbskrapning kanske du vill kolla in adminvista.com Web Scraping API som gör det lättare att skrapa data.
  • Ladda ner data: Med cURL kan du spara svar på förfrågningar till en fil. Dessa svar kan vara data från API-förfrågningar eller filer från en server. Genom att skriva svaret på en fil har du faktiskt laddat ner filen. Eftersom cURL är ett kommandoradsverktyg kan du automatisera denna process för att ladda ner många filer samtidigt.

Hur man använder cURL i Python (PycURL)

Installerar PycURL

För att använda cURL i Python använder vi PycURL-biblioteket. PycURL är ett Python-gränssnitt till cURL-biblioteket. Det skapar ett tunt omslag över det redan snabba cURL-biblioteket. Detta gör PycURL snabbare än andra bibliotek för att göra förfrågningar som urllib och förfrågningar. För att använda PycURL måste du först installera det. Det finns detaljerade instruktioner här, men ett enkelt sätt att installera det är att använda pip.

pip install PycURL

På Ubuntu 22.04 var jag tvungen att installera ytterligare verktyg innan jag installerade PycURL. Använd det här kommandot innan du försöker installera PycURL med pip:

sudo apt install libcurl4-openssl-dev libssl-dev

Gör en enkel GET-förfrågan

För att göra en begäran, börja med att skapa ett Python-skript att skriva koden i. Öppna filen med en textredigerare. Jag kommer att använda Vim, men du kan använda vad du vill. För att öppna filen med Vim använder du kommandot nedan:

vim pycurl.py

Här är pycurl.py namnet på filen jag ska skriva min kod i, men du kan namnge din fil vad som helst.

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 för att skriva svaret från PycURL.

from io import BytesIO

Sedan instansierar vi en ny Curl-instans.

c = Curl()

Därefter instansierar vi BytesIO för att skapa en ny buffert. PycURL har ingen inbyggd lagringsmekanism för att lagra svar. Så vi måste skapa en buffert och tala om var den ska skriva data.

buffer = BytesIO()

Med bufferten skapad kan vi ställa in alternativ på vårt klientobjekt. I det här fallet vill vi ställa in två alternativ; den första är webbadressen vi begär. Det andra är där 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 vi väl har gjort detta kan vi begära genom att anropa perform-metoden för klientobjektet och sedan stänga begäran genom att anropa close-metoden.

c.perform()
c.close()

För att få svaret anropar vi metoden getvalue() för buffertobjektet och avkodar det. Vi kan sedan skriva ut det till konsolen.

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

Din fil bör se ut så här:

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 att ha kört skriptet bör du få följande utdata:

Göra en POST-förfrågan

För att göra en POST-begäran måste du ställa in POSTFIELDS-alternativen för cURL-klientobjektet. Här är till exempel 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

# 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 ovan skapade jag ett ordboksobjekt med de data jag kommer att skicka som en del av förfrågan. Därefter kodade jag data till JSON och skickade den bifogad som nyttolast till 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 typen av accepterad svarsdata. När du kör koden bör du få ett sånt här svar.

Skriva svar på filer

Du kan också skicka in en filbuffert till alternativet cURL WRITEDATA. Detta kommer att skriva svarsdata till filen. Följande exempel illustrerar 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}')

Alternativ till PycURL

PycURL ger bara ett tunt lager över cURL-biblioteket. Detta gör den mycket anpassningsbar eftersom du har mer kontroll över funktioner på lägre nivå.

Det gör det dock svårare att använda och är därför mer riktat mot den avancerade utvecklaren. Ofta kanske du vill ha ett enklare alternativ till PycURL. I det här avsnittet kommer vi att diskutera alternativen.

#1. Andra bibliotek

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

#2. Andra språk

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

Slutsats

I den här artikeln introducerade jag cURL och förklarade hur man använder det i Python med PycURL-modulen. Vi diskuterade också alternativ till PycURL, såsom modulen förfrågningar och att använda olika språk helt och hållet för dina program.

Kolla sedan in cURL-kommandoanvändningen med realtidsexempel.