Przewodnik po korzystaniu z cURL w Pythonie

Komentarze: 0

Web scraping obejmuje wyodrębnianie danych ze stron internetowych w celu analizy, badań lub automatyzacji. W tym samouczku cURL Python dowiesz się, jak wykonywać żądania internetowe za pomocą PycURL z praktycznymi przykładami. Pokażemy również, jak przekonwertować typowe żądanie curl do Pythona i porównać je z bibliotekami takimi jak Requests, HTTPX i AIOHTTP.

Jak używać polecenia cURL w Pythonie

Zrozumienie tej koncepcji jest kluczowe dla integracji Pythona, więc zacznijmy od podstaw. Możesz używać poleceń cURL Pythona bezpośrednio w terminalu, aby wykonywać zadania, takie jak wysyłanie żądań GET i POST.

Przykładowe polecenia cURL:

# Żądanie GET
curl -X GET "https://httpbin.org/get"

# Żądanie POST
curl -X POST "https://httpbin.org/post"

1.png

2.png

Instalowanie wymaganych bibliotek

Aby korzystać z cURL, należy zainstalować bibliotekę Python PycURL.

Instalacja:

pip install pycurl

Wykonywanie żądań HTTP za pomocą PycURL

Używanie curl w Pythonie oferuje szczegółową kontrolę nad żądaniami HTTP. Poniżej znajduje się przykład pokazujący, jak wykonać żądanie GET za pomocą PycURL:

import pycurl
import certifi
from io import BytesIO

# Utwórz obiekt BytesIO do przechowywania danych odpowiedzi
buffer = BytesIO()

# Inicjalizacja obiektu cURL
c = pycurl.Curl()

# Ustawienie adresu URL dla żądania HTTP GET
c.setopt(c.URL, 'https://httpbin.org/get')

# Ustawienie bufora do przechwytywania danych wyjściowych
c.setopt(c.WRITEDATA, buffer)

# Ustaw ścieżkę do pliku pakietu CA dla weryfikacji SSL/TLS
c.setopt(c.CAINFO, certifi.where())

# Wykonanie żądania HTTP
c.perform()

# Zamknięcie obiektu cURL w celu zwolnienia zasobów
c.close()

# Pobranie zawartości odpowiedzi z bufora
body = buffer.getvalue()

# Dekodowanie i drukowanie treści odpowiedzi
print(body.decode('iso-8859-1'))

Obsługa żądań POST

Wysyłanie danych za pomocą POST - curl do żądań Pythona - jest powszechne. W bibliotece należy użyć opcji POSTFIELDS. Oto przykład wykonania żądania POST za pomocą PycURL:

import pycurl
import certifi
from io import BytesIO

# Utwórz obiekt BytesIO do przechowywania danych odpowiedzi
buffer = BytesIO()

# Inicjalizacja obiektu cURL
c = pycurl.Curl()

# Ustawienie adresu URL dla żądania HTTP POST
c.setopt(c.URL, 'https://httpbin.org/post')

# Ustawienie danych do opublikowania
post_data = 'param1="pycurl"¶m2=article'
c.setopt(c.POSTFIELDS, post_data)

# Ustawienie bufora do przechwytywania danych wyjściowych
c.setopt(c.WRITEDATA, buffer)

# Ustaw ścieżkę do pliku pakietu CA dla weryfikacji SSL/TLS
c.setopt(c.CAINFO, certifi.where())

# Wykonanie żądania HTTP
c.perform()

# Zamknięcie obiektu cURL w celu zwolnienia zasobów
c.close()

# Pobranie zawartości odpowiedzi z bufora
body = buffer.getvalue()

# Dekodowanie i drukowanie treści odpowiedzi
print(body.decode('iso-8859-1'))

Obsługa niestandardowych nagłówków HTTP

Niestandardowe nagłówki lub uwierzytelnianie są często wymagane w przypadku żądań HTTP. Obsługa niestandardowych nagłówków: Żądania HTTP często wymagają tokenów uwierzytelniających lub niestandardowych nagłówków. Obsługa niestandardowych nagłówków może być wykonana wydajnie, jeśli wiesz, jak korzystać z technik parsowania Python curl json:

import pycurl
import certifi
from io import BytesIO

# Utwórz obiekt BytesIO do przechowywania danych odpowiedzi
buffer = BytesIO()

# Inicjalizacja obiektu cURL
c = pycurl.Curl()

# Ustawienie adresu URL dla żądania HTTP GET
c.setopt(c.URL, 'https://httpbin.org/get')

# Ustawianie niestandardowych nagłówków HTTP
c.setopt(c.HTTPHEADER, ['User-Agent: MyApp', 'Accept: application/json'])

