Како користити Питхон цУРЛ?

cURL je alatka komandne linije koja se upotrebljava kao HTTP klijent. Često se koristi za slanje HTTP zahteva iz komandne linije. cURL može poslužiti za kreiranje skripti za preuzimanje sadržaja veb stranica, proveru funkcionalnosti sajtova, kao i preuzimanje datoteka putem komandne linije.

Izuzetno je jednostavan za korišćenje i primenljiv je u mnogim programskim jezicima. Ovaj tekst će objasniti šta je cURL i kako se koristi unutar Python-a.

Šta je cURL?

Prema zvaničnoj veb stranici, cURL označava „Client for URLs“. To je alatka komandne linije, kao i biblioteka namenjena za prenos podataka koristeći različite mrežne protokole na nivou aplikacija, kao što su HTTP, HTTPS, FTP i IMAP.

Veoma je popularan i koristi se u više od 10 milijardi instalacija na raznim uređajima, uključujući radio aparate, televizore, rutere, štampače i računare. cURL je potpuno besplatan i otvorenog koda. Njegov izvorni kod dostupan je na GitHub-u.

Primene cURL-a

cURL je veoma koristan i prilagodljiv alat. U nastavku se nalaze neke od najčešćih primena cURL-a. Iako lista nije iscrpna, ovo su neke od najpopularnijih upotreba:

  • Testiranje API-ja: Može se koristiti za proveru da li API radi ispravno, vraćajući tačne podatke za određeni zahtev. Pored toga, moguće je proveriti i brzinu API-ja, odnosno koliko brzo reaguje na zahteve. Možete napraviti skriptu koja će periodično proveravati stanje API-ja i slati obaveštenja ukoliko dođe do problema.
  • Preuzimanje podataka sa veb stranica: Takođe je moguće automatski preuzimati podatke sa veb lokacija. cURL se može koristiti u kombinaciji sa mnogim programskim jezicima, kao i putem Bash komandi. Korišćenjem cURL-a možete dinamički preuzimati podatke sa veb stranica. Iz HTML odgovora možete parsirati i izvući podatke koji su vam potrebni. Ako ste zainteresovani za preuzimanje podataka sa veba, možda bi trebalo da pogledate API za veb scraping koji olakšava taj proces.
  • Preuzimanje datoteka: Korišćenjem cURL-a možete sačuvati odgovor na zahteve u datoteku. Ti odgovori mogu biti podaci iz API zahteva ili same datoteke sa servera. Upisivanjem odgovora u datoteku, zapravo ste preuzeli datoteku. Budući da je cURL alatka komandne linije, možete automatizovati ovaj proces i preuzeti veći broj datoteka odjednom.

Kako koristiti cURL u Pythonu (PycURL)

Instaliranje PycURL-a

Da bismo koristili cURL unutar Python-a, koristićemo PycURL biblioteku. PycURL je Python interfejs za cURL biblioteku. On stvara tanak sloj oko već brze cURL biblioteke. To čini PycURL bržim od drugih biblioteka za slanje zahteva, kao što su urllib i requests. Da biste koristili PycURL, prvo ga morate instalirati. Ovde su detaljna uputstva, ali najjednostavniji način da ga instalirate jeste korišćenjem pip-a.

pip install PycURL

Na Ubuntu 22.04, morao sam da instaliram dodatne alate pre instaliranja PycURL-a. Koristite ovu komandu pre nego što pokušate da instalirate PycURL sa pip-om:

sudo apt install libcurl4-openssl-dev libssl-dev

Slanje jednostavnog GET zahteva

Da biste poslali zahtev, počnite sa kreiranjem Python skripte u koju ćete upisati kod. Otvorite datoteku pomoću tekst editora. Ja ću koristiti Vim, ali vi možete koristiti bilo koji koji želite. Da biste otvorili datoteku pomoću Vim-a, koristite komandu navedenu ispod:

vim pycurl.py

