Jak wykonać żądania HTTP z Python - Część 2 - Biblioteka żądań
- 1624
- 172
- Pani Janina Cieśla
W poprzednim artykule widzieliśmy, jak wykonać podstawowe żądania HTTP za pomocą standardowej biblioteki Python3. Kiedy prośby stają się bardziej złożone lub po prostu chcemy użyć mniej kodu, a my nie mamy nic przeciwko dodaniu zależności do naszego projektu, jest możliwe (a czasem nawet zalecane) używanie zewnętrznego upraszanie
moduł. Biblioteka, która przyjęła motto „HTTP dla ludzi”, będzie przedmiotem tego artykułu.
W tym samouczku nauczysz się:
- Jak wykonywać żądania HTTP z Python3 i biblioteką „żądań”
- Jak zarządzać odpowiedziami serwerów
- Jak pracować z sesjami
Prośby HTTP z Python - PT. II: Biblioteka żądań
Zastosowane wymagania i konwencje oprogramowania
Kategoria | Wymagania, konwencje lub wersja oprogramowania |
---|---|
System | Niezależny od OS |
Oprogramowanie | Python3 i biblioteka „żądań” |
Inny | Znajomość podstawowych pojęć programowania obiektowego i Pythona |
Konwencje | # - Wymaga, aby podane polecenia Linux są wykonywane z uprawnieniami root bezpośrednio jako użytkownik root lub za pomocą sudo Komenda$ - Wymaga, aby podane polecenia Linux zostały wykonane jako zwykły użytkownik niepewny |
Wykonanie żądań w bibliotece „żądań”
W pierwszej części tej serii przeprowadziliśmy podstawowe żądania HTTP za pomocą tylko standardowej biblioteki. Gdy prośby stają się bardziej złożone, na przykład, gdy musimy zachować pliki cookie między jednym żądaniem a drugim, możemy użyć upraszanie
Biblioteka zewnętrzna, która upraszcza naszą pracę, wykonując dla nas wiele operacji pod maską. Ponieważ biblioteka nie jest zawarta w domyślnej instalacji Python3, musimy ją zainstalować w naszym systemie, zanim będziemy mogli jej użyć. Niezależną od rozkładu metodą wykonania zadania jest użycie pypeć
, Menedżer pakietów Python:
$ PIP3 Instaluj żądania -Użytkownik
Teraz, gdy zainstalowaliśmy bibliotekę, zobaczmy kilka przykładów, jak z niej korzystać.
Wykonanie żądania GET
Pamiętaj o prośbie, które złożyliśmy za pomocą interfejsów API NASA, aby odzyskać „obraz dnia” dla określonej daty? Budowanie i wysyłanie tego samego żądania z upraszanie
Biblioteka wymaga tylko jednego wiersza kodu:
>>> Importuj żądania >>> odpowiedź = żądania.Get ("https: // API.NASA.Gov/Planetary/apod ", params = „ api_key ”:„ demo_key ”,„ data ”:„ 2019-04-11 ”)
Kopiuj Przeszliśmy odpowiednio parametry adresu URL i zapytania (wciąż jako słownik) jako pierwszy i drugi argument Dostawać
funkcjonować. Co zwraca ta funkcja? Zwraca instancję upraszanie.modele.Odpowiedź
klasa. Interakcja z instancjami tej klasy jest bardzo łatwa. Czy chcemy odzyskać zawartość kodowanej JSON odpowiedzi? Łatwy! Musimy tylko zadzwonić JSON
Metoda obiektu:
>>> Odpowiedź.JSON () „data”: „2019-04-11”, „Objaśnienie”: „Jak wygląda czarna dziura? Aby dowiedzieć się, radiowe teleskopy z całej Ziemi skoordynowały obserwacje „czarnych dziur z największymi znanymi horyzontami wydarzeń na” ... „Bezpośrednia okolica czarnej dziury pośrodku naszej„ Mlecznej Galaktyki drogi.', „hdurl”:' https: // apod.NASA.Gov/apod/image/1904/m87BH_EHT_2629.jpg ', „media_type”: „image”, „service_version”: „v1”, „tytuł”: „Pierwszy obraz w skali horyzontu czarnej dziury”, „url”: „https: // apod.NASA.Gov/apod/image/1904/m87BH_EHT_960.jpg '
Kopiuj Czy chcemy uzyskać odpowiedź serwera jako ciąg? Wszystko, co musimy zrobić, to uzyskać dostęp do tekst
nieruchomość:
odpowiedź.tekst
W ten sam sposób możemy uzyskać dostęp do powód
, Kod statusu
I nagłówki
żądania. Musimy tylko uzyskać dostęp do odpowiednich właściwości:
>>> Odpowiedź.powód „OK” >>> Odpowiedź.Status_code 200 >>> Odpowiedź.Nagłówki „serwer”: „OpenResty”, „data”: „czw, 18 kwietnia 2019 10:46:26 Gmt”, „Content-Type”: „Application/Json”, „Transfer-incoding”: „Chunked”, „Connection”: „Keep-Alive”, „Vary”: „Accept-Encoding”, „X-Ratelimit-Limit”: „40”, „X-Ratelimit-Remining”: „39”, „via”: „1 1.1 Vegur, HTTP/1.1 API-UMBRELLA (APACHETRAFFICSERVER [CMSSF]) ”,„ Age ”:„ 0 ”,„ X-Cache ”:„ Miss ”,„ Access-Control-Aligin ”:„*”,„ Strict-Transport-Security Burity „:” Max-Age = 31536000; wstępne ładowanie ”,„ Content-Incoding ”:„ gzip ”
Kopiuj Pobieranie pliku
Pobieranie pliku jest również bardzo łatwe. Przede wszystkim musimy użyć strumień
parametr Dostawać
funkcjonować. Domyślnie ten parametr jest ustawiony na FAŁSZ
, A to oznacza, że ciało odpowiedzi zostanie pobrane jednocześnie. Ponieważ możemy chcieć pobrać duży plik, chcemy go ustawić PRAWDA
: W ten sposób tylko nagłówki odpowiedzi zostaną natychmiast pobrane, a połączenie pozostanie otwarte, abyśmy mogli dalej je przetworzyć, jak chcemy:
>>> najnowszy_kernel_tarball = "https: // cdn.jądro.org/pub/linux/jądro/v5.X/Linux-5.0.7.smoła.xz ">>> z żądaniami.get (najnowszy_kernel_tarball, strumień = true) jako odpowiedź: ... z otwartym („najnowszy kernel.smoła.XZ ",„ WB ”) jako Tarball: ... W odpowiedzi w odpowiedzi.ITER_CONTENT (16384): ... Tarball.Napisz (kawałek)
Kopiuj Kod jest podobny do standardowego odpowiednika biblioteki: Zmieniona jest użycie ITER_CONTENT
Metoda obiektu odpowiedzi. W poprzednim przykładzie działaliśmy w pewnym czasie pętli, którą przerywaliśmy tylko wtedy, gdy treść odpowiedzi została zużyta. Korzystając z tej metody, możemy napisać do pliku docelowego w bardziej elegancki sposób, ponieważ możemy iterować treść odpowiedzi. ITER_CONTENT
Metoda akceptuje opcjonalny argument Chunk_Size
, jakiś liczba całkowita
wskazując rozmiar porcji w bajtach (dane do odczytu w pamięci przy każdej iteracji).
Wysyłanie danych lub JSON na żądanie
Wysyłanie danych zakodowanych przez formę (na przykład w żądaniu pocztowym) z biblioteką „żądania” wymaga mniejszego kodu niż ta sama operacja wykonywana tylko przy użyciu standardowej biblioteki:
>>> request_data = ... „zmienna1”: „wartość1”, ... „Zmienna2”: „wartość2” ... >>> odpowiedź = żądania.post („https: // httpbin.org/post ", data = request_data)
Kopiuj Aby przekazać te same dane, ale jako JSON:
Odpowiedź = żądania.post („https: // httpbin.org/post ", json = request_data)
Za pomocą JSON
Parametr funkcji, nie musimy nawet martwić się o kodowanie łańcucha za pomocą JSON.depresja
: Zostanie to zrobione do użytku pod maską.
Przesyłanie pliku
Przesłanie pliku za pomocą standardowej biblioteki może być bardzo żmudnym zadaniem, ale bardzo łatwo jest używać upraszanie
biblioteka. Powiedzmy, że chcemy przesłać zdjęcie:
>>> Odpowiedź = żądania.post( ... „https: // httpbin.org/post ", pliki = 'plik': Open ('NASA_BLACK_HOLE.png ', „rb”))
Kopiuj Imponująco krótki kod! Wykonaliśmy post
żądanie, tym razem za pomocą akta
argument. Argument ten musi być słownikiem, w którym kluczem jest pole „nazwa”, a wartość jest obiektem pliku, w tym przypadku zwróconym przez otwarty
funkcjonować.
A co z innymi czasownikami HTTP? Każdy z nich jest używany z odpowiednio nazwaną funkcją: umieścić
, usuwać
, głowa
Lub opcje
. Wszystkie z nich mogą być używane z zasadniczo tym samym interfejsem, co te, które widzieliśmy wcześniej.
Praca z sesjami
upraszanie
Biblioteka pozwala nam korzystać sesje
: Gdy prośby są wysyłane z kontekstu sesji, pliki cookie są zachowane między jednym żądaniem a drugim. Jest to zalecany sposób wykonywania wielu żądań do tego samego hosta, ponieważ nawet to samo TCP
Połączenie zostanie ponownie wykorzystane. Zobaczmy, jak utworzyć sesję i wyślij z nią żądanie:
>>> session = żądania.Session () >>> response = session.get ("https: // httpbin.org/pliki cookie/zestaw?LastName = Skywalker ”)
Kopiuj Stworzyliśmy instancję upraszanie.Sesja
klasa i zamiast samodzielnie uruchamiać żądanie, tak jak w poprzednich przykładach, zastosowaliśmy metodę nazwaną na cześć czasownika HTTP (Dostawać
w takim przypadku), który jest używany w ten sam sposób. W żądaniu URL tym razem był http: // httpbin.org/pliki cookie/set, punkt końcowy, który pozwala nam ustawić parametry plików cookie, które wysyłamy w ciągu zapytania. Połączenie, które wykonaliśmy, ustawiliśmy plik cookie, który jest teraz przechowywany w sesji i będzie używany we wszystkich żądaniach wysyłanych z sesja
kontekst. Aby wymienić wszystkie pliki cookie powiązane z sesją, aby uzyskać dostęp do ciasteczka
właściwość, która jest instancją upraszanie.ciasteczka.PoprośSCookiejar '
klasa:
>>> sesja.ciasteczka >>> # Uzyskaj dostęp do kluczy ciastek ...sesja.ciasteczka.keys () ['lastName'] >>> >>> # Uzyskaj dostęp do wartości plików cookie ...sesja.ciasteczka.wartości () [„Skywalker”] >>> >>> # Metoda iterkeys zwraca iterator nazw plików cookie ...sesja.ciasteczka.iterkeys () >>> # Metoda iTervalues robi to samo, ale dla wartości ...sesja.ciasteczka.iTervalues ()
Kopiuj Aby wyczyścić przechowywane pliki cookie w sesji, możemy użyć jasne
metoda:
>>> sesja.ciasteczka.clear () >>> sesja.ciasteczka
Kopiuj Utwórz obiekt żądania
Do tej pory po prostu używaliśmy funkcji takich jak Dostawać
, post
Lub umieścić
które w zasadzie tworzą i wysyłają żądania „w locie”. Są przypadki, w których chcemy zbudować Wniosek
obiekt, ale nie chcemy go wysyłać natychmiast. Oto jak możemy to zrobić:
>>> żądania = żądania.Żądanie („get”, „https: // httpbin.org/get ”)
Pierwszy argument Wniosek
Konstruktor to czasownik, którego chcemy użyć, a drugi, docelowy adres URL. Można użyć tych samych parametrów, których używamy, gdy wysyłamy żądanie: nagłówki
, Params
, dane
, JSON
I akta
. Po utworzeniu Wniosek
Musimy go „przygotować”, zanim będziemy mogli go wysłać:
>>> session = żądania.Session () >>> żądanie = żądania.Żądanie („get”, „https: // httpbin.org/get ") >>> sesja przygotowana_request = sesja.PREPED_REQUEST (żądanie) >>> response = sesja.Wyślij (przygotowany_request)
Kopiuj Moglibyśmy również przygotować Wniosek
używając przygotowywać
Metoda Wniosek
obiekt sam, zamiast dzwonić sesja.Przygotuj_request
, Ale w tym przypadku wniosek straciłaby zalety bycia częścią sesji.
Podnieś wyjątek, gdy kod stanu odpowiedzi nie ma 200
Kod stanu zwrócony przez serwer, gdy żądanie się powiedzie, jest 200
. Kiedy wystąpił jakiś błąd, na przykład, gdy zasób nie zostanie znaleziony lub gdy nie jesteśmy upoważnieni do dostępu, inne kody są zwracane (odpowiednio w tym przypadku 404 i 403). Kiedy to się stanie i chcemy, aby nasz kod podniósł wyjątek, musimy zadzwonić Raise_for_status
Metoda upraszanie.modele.Odpowiedź
obiekt. Zobaczmy, jak kod zachowuje się inaczej, gdy go używamy. Wysyłamy żądanie pocztowe do punktu końcowego, który akceptuje tylko czasownik GET:
>>> Odpowiedź = żądania.Post ('https: // httpbin.org/get ') >>> odpowiedź.Status_code 405 >>> Odpowiedź.powód „Metoda niedozwolona”
Kopiuj Zgodnie z oczekiwaniami, ponieważ użyliśmy niewłaściwego czasownika HTTP, kod stanu odpowiedzi był 405
, a odpowiedni „powód” jest NIEDOZWOLONA METODA
, Jednak nie został podniesiony żaden wyjątek. Aby zła prośba podniosła wyjątek
Musimy zadzwonić Raise_for_status
Metoda po wysłaniu żądania:
>>> Odpowiedź = żądania.Post ('https: // httpbin.org/get ') >>> odpowiedź.Raise_for_status () Traceback (najnowsze połączenie ostatnie): File „”, wiersz 1, w pliku ”/usr/lib/Python3.7/pakiety/żądania/modele.py ", wiersz 940, w Raise_For_status Raise Httperror (http_error_msg, response = self) żądania.wyjątki.Httperror: 405 Błąd klienta: Metoda niedozwolona dla URL: https: // httpbin.org/get
Kopiuj Odkąd zadzwoniliśmy Raise_for_status
, Tym razem prośba o podniesienie upraszanie.wyjątki.Błąd HTTP
wyjątek.
Wnioski
W tym artykule, drugi z serii o wykonywaniu żądania HTTP z Pythonem, skupiliśmy się
o użyciu zewnętrznego upraszanie
Biblioteka, która pozwala nam wykonywać zarówno proste, jak i złożone żądania
w kilku wierszach kodu. Chcesz dowiedzieć się o tym więcej? Oficjalna dokumentacja jest tylko jednym kliknięciem!
Powiązane samouczki Linux:
- Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
- Jak skonfigurować serwer OpenVPN na Ubuntu 20.04
- Mastering Bash Script Loops
- Jak pracować z WooCommerce Rest API z Pythonem
- Rzeczy do zainstalowania na Ubuntu 20.04
- Mint 20: Lepsze niż Ubuntu i Microsoft Windows?
- Zagnieżdżone pętle w skryptach Bash
- Jak zbudować aplikację Tkinter za pomocą obiektu zorientowanego na…
- Hung Linux System? Jak uciec do wiersza poleceń i…
- Jak uruchomić procesy zewnętrzne z Pythonem i…
- « Jak wykonywać żądania HTTP z Python - Część 1 Standardowa biblioteka
- Jak wykonać prośby HTTP z Pythonem »