Kokie yra skirtumai tarp urllib modulio, urllib2 ir užklausų?

Kokie yra „Python“ skirtumai tarp urllib , urllib2 ir requests modulių? Kodėl iš jų yra trys? Atrodo, kad jie daro tą patį ...

566
07 янв. nustatė Paul Biggar 07 Jan 2010-01-07 06:26 '10, 6:26 val. 2010-01-07 06:26
@ 10 atsakymų

Žinau, kad tai jau buvo pasakyta, bet labai rekomenduoju paketo „Python“ paketą: http://docs.python-requests.org/en/latest/index.html

Jei naudojote kitas kalbas nei „python“, tikriausiai manote, kad „urllib“ ir „urllib2“ yra paprasta naudoti, ne daug kodų ir labai gebančių, kaip maniau anksčiau. Tačiau prašymų partija yra tokia neįtikėtinai naudinga ir trumpa, kad kiekvienas turėtų jį naudoti.

Pirma, ji palaiko visiškai ramią API ir yra tokia pat paprasta:

 import requests ... resp = requests.get('http://www.mywebsite.com/user') resp = requests.post('http://www.mywebsite.com/user') resp = requests.put('http://www.mywebsite.com/user/put') resp = requests.delete('http://www.mywebsite.com/user/delete') 

Nepriklausomai nuo to, ar jums niekada nereikės pakartotinai koduoti GET / POST parametrų, jis paprasčiausiai priima žodyną kaip argumentą ir veikia gerai.

 userdata = {"firstname": "John", "lastname": "Doe", "password": "jdoe123"} resp = requests.post('http://www.mywebsite.com/user', data=userdata) 

Be to, jis netgi turi įmontuotą json-dekoderį (dar kartą žinau, kad json.loads () nėra daug daugiau rašymo, bet visada yra patogu):

 resp.json() 

Arba, jei jūsų atsakymo duomenys yra tik tekstas, naudokite:

 resp.text 

Tai tik ledkalnio viršūnė. Tai funkcijų sąrašas iš užklausos svetainės:

  • Tarptautiniai domenai ir URL
  • „Keep-Alive“ ir „Connection Pooling“
  • Slapukų sesijos
  • Patikrinkite SSL naršyklėje.
  • „Basic / Digest“ autentifikavimas
  • Elegantiški slapukai / vertė
  • Automatinis dekompresavimas
  • Unikodo atsako vienetai
  • Atsisiųskite kelių puslapių failus
  • Ryšio trukmės
  • .netrc palaikymas
  • Sąrašo elementas
  • Python 2.6-3.4
  • sriegis saugus.
570
11 февр. Atsakymas pateikiamas Hutch 11 vasario mėn. 2013-02-11 03:32 '13 at 3:32 2013-02-11 03:32

urllib2 suteikia tam tikrą papildomą funkciją, ty funkcija „ urlopen() gali nurodyti antraštes (paprastai turėjote naudoti „httplib“ praeityje, o tai yra daug labiau verbozė). Be to, nors urllib2 pateikia Request , kuri leidžia deklaratyviau taikyti prašymą:

 r = Request(url='http://www.mysite.com') r.add_header('User-Agent', 'awesome fetcher') r.add_data(urllib.urlencode({'foo': 'bar'}) response = urlopen(r) 

Atminkite, kad urlencode() yra tik urllib, o ne urllib2.

border=0

Taip pat yra tvarkyklių, skirtų urllib2 pažangesniam URL palaikymui. Trumpas atsakymas: jei neveikia pasenęs kodas, tikriausiai norite naudoti URL aptikimo priemonę iš urllib2, tačiau vis tiek reikia importuoti į urllib kai kurioms naudingumo funkcijoms.

Premijos atsakymas Naudodami „Google App Engine“, galite naudoti bet kurį „httplib“, „urllib“ ar „urllib2“, bet jie visi yra tik „API“ API API įvyniojimai. Tai reiškia, kad jums vis tiek taikomi tie patys apribojimai, kaip ir uostams, protokolams ir leistino atsako trukmei. Galite naudoti pagrindines bibliotekas, kaip tikitės gauti HTTP URL.

186
07 янв. atsakymas pateikiamas Crast 07 Jan 2010-01-07 06:43 '10, 6:43, 2010-01-07 06:43

urllib ir urllib2 yra abu Python moduliai, susiję su URL užklausomis, bet siūlo skirtingus funkcionalumus.

1) urllib2 gali priimti užklausos objektą nustatyti URL užklausos antraštes, urllib priima tik URL.

2) urllib pateikia metodą urlencode , kuris naudojamas generuoti GET užklausos eilutes, urllib2 neturi šios funkcijos. Tai yra viena iš priežasčių, kodėl urllib dažnai vartojamas kartu su urllib2.

Prašymai . Prašymai yra paprasta, lengvai naudojama HTTP biblioteka, parašyta „Python“.

