Jak korzystać z Pythona cURL?

Curl to narzędzie wiersza poleceń używane jako klient HTTP. Jest popularny do wysyłania żądań HTTP z wiersza poleceń. cURL może być używany do pisania skryptów do skrobania stron internetowych, sprawdzania kondycji witryny i pobierania plików z wiersza poleceń.

Jest niesamowicie prosty i może być używany w wielu językach programowania. Ten artykuł wyjaśnia, czym jest cURL i jak go używać w Pythonie.

Co to jest cURL?

Według strony internetowej cURL oznacza „url klienta”. Jest to narzędzie wiersza poleceń i biblioteka do przesyłania danych przy użyciu różnych protokołów sieciowych warstwy aplikacji, takich jak HTTP, HTTPS, FTP i IMAP.

Jest niezwykle popularny i używany w ponad 10 miliardach instalacji na urządzeniach takich jak radia, telewizory, routery, drukarki i komputery. cURL jest całkowicie darmowy i open-source. Jego kod źródłowy jest dostępny na GitHubie.

cURL Przypadki użycia

cURL jest bardzo przydatny i wszechstronny. Poniżej wymieniono najpopularniejsze przypadki użycia cURL. Chociaż lista nie jest wyczerpująca, poniżej przedstawiono tylko niektóre z najpopularniejszych przypadków:

  • Testowanie interfejsów API: Może sprawdzić, czy interfejs API działa poprawnie, zwracając poprawne dane dla danego żądania. Ponadto można go również wykorzystać do sprawdzenia szybkości API, czyli tego, jak szybko odpowiada na żądania. Możesz napisać skrypt, aby okresowo sprawdzać stan interfejsu API i wysyłać alerty, gdy coś pójdzie nie tak.
  • Web Scraping: Może również automatycznie wyodrębniać dane ze stron internetowych. cURL może być używany w połączeniu z wieloma językami programowania oraz jako polecenie Bash. Dzięki cURL możesz dynamicznie pobierać dane ze stron internetowych. Z kodu HTML odpowiedzi możesz przeanalizować i wyodrębnić potrzebne dane. Jeśli interesuje Cię web scraping, możesz sprawdzić API newsblog.pl Web Scraping, które ułatwia scraping danych.
  • Pobieranie danych: Za pomocą cURL możesz zapisać odpowiedzi na żądania do pliku. Te odpowiedzi mogą być danymi z żądań API lub plikami z serwera. W efekcie, pisząc odpowiedź do pliku, pobrałeś plik. Ponieważ cURL jest narzędziem wiersza poleceń, możesz zautomatyzować ten proces, aby pobierać wiele plików jednocześnie.

Jak używać cURL w Pythonie (PycURL)

Instalowanie PycURL

Aby użyć cURL w Pythonie, używamy biblioteki PycURL. PycURL to interfejs Pythona do biblioteki cURL. Tworzy cienkie opakowanie na i tak już szybkiej bibliotece cURL. To sprawia, że ​​PycURL jest szybszy niż inne biblioteki do wysyłania żądań, takich jak urllib i żądania. Aby korzystać z PycURL, musisz go najpierw zainstalować. Istnieją szczegółowe instrukcje tutaj, ale łatwym sposobem instalacji jest użycie pip.

pip install PycURL

W Ubuntu 22.04 musiałem zainstalować dodatkowe narzędzia przed zainstalowaniem PycURL. Użyj tego polecenia przed próbą zainstalowania PycURL za pomocą pip:

sudo apt install libcurl4-openssl-dev libssl-dev

Wykonywanie prostego żądania GET

Aby złożyć wniosek, zacznij od utworzenia skryptu w języku Python do zapisania kodu. Otwórz plik za pomocą edytora tekstu. Zamierzam użyć Vima, ale możesz użyć dowolnego. Aby otworzyć plik za pomocą Vima, użyj polecenia podanego poniżej:

vim pycurl.py

