W Pythonie, jakie są różnice między tymi urllib
, urllib2
, urllib3
oraz requests
modułów? Dlaczego są trzy? Wydają się robić to samo ...
python
python-requests
urllib2
urllib
python-2.x
Paul Biggar
źródło
źródło
requests
większość czasu. czasamiurllib2
działa, ale wymaga więcej kodu i jest mniej elegancki. nie używajurllib
.urllib
w Pythonie 3 jest jeszcze jedna opcja, oczyszczona na różne sposoby. Ale na szczęście oficjalna dokumentacja zauważa również, że „ Pakiet żądań jest zalecany dla interfejsu klienta HTTP wyższego poziomu ” w wersji 21.6. urllib.request - Rozszerzalna biblioteka do otwierania adresów URL - Dokumentacja Python 3.6.3Odpowiedzi:
Wiem, że zostało już powiedziane, ale bardzo polecam
requests
pakiet Python.Jeśli używasz języków innych niż python, prawdopodobnie myślisz
urllib
iurllib2
są łatwe w użyciu, nie mają dużo kodu i są bardzo zdolne, tak myślałem. Alerequests
pakiet jest tak niewiarygodnie przydatny i krótki, że wszyscy powinni go używać.Po pierwsze, obsługuje w pełni spokojny interfejs API i jest tak łatwy jak:
Bez względu na to, czy GET / POST, nigdy nie musisz ponownie kodować parametrów, wystarczy wziąć słownik jako argument i dobrze jest przejść:
Ponadto ma nawet wbudowany dekoder JSON (znowu wiem, że
json.loads()
nie ma nic więcej do napisania, ale z pewnością jest to wygodne):Lub jeśli dane odpowiedzi to tylko tekst, użyj:
To tylko wierzchołek góry lodowej. Oto lista funkcji z witryny z żądaniami:
źródło
urllib
a jej dokumentacja oficjalnie zauważa również, że „ Pakiet żądań jest zalecany dla interfejsu klienta HTTP wyższego poziomu ” w wersji 21.6. urllib.request - Rozszerzalna biblioteka do otwierania adresów URL - dokumentacja Python 3.6.3 , iurllib3
jest to świetna biblioteka używana przezrequests
.urllib.parse()
urllib2 zapewnia dodatkową funkcjonalność, a mianowicie
urlopen()
funkcja może pozwolić ci na określenie nagłówków (normalnie musiałeś używać httplib w przeszłości, co jest znacznie bardziej szczegółowe). Co ważniejsze, urllib2 zapewniaRequest
klasę, która pozwala na więcej deklaratywne podejście do robienia zapytania:Pamiętaj, że
urlencode()
jest tylko w urllib, a nie urllib2.Istnieją również procedury obsługi bardziej zaawansowanej obsługi adresów URL w urllib2. Krótka odpowiedź brzmi: chyba że pracujesz ze starszym kodem, prawdopodobnie chcesz użyć otwieracza URL z urllib2, ale nadal musisz zaimportować do urllib dla niektórych funkcji narzędziowych.
Dodatkowa odpowiedź Dzięki Google App Engine możesz używać dowolnego z httplib, urllib lub urllib2, ale wszystkie z nich są tylko opakowaniami interfejsu API pobierania URL Google. Oznacza to, że nadal podlegasz tym samym ograniczeniom, takim jak porty, protokoły i dozwolona długość odpowiedzi. Możesz jednak korzystać z rdzenia bibliotek tak, jak można by oczekiwać przy pobieraniu adresów URL HTTP.
źródło
urlopen()
iRequest
z urllib2 , i używaszurlencode()
z urllib . Bez realnej szkody w korzystaniu z obu bibliotek, o ile upewnisz się, że korzystasz z właściwego urlopu. [Dokumenty urllib] [1] jasno mówią, że używanie tego jest zgodne z przeznaczeniem. [1]: docs.python.org/library/urllib2.html#urllib2.urlopenurllib2.urlopen
; zawiera również inne odmiany.requests
zezwól również na niestandardowe nagłówki: docs.python-requests.org/en/master/user/quickstart/…urllib i urllib2 to moduły Pythona, które wykonują czynności związane z żądaniami adresów URL, ale oferują różne funkcje.
1) urllib2 może zaakceptować obiekt Request w celu ustawienia nagłówków żądania URL, urllib akceptuje tylko adres URL.
2) urllib zapewnia metodę urlencode , która jest używana do generowania ciągów zapytań GET, urllib2 nie ma takiej funkcji. Jest to jeden z powodów, dla których urllib jest często używany wraz z urllib2.
Requests - Requests 'to prosta, łatwa w użyciu biblioteka HTTP napisana w języku Python.
1) Żądania w Pythonie automatycznie kodują parametry, więc przekazujesz je jako proste argumenty, inaczej niż w przypadku urllib, gdzie musisz użyć metody urllib.encode () do zakodowania parametrów przed ich przekazaniem.
2) Automatycznie dekodował odpowiedź do Unicode.
3) Żądania mają również znacznie wygodniejszą obsługę błędów. Jeśli uwierzytelnienie się nie powiedzie, urllib2 podniósłby błąd urllib2.URLEr, podczas gdy żądania zwróciły normalny obiekt odpowiedzi, zgodnie z oczekiwaniami. Wszystko, co musisz zobaczyć, czy żądanie zakończyło się pomyślnie przez boolean response.ok
źródło
Jedną znaczącą różnicą jest przenoszenie Python2 na Python3. urllib2 nie istnieje dla Python3 i jego metod przeniesionych do urllib. Więc używasz tego intensywnie i chcesz migrować do Python3 w przyszłości, rozważ użycie urllib. Jednak narzędzie 2to3 automatycznie wykona większość pracy za Ciebie.
źródło
Aby dodać do istniejących odpowiedzi, nie widzę, aby ktokolwiek wspomniał, że żądania Pythona nie są biblioteką natywną. Jeśli nie masz nic przeciwko dodawaniu zależności, żądania są w porządku. Jednak jeśli próbujesz uniknąć dodawania zależności, urllib jest rodzimą biblioteką Pythona, która jest już dostępna.
źródło
Podoba mi się
urllib.urlencode
funkcja i wydaje się, że nie istniejeurllib2
.źródło
urllib
w Pythonie 3 jest jeszcze jedna opcja, oczyszczona na różne sposoby. Ale na szczęście oficjalna dokumentacja zauważa również, że „ Pakiet żądań jest zalecany dla interfejsu klienta HTTP wyższego poziomu ” w wersji 21.6. urllib.request - Rozszerzalna biblioteka do otwierania adresów URL - Dokumentacja Python 3.6.3Aby uzyskać treść adresu URL:
Trudno jest napisać w odpowiedziach Python2 i Python3 oraz
request
kod zależności, ponieważurlopen()
funkcje irequests.get()
funkcje zwracają różne typy:urllib.request.urlopen()
zwraca ahttp.client.HTTPResponse
urllib.urlopen(url)
zwraca aninstance
request.get(url)
zwraca arequests.models.Response
źródło
Zasadniczo powinieneś używać urllib2, ponieważ czasami jest to nieco łatwiejsze, akceptując obiekty Request, a także podniesie wyjątek URLException na temat błędów protokołu. Jednak w Google App Engine nie można używać żadnego z nich. Musisz użyć interfejsu API pobierania adresu URL udostępnianego przez Google w środowisku piaskownicy w języku Python.
źródło
Kluczowym punktem, którego brakuje mi w powyższych odpowiedziach, jest to, że urllib zwraca obiekt typu
<class http.client.HTTPResponse>
podczas gdyrequests
zwraca<class 'requests.models.Response'>
.Z tego powodu metoda read () może być używana z,
urllib
ale nie zrequests
.PS:
requests
jest już bogaty w tak wiele metod, że prawie nie potrzebuje jeszcze jednejread()
;źródło