1) „Python“ užklausos automatiškai koduoja parametrus, taigi jūs tiesiog perduodate juos kaip paprastus argumentus, skirtingai nei urllib, kur jums reikia naudoti urllib.encode () metodą, kad koduotumėte parametrus prieš juos perduodant.

2) Jis automatiškai dekodavo atsakymą Unicode.

3) Prašymai taip pat turi daug patogesnį tvarkymą. Jei jūsų autentifikavimas nepavyksta, urllib2 pakels urllib2.URLError, o prašymai grąžins normalų atsakymo objektą, kaip tikėtasi. Visa tai jums reikia, kad įsitikintumėte, jog prašymas buvo sėkmingas naudojant loginį atsakymą

Pavyzdžiui, nuoroda yra https://dancallahan.info/journal/python-requests/

31
10 сент. atsakymą pateikė SrmHitter9062 10 sep . 2016-09-10 07:14 '16 at 07:14 2016-09-10 07:14

urllib2.urlopen priima užklausos klasės ar URL adresą, o urllib.urlopen priima tik URL.

Panašios diskusijos vyko čia: http://www.velocityreviews.com/forums/t326690-urllib-urllib2-what-is-the-difference.html

12
07 янв. Atsakymas, kurį pateikė Danny Roberts Jan 07 2010-01-07 06:29 '10, 6:29, 2010-01-07 06:29

Man patinka funkcija urllib.urlencode , ir neatrodo, kad jis yra urllib2 .

 >>> urllib.urlencode({'abc':'d f', 'def': '-!2'}) 'abc=d+f> 
10
07 янв. atsakymą pateikė Gattster 07 jan. 2010-01-07 06:51 '10, 6:51, 2010-01-07 06:51

Svarbus skirtumas yra Python2 perkėlimas į Python3. urllib2 neegzistuoja python3 ir jo metodai perkeliami į urllib. Taigi jūs naudojate jį daug ir norite ateityje pereiti prie „Python3“, pagalvokite apie naudojimąsi „urllib“. Tačiau įrankis „2to3“ automatiškai atliks didžiąją darbo dalį.

8
27 апр. atsakymas pateikiamas Arash 27 balandžio. 2016-04-27 04:07 '16 at 4:07 2016-04-27 04:07

Jei norite gauti URL turinį:

 try: # Try importing requests first. import requests except ImportError: try: # Try importing Python3 urllib import urllib.request except AttributeError: # Now importing Python2 urllib import urllib def get_content(url): try: # Using requests. return requests.get(url).content # Returns requests.models.Response. except NameError: try: # Using Python3 urllib. with urllib.request.urlopen(index_url) as response: return response.read() # Returns http.client.HTTPResponse. except AttributeError: # Using Python3 urllib. return urllib.urlopen(url).read() # Returns an instance. 

Sunku rašyti python2 ir Python3 ir request kodo priklausomybių atsakymams, nes jie turi urlopen() funkcijas ir urlopen() requests.get() funkciją grąžina įvairius tipus:

  • Python2 urllib.request.urlopen() grąžina http.client.HTTPResponse
  • Python3 urllib.urlopen(url) grąžina instance
  • request.get(url) grąžina request.get(url)
6
20 дек. Atsakyti alvas 20 d 2017-12-20 05:29 '17 at 5:29 2017-12-20 05:29

Paprastai turėtumėte naudoti urllib2, nes tai šiek tiek palengvina, priima užklausos objektus ir taip pat sukelia protokolo klaidų URLException. „Google App Engine“ taip pat negalite naudoti. Turite naudoti „URL“ API API, kurią „Google“ teikia atskiroje „Python“ aplinkoje.

5
07 янв. atsakymą pateikė Chinmay Kanchi 07 jan. 2010-01-07 06:36 '10, 6:36, 2010-01-07 06:36

Tiesiog pridedant esamus atsakymus nematau, kad niekas nemini, kad python prašymai nėra gimtoji biblioteka. Jei sutinkate pridėti priklausomybių, užklausos bus gerai. Tačiau, jei bandote išvengti priklausomybių pridėjimo, urllib yra vietinė „python“ biblioteka, kuri jau yra jums prieinama.

5
30 окт. atsakymas, kurį pateikė Zeitgeist, spalio 30 d 2017-10-30 21:42 '17 21:42 2017-10-30 21:42

Svarbiausias dalykas, kurį aš nerandu iš aukščiau pateiktų atsakymų, yra tai, kad urllib grąžina <class http.client.HTTPResponse> tipą, o requests grąžinti <class 'requests.models.Response'> <class http.client.HTTPResponse> <class 'requests.models.Response'> <class http.client.HTTPResponse> <class 'requests.models.Response'> . Todėl skaitymo () metodas gali būti naudojamas su urllib bet ne su requests . PS: requests jau requests gausios tiek daug metodų, kad vargu ar jums reikia kito, pvz., read() ;>

0
14 дек. atsakymas suteiktas paradoksloveris 14 d. 2018-12-14 03:04 '18, 08:04 nuo 2018-12-14 03:04