# Ustawienie bufora do przechwytywania danych wyjściowych
c.setopt(c.WRITEDATA, buffer)

# Ustaw ścieżkę do pliku pakietu CA dla weryfikacji SSL/TLS
c.setopt(c.CAINFO, certifi.where())

# Wykonanie żądania HTTP
c.perform()

# Zamknięcie obiektu cURL w celu zwolnienia zasobów
c.close()

# Pobranie zawartości odpowiedzi z bufora
body = buffer.getvalue()

# Dekodowanie i drukowanie treści odpowiedzi
print(body.decode('iso-8859-1'))

Obsługa odpowiedzi XML

Obsługa odpowiedzi XML Podczas pracy z parsowaniem XML i obsługą różnych interfejsów API, niezbędna jest obsługa odpowiedzi XML. Poniżej znajduje się przykład obsługi odpowiedzi XML za pomocą PycURL:

# Zaimportuj niezbędne biblioteki
import pycurl  # Biblioteka do wykonywania żądań HTTP
import certifi  # Biblioteka do weryfikacji certyfikatów SSL
from io import BytesIO  # Biblioteka do obsługi strumieni bajtów
import xml.etree.ElementTree as ET  # Biblioteka do parsowania XML

# Utworzenie bufora do przechowywania danych odpowiedzi
buffer = BytesIO()

# Inicjalizacja obiektu cURL
c = pycurl.Curl()

# Ustawienie adresu URL dla żądania HTTP GET
c.setopt(c.URL, 'https://www.google.com/sitemap.xml')

# Ustawienie bufora do przechwytywania danych wyjściowych
c.setopt(c.WRITEDATA, buffer)

# Ustaw ścieżkę do pliku pakietu CA dla weryfikacji SSL/TLS
c.setopt(c.CAINFO, certifi.where())

# Wykonanie żądania HTTP
c.perform()

# Zamknięcie obiektu cURL w celu zwolnienia zasobów
c.close()

# Pobranie zawartości odpowiedzi z bufora
body = buffer.getvalue()

# Parsowanie zawartości XML do obiektu ElementTree
root = ET.fromstring(body.decode('utf-8'))

# Drukuje znacznik i atrybuty głównego elementu drzewa XML
print(root.tag, root.attrib)

Obsługa błędów HTTP

Obsługa błędów dla żądań HTTP jest ważnym aspektem pracy z zewnętrznymi integracjami. Oto przykład obsługi błędów przy użyciu PyCURL:

import pycurl  # Zaimportuj bibliotekę pycurl
import certifi  # Zaimportuj bibliotekę certyfikatów
from io import BytesIO  # Import BytesIO do obsługi strumieni bajtów

# Inicjalizacja obiektu Curl
c = pycurl.Curl()

buffer = BytesIO()
# Ustawienie adresu URL dla żądania HTTP
c.setopt(c.URL, 'http://example.com')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())

try:
    # Wykonanie żądania HTTP
    c.perform()
except pycurl.error as e:
    # Jeśli podczas żądania wystąpi błąd, należy przechwycić wyjątek pycurl.error
    errno, errstr = e.args  # Pobranie numeru błędu i komunikatu o błędzie
    print(f'Error: {errstr} (errno {errno})')  # Drukowanie komunikatu o błędzie i numeru błędu
finally:
    # Zamknięcie obiektu Curl w celu zwolnienia zasobów
    c.close()
    body = buffer.getvalue()
    print(body.decode('iso-8859-1'))  # Dekodowanie i drukowanie treści odpowiedzi

Poprawiony kod dostosowuje adres URL do https://example.com, rozwiązując problem z protokołem. Następnie autor powtarza te same kroki konfigurowania żądania, wykonywania go i obsługi błędów, jak w pierwszym fragmencie. Po pomyślnym wykonaniu treść odpowiedzi jest ponownie dekodowana i drukowana. Podkreśla to znaczenie prawidłowego konstruowania adresów URL, utrzymywania prawidłowego przepływu żądań, a przede wszystkim wdrażania solidnej obsługi błędów podczas wykonywania żądań HTTP za pomocą PycURL.

3.png

import pycurl  # Zaimportuj bibliotekę pycurl
import certifi  # Zaimportuj bibliotekę certyfikatów
from io import BytesIO  # Import BytesIO do obsługi strumieni bajtów

# Ponowna inicjalizacja obiektu Curl
c = pycurl.Curl()

buffer = BytesIO()
# Popraw adres URL, aby korzystał z protokołu HTTPS
c.setopt(c.URL, 'https://example.com')
c.setopt(c.WRITEDATA, buffer)
c.setopt(c.CAINFO, certifi.where())

try:
    # Wykonanie poprawionego żądania HTTP
    c.perform()
