pl
English
Español
中國人
Tiếng Việt
Deutsch
Українська
Português
Français
भारतीय
Türkçe
한국인
Italiano
Gaeilge
اردو
Indonesia 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.
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"
Aby korzystać z cURL, należy zainstalować bibliotekę Python PycURL.
Instalacja:
pip install 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'))
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'))
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 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 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.
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
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'))
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.
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