Tutaj pycurl.py to nazwa pliku, w którym będę pisać mój kod, ale możesz nazwać swój plik w dowolny sposób.

Następnie importujemy klasę cURL z modułu PycURL

from pycurl import Curl

Po zaimportowaniu PycURL importujemy BytesIO z io. Będziemy potrzebować tego, aby utworzyć bufor do zapisania odpowiedzi PycURL.

from io import BytesIO

Następnie tworzymy instancję nowej instancji Curl.

c = Curl()

Następnie tworzymy instancję BytesIO, aby utworzyć nowy bufor. PycURL nie ma wbudowanego mechanizmu przechowywania odpowiedzi. Musimy więc utworzyć bufor i powiedzieć mu, gdzie ma zapisywać dane.

buffer = BytesIO()

Po utworzeniu bufora możemy ustawić opcje dla naszego obiektu klienckiego. W tym przypadku chcemy ustawić dwie opcje; pierwszy to adres URL, o który prosimy. Drugi to miejsce, w którym chcemy napisać treść odpowiedzi. Oto kod, aby to zrobić:

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

Gdy to zrobimy, możemy zażądać, wywołując metodę perform obiektu klienta, a następnie zamknąć żądanie, wywołując metodę close.

c.perform()
c.close()

Aby uzyskać odpowiedź, wywołujemy metodę getvalue() obiektu bufora i dekodujemy ją. Następnie możemy wydrukować go na konsoli.

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

Twój plik powinien wyglądać tak:

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

Po wykonaniu skryptu powinieneś otrzymać następujące dane wyjściowe:

Wykonywanie żądania POST

Aby wykonać żądanie POST, musisz ustawić opcje POSTFIELDS obiektu klienta cURL. Na przykład tutaj jest żądanie wysyłające żądanie POST do interfejsu 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'))

W powyższym kodzie utworzyłem obiekt słownika z danymi, które będę wysyłał w ramach żądania. Następnie zakodowałem dane do formatu JSON i wysłałem jako payload do żądania, ustawiając opcję POSTFIELDS na zakodowane dane. Określiłem również nagłówki, aby określić typ treści żądania i akceptowany typ danych odpowiedzi. Po uruchomieniu kodu powinieneś otrzymać taką odpowiedź.

Pisanie odpowiedzi do plików

Możesz także przekazać bufor pliku do opcji cURL WRITEDATA. Spowoduje to zapisanie danych odpowiedzi do pliku. Poniższy przykład ilustruje tę koncepcję:

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

Alternatywy dla PycURL

PycURL zapewnia tylko cienką warstwę nad biblioteką cURL. Dzięki temu można go w dużym stopniu dostosowywać, ponieważ masz większą kontrolę nad funkcjami niższego poziomu.

Utrudnia to jednak korzystanie z niego i dlatego jest bardziej ukierunkowane na zaawansowanych programistów. Często możesz potrzebować prostszej alternatywy dla PycURL. W tej sekcji omówimy alternatywy.

# 1. Inne biblioteki

Oprócz PycURL Python ma inne biblioteki, których można używać do wysyłania żądań. Obejmują one bibliotekę żądań i bibliotekę urllib. Oba są popularnymi i łatwiejszymi alternatywami dla pycURL.

#2. Inne języki

cURL ma interfejsy zaimplementowane w innych językach. Popularną witryną do konwersji witryn cURL jest Curl Converter. Za pomocą konwertera cURL piszesz polecenie cURL dla żądania, które chcesz złożyć, a ono automatycznie konwertuje twoje polecenie na dowolny wybrany język programowania. Możesz także po prostu wywołać polecenie cURL bezpośrednio w swoim terminalu lub napisać skrypt Bash.

Wniosek

W tym artykule przedstawiłem cURL i wyjaśniłem, jak używać go w Pythonie za pomocą modułu PycURL. Omówiliśmy również alternatywy dla PycURL, takie jak moduł żądań i używanie różnych języków w programach.

Następnie sprawdź użycie polecenia cURL z przykładami w czasie rzeczywistym.