except pycurl.error as e:
    # Jeśli podczas żądania wystąpi błąd, należy przechwycić wyjątek pycurl.error
    errno, errstr = e.args  # Pobranie numeru błędu i komunikatu o błędzie
    print(f'Error: {errstr} (errno {errno})')  # Drukowanie komunikatu o błędzie i numeru błędu
finally:
    # Zamknięcie obiektu Curl w celu zwolnienia zasobów
    c.close()
    body = buffer.getvalue()
    print(body.decode('iso-8859-1'))  # Dekodowanie i drukowanie treści odpowiedzi

Zaawansowane funkcje cURL

Podczas pracy z konwersjami żądań cURL w Pythonie warto wiedzieć, że cURL oferuje wiele zaawansowanych opcji kontrolowania zachowania HTTP, takich jak obsługa plików cookie i limitów czasu. Poniżej znajduje się przykład demonstrujący zaawansowane opcje uruchamiania poleceń curl w Pythonie.

import pycurl  # Zaimportuj bibliotekę pycurl
import certifi  # Zaimportuj bibliotekę certifi w celu weryfikacji certyfikatu SSL
from io import BytesIO  # Import BytesIO do obsługi strumieni bajtów

# Utworzenie bufora do przechowywania danych odpowiedzi
buffer = BytesIO()

# Inicjalizacja obiektu Curl
c = pycurl.Curl()

# Ustawienie adresu URL dla żądania HTTP
c.setopt(c.URL, 'http://httpbin.org/cookies')

# Włączenie plików cookie poprzez ustawienie określonej pary klucz-wartość
c.setopt(c.COOKIE, 'cookies_key=cookie_value')

# Ustaw limit czasu 30 sekund dla żądania
c.setopt(c.TIMEOUT, 30)

# Ustawienie bufora do przechwytywania danych wyjściowych
c.setopt(c.WRITEDATA, buffer)

# Ustaw ścieżkę do pliku pakietu CA dla weryfikacji SSL/TLS
c.setopt(c.CAINFO, certifi.where())

# Wykonanie żądania HTTP
c.perform()

# Zamknięcie obiektu Curl w celu zwolnienia zasobów
c.close()

# Pobranie zawartości odpowiedzi z bufora
body = buffer.getvalue()

# Dekoduje treść odpowiedzi przy użyciu kodowania UTF-8 i drukuje ją
print(body.decode('utf-8'))

Porównanie PycURL, Requests, HTTPX i AIOHTTP

Cztery biblioteki są popularne podczas pracy w Pythonie z żądaniami HTTP: PyCurl, Requests, HTTPX i AIOHTTP. Każda z nich ma swoje mocne i słabe strony. Oto porównanie, które pomoże ci wybrać narzędzie odpowiednie do twoich potrzeb:

Cecha PycURL Żądania HTTPX AIOHTTP
Łatwość użytkowania Umiarkowany Bardzo łatwe Łatwy Umiarkowany
Wydajność Wysoki Umiarkowany Wysoki Wysoki
Obsługa asynchroniczna Nie Nie Tak Tak
Streaming Tak Ograniczony Tak Tak
Obsługa protokołów Rozbudowany (obsługuje wiele protokołów) HTTP/HTTPS HTTP/HTTPS, HTTP/2, WebSockets HTTP/HTTPS, WebSockets

Zaawansowani użytkownicy docenią niestandardowe elementy sterujące oferowane za pomocą poleceń HTTP; przekonają się, że PycURL przekracza oczekiwania pod względem wydajności. Z drugiej strony, Requests i HTTPX lepiej nadają się do prostszych, bardziej intuicyjnych scenariuszy. AIOHTTP wyróżnia się w obsłudze zadań asynchronicznych, zapewniając skuteczne narzędzia do zarządzania żądaniami asynchronicznymi.

Jak widać, wybór może zależeć od zakresu projektu - elastyczność kontra szybkość. W zaawansowanych kontekstach PycURL wyróżnia się jako preferowany, jeśli nie jedyny, wybór.

Wnioski

Jeśli wydajność i niskopoziomowa kontrola są priorytetami podczas wykonywania żądań HTTP, PycURL jest solidną opcją. Nauka korzystania z cURL w Pythonie może nie być najbardziej przyjazną ścieżką dla początkujących, ale odblokowuje potężne możliwości, które często ukrywają bardziej abstrakcyjne biblioteki. Od skrobania stron internetowych i obsługi XML po zarządzanie niestandardowymi nagłówkami i plikami cookie, PycURL obsługuje to wszystko z precyzją. Jednak w przypadku prostszych zadań, asynchronicznych przepływów pracy lub łatwości użytkowania, biblioteki takie jak Requests, HTTPX i AIOHTTP mogą być bardziej odpowiednie.

Komentarze:

0 komentarze