Curl to narzędzie działające w linii poleceń, które pełni funkcję klienta HTTP. Jest powszechnie wykorzystywane do wysyłania zapytań HTTP bezpośrednio z konsoli. cURL umożliwia tworzenie skryptów do eksploracji zawartości stron internetowych, monitorowania sprawności witryn oraz pobierania różnorodnych plików za pomocą poleceń.
Jego atutem jest prostota obsługi i kompatybilność z wieloma językami programowania. Ten artykuł ma za zadanie wyjaśnić, czym jest cURL i jak efektywnie korzystać z niego w środowisku Pythona.
Czym jest cURL?
Według definicji na oficjalnej stronie internetowej, cURL to skrót od „client URL”. Jest to narzędzie wiersza poleceń oraz biblioteka programistyczna służąca do przesyłania danych z wykorzystaniem różnych protokołów sieciowych, takich jak HTTP, HTTPS, FTP czy IMAP.
Jego popularność jest ogromna, a wykorzystanie szacuje się na ponad 10 miliardów instalacji, obejmujących różnorodne urządzenia, takie jak radia, telewizory, routery, drukarki i komputery. cURL jest projektem całkowicie darmowym i o otwartym kodzie źródłowym. Jego kod źródłowy jest dostępny publicznie na platformie GitHub.
Przykłady zastosowań cURL
cURL jest niezwykle wszechstronnym i użytecznym narzędziem. Poniżej zaprezentowano najczęstsze scenariusze jego wykorzystania. Chociaż lista nie jest pełna, wymienione przykłady ilustrują jego szerokie możliwości:
- Testowanie interfejsów API: Pozwala na weryfikację poprawności działania API poprzez sprawdzenie, czy zwraca ono prawidłowe dane dla określonego zapytania. Dodatkowo, umożliwia ocenę szybkości reakcji API. Istnieje możliwość automatyzacji procesu testowania stanu API za pomocą skryptów i generowania powiadomień w przypadku wykrycia nieprawidłowości.
- Web Scraping: cURL umożliwia automatyczne pozyskiwanie danych ze stron internetowych. Może być wykorzystywany w połączeniu z różnymi językami programowania lub bezpośrednio jako polecenie Bash. Dzięki niemu można dynamicznie pobierać informacje ze stron, a następnie analizować uzyskany kod HTML i wydobywać potrzebne dane. Dla osób zainteresowanych web scrapingiem, warto rozważyć API newsblog.pl Web Scraping, które upraszcza ten proces.
- Pobieranie danych: cURL pozwala na zapisywanie odpowiedzi na zapytania do plików. Te odpowiedzi mogą obejmować dane z zapytań API lub pliki pobrane z serwera. W efekcie, zapisanie odpowiedzi do pliku jest równoznaczne z pobraniem pliku. Dzięki temu, że cURL jest narzędziem wiersza poleceń, możliwe jest zautomatyzowanie procesu pobierania wielu plików jednocześnie.
Wykorzystanie cURL w Pythonie (PycURL)
Instalacja PycURL
Aby używać cURL w Pythonie, niezbędna jest biblioteka PycURL. PycURL stanowi interfejs Pythona do biblioteki cURL, tworząc cienką warstwę wokół już wydajnej biblioteki cURL. To sprawia, że PycURL jest szybszy niż inne biblioteki, takie jak urllib czy requests, które służą do wysyłania zapytań. Aby móc korzystać z PycURL, należy go najpierw zainstalować. Szczegółowe instrukcje instalacji są dostępne online, ale najprostszym sposobem jest użycie menedżera pakietów pip.
pip install PycURL
W systemie Ubuntu 22.04 konieczna może być instalacja dodatkowych narzędzi przed instalacją PycURL. Przed próbą instalacji PycURL za pomocą pip, zaleca się wykonanie poniższego polecenia:
sudo apt install libcurl4-openssl-dev libssl-dev
Wykonywanie prostego żądania GET
Aby złożyć żądanie, należy utworzyć skrypt w Pythonie, w którym umieścimy kod. Otwórz plik za pomocą edytora tekstu. W przykładzie użyto edytora Vim, ale można wybrać dowolny inny. Aby otworzyć plik w Vim, użyj poniższego polecenia:
vim pycurl.py
W tym przypadku pycurl.py to nazwa pliku, w którym będzie umieszczany kod, jednak można wybrać dowolną nazwę.
Następnie zaimportuj klasę cURL z modułu PycURL:
from pycurl import Curl
Po zaimportowaniu PycURL, zaimportuj również BytesIO z modułu io. Będzie on potrzebny do utworzenia bufora, w którym zostanie zapisana odpowiedź PycURL.
from io import BytesIO
Następnie utwórz instancję klasy Curl.
c = Curl()
Kolejnym krokiem jest utworzenie instancji BytesIO w celu utworzenia nowego bufora. PycURL nie ma wbudowanego mechanizmu przechowywania odpowiedzi, dlatego trzeba utworzyć bufor i wskazać miejsce, w którym dane mają być zapisywane.
buffer = BytesIO()
Po utworzeniu bufora, można ustawić opcje dla obiektu klienta. W tym przykładzie, ustawiamy dwie opcje: adres URL, do którego wysyłamy żądanie oraz miejsce, w którym ma być zapisana treść odpowiedzi. Poniżej znajduje się kod, który to realizuje:
c.setopt(c.URL, 'http://pycurl.io/') c.setopt(c.WRITEDATA, buffer)
Po ustawieniu opcji, można wysłać żądanie wywołując metodę perform obiektu klienta, a następnie zamknąć połączenie wywołując metodę close.
c.perform() c.close()
Aby uzyskać odpowiedź, wywołaj metodę getvalue() obiektu bufora i zdekoduj ją. Następnie, możesz wyświetlić odpowiedź na konsoli.
body = buffer.getvalue() print(body.decode('iso-8859-1'))
Twój plik powinien wyglądać następująco:
from pycurl import Curl from io import BytesIO # Utworzenie instancji pycUrl c = Curl() buffer = BytesIO() c.setopt(c.URL, 'http://pycurl.io/') c.setopt(c.WRITEDATA, buffer) # Wykonanie żądania c.perform() # Zamknięcie połączenia c.close() body = buffer.getvalue() print(body.decode('iso-8859-1'))
Po uruchomieniu skryptu, powinny pojawić się następujące dane wyjściowe:
Wykonywanie żądania POST
Aby wykonać żądanie POST, należy ustawić opcje POSTFIELDS obiektu klienta cURL. Poniżej przedstawiono przykład, który wysyła żądanie POST do interfejsu JSON Placeholder API.
from io import BytesIO from json import dumps from pycurl import Curl # Utworzenie instancji pycUrl c = Curl() buffer = BytesIO() # Utworzenie słownika z danymi data = { 'userId': 1, 'title': 'Lorem Ipsum', 'body': 'Dolor sit amet' } # Zakodowanie danych do formatu JSON encoded_data = dumps(data) # Ustawienie opcji żądania 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) # Wykonanie żądania c.perform() # Zamknięcie połączenia c.close() body = buffer.getvalue() print(body.decode('iso-8859-1'))
W powyższym kodzie, utworzono obiekt słownika z danymi, które zostaną wysłane w ramach żądania. Następnie, dane zostały zakodowane do formatu JSON i wysłane jako payload do żądania poprzez ustawienie opcji POSTFIELDS na zakodowane dane. Dodatkowo, określono nagłówki, które definiują typ zawartości żądania oraz akceptowany typ danych odpowiedzi. Po uruchomieniu kodu, powinna zostać zwrócona odpowiedź podobna do poniższej:
Zapisywanie odpowiedzi do plików
Istnieje możliwość przekazania bufora pliku do opcji cURL WRITEDATA, co skutkuje zapisaniem danych odpowiedzi do pliku. Poniższy przykład ilustruje to podejście:
from pycurl import Curl file_name="output.json" # Otwarcie pliku w trybie zapisu with open(file_name, 'wb') as f: # Utworzenie instancji Curl c = Curl() # Ustawienie opcji żądania c.setopt(c.URL, 'https://jsonplaceholder.typicode.com/users/1') c.setopt(c.HTTPHEADER, ['Accept: application/json']) c.setopt(c.WRITEDATA, f) # Wykonanie żądania c.perform() # Zamknięcie połączenia c.close() print(f'Wynik zapisano do pliku {file_name}')
Alternatywy dla PycURL
PycURL stanowi jedynie cienką warstwę nad biblioteką cURL, co umożliwia dużą elastyczność i kontrolę nad funkcjami niższego poziomu.
Jednak ta cecha może utrudniać korzystanie z PycURL, co sprawia, że jest ono bardziej odpowiednie dla zaawansowanych programistów. Często potrzebne są prostsze alternatywy. W tej sekcji omówione zostaną dostępne alternatywy.
#1. Inne biblioteki
Oprócz PycURL, Python oferuje inne biblioteki, które można wykorzystać do wysyłania zapytań, takie jak biblioteka requests i urllib. Obie te biblioteki są popularne i stanowią prostszą alternatywę dla pycURL.
#2. Inne języki
cURL posiada interfejsy zaimplementowane w różnych językach programowania. Popularnym narzędziem do konwersji zapytań cURL jest Curl Converter. Używając go, możesz wprowadzić polecenie cURL dla żądanego zapytania, a narzędzie automatycznie przekonwertuje je na wybrany język programowania. Możesz również bezpośrednio wywoływać polecenia cURL w terminalu lub napisać skrypt Bash.
Podsumowanie
W tym artykule omówiono narzędzie cURL oraz wyjaśniono, jak używać go w Pythonie za pośrednictwem modułu PycURL. Przedstawiono również alternatywy dla PycURL, takie jak moduł requests oraz wykorzystanie innych języków programowania.
Zachęcamy do zapoznania się z przykładami praktycznego wykorzystania polecenia cURL.