Ovde, pycurl.py je naziv datoteke u koju ću upisati svoj kod, ali vi možete nazvati svoju datoteku kako god želite.

Zatim importujemo Curl klasu iz PycURL modula:

from pycurl import Curl

Nakon importovanja PycURL-a, importujemo BytesIO iz io. Ovo će nam biti potrebno za kreiranje bafera u koji će PycURL upisivati odgovor.

from io import BytesIO

Zatim instanciramo novu instancu Curl-a.

c = Curl()

Zatim instanciramo BytesIO kako bismo kreirali novi bafer. PycURL nema ugrađen mehanizam za skladištenje odgovora. Dakle, moramo da kreiramo bafer i kažemo mu gde da upiše podatke.

buffer = BytesIO()

Sa kreiranim baferom, možemo da postavimo opcije za naš klijentski objekat. U ovom slučaju želimo da postavimo dve opcije; prva je URL koji zahtevamo. Druga je mesto gde želimo da upišemo telo odgovora. Evo koda za to:

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

Kada to uradimo, možemo poslati zahtev pozivanjem metode perform klijentskog objekta, a zatim zatvoriti zahtev pozivanjem metode close.

c.perform()
c.close()

Da bismo dobili odgovor, pozivamo metodu getvalue() objekta bafera i dekodiramo ga. Zatim ga možemo odštampati na konzoli.

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

Vaša datoteka bi trebalo da izgleda ovako:

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

Nakon izvršavanja skripte, trebalo bi da dobijete sledeći izlaz:

Slanje POST zahteva

Da biste poslali POST zahtev, moraćete da podesite POSTFIELDS opcije za cURL klijentski objekat. Na primer, ovde je zahtev koji šalje POST zahtev ka JSON Placeholder API-ju.

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

U gornjem kodu, napravio sam objekat rečnika sa podacima koje ću poslati kao deo zahteva. Zatim sam kodirao podatke u JSON i poslao ih kao korisni teret zahteva tako što sam postavio opciju POSTFIELDS na kodirane podatke. Takođe sam naveo zaglavlja da definišem tip sadržaja zahteva i prihvaćeni tip podataka odgovora. Kada pokrenete kod, trebalo bi da dobijete ovakav odgovor.

Upisivanje odgovora u datoteke

Takođe možete proslediti bafer datoteke u opciju cURL WRITEDATA. Ovo će upisati podatke odgovora u datoteku. Sledeći primer ilustruje koncept:

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

Alternative za PycURL

PycURL pruža samo tanak sloj preko cURL biblioteke. To ga čini veoma prilagodljivim, jer imate više kontrole nad funkcijama nižeg nivoa.

Međutim, to otežava upotrebu i samim tim je više usmeren ka naprednim programerima. Često ćete možda želeti jednostavniju alternativu za PycURL. U ovom odeljku ćemo razgovarati o alternativama.

#1. Druge biblioteke

Pored PycURL-a, Python ima i druge biblioteke koje se mogu koristiti za slanje zahteva. Ovo uključuje biblioteku requests i urllib biblioteku. Obe su popularne i jednostavnije alternative za PycURL.

#2. Drugi jezici

cURL ima interfejse implementirane u drugim jezicima. Popularan vebsajt za konvertovanje cURL komandi je Curl Converter. Sa Curl Converterom pišete cURL komandu za zahtev koji želite da napravite, a on automatski konvertuje vašu komandu u bilo koji izabrani programski jezik. Takođe možete jednostavno pozvati cURL komandu direktno u svom terminalu ili napisati Bash skriptu.

Zaključak

U ovom članku sam predstavio cURL i objasnio kako ga koristiti u Pythonu koristeći PycURL modul. Takođe smo razgovarali o alternativama za PycURL, kao što je modul requests i potpuno korišćenje različitih jezika za vaše programe.

Zatim pogledajte upotrebu komande cURL sa primerima u realnom vremenu.