Wat zijn de verschillen tussen de module urllib, urllib2, urllib3 en verzoeken?

Wat zijn in Python de verschillen tussen de urllib, urllib2, urllib3en requests? Waarom zijn er drie? Ze lijken hetzelfde te doen…


Antwoord 1, autoriteit 100%

Ik weet dat het al gezegd is, maar ik zou de requestsPython-pakket.

Als je andere talen dan python hebt gebruikt, denk je waarschijnlijk dat urlliben urllib2gemakkelijk te gebruiken zijn, niet veel code, en zeer capabel, dat is hoe Ik dacht al. Maar het pakket requestsis zo ongelooflijk handig en kort dat iedereen het zou moeten gebruiken.

Ten eerste ondersteunt het een volledig rustgevende API, en het is zo eenvoudig als:

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')

Ongeacht of GET / POST, u hoeft nooit meer parameters te coderen, er is gewoon een woordenboek als argument nodig en het is goed om te gaan:

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

Bovendien heeft het zelfs een ingebouwde JSON-decoder (nogmaals, ik weet dat json.loads()niet veel meer is om te schrijven, maar dit is zeker handig):

resp.json()

Of als uw reactiegegevens alleen tekst zijn, gebruikt u:

resp.text

Dit is slechts het topje van de ijsberg. Dit is de lijst met functies van de verzoekensite:

  • Internationale domeinen en URL’s
  • Keep-Alive & Verbinding poolen
  • Sessies met cookiepersistentie
  • SSL-verificatie in browserstijl
  • Basis/Digest-authenticatie
  • Elegante sleutel/waarde-cookies
  • Automatische decompressie
  • Unicode-antwoordinstanties
  • Meerdelige bestandsuploads
  • Verbindingstime-outs
  • .netrc-ondersteuning
  • Lijstitem
  • Python 2.7, 3.6—3.9
  • Draadveilig.

Antwoord 2, autoriteit 28%

urllib2 biedt wat extra functionaliteit, namelijk met de functie urlopen()kun je headers specificeren (normaal had je in het verleden httplib moeten gebruiken, wat veel uitgebreider is). Belangrijk is echter dat urllib2 de klasse requestbiedt, wat een meer declaratieve benadering van het doen van een aanvraag mogelijk maakt:

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

Merk op dat urlencode()alleen in urllib staat, niet in urllib2.

Er zijn ook handlers voor het implementeren van meer geavanceerde URL-ondersteuning in Urllib2. Het korte antwoord is, tenzij u met LEGACE-code werkt, wilt u waarschijnlijk de URL-opener van URLLIB2 gebruiken, maar u moet nog steeds invoeren in URLLIB voor sommige van de nutsfuncties.

bonusantwoord
Met Google App Engine kunt u een van HTTPLIB, URLLIB of URLLIB2 gebruiken, maar ze zijn allemaal gewoon wrappers voor de URL-fetch-API van Google. Dat wil zeggen, u bent nog steeds onderworpen aan dezelfde beperkingen zoals poorten, protocollen en de lengte van het toegestane reactie. U kunt de kern van de bibliotheken gebruiken zoals u zou verwachten voor het ophalen van HTTP-URL’s.


3, Autoriteit 12%

Dit is mijn begrip van wat de relaties tussen de verschillende “Urllibs” zijn:

In de standaard bibliotheek Python 2 bestaan ​​er twee HTTP-bibliotheken naast elkaar. Ondanks de vergelijkbare naam zijn ze niet gerelateerd: ze hebben een ander ontwerp en een andere implementatie.

  • urllibwas het origineel Python HTTP-client, toegevoegd aan de standaardbibliotheek in python 1.2 . Eerdere documentatie voor urllibis te vinden in python 1.4 .

  • urllib2was een meer Capable HTTP-client, toegevoegd in Python 1.6 , bedoeld als vervanging voor urllib:

    URLLIB2 – nieuwe en verbeterde maar onverenigbare versie van URLLIB (nog steeds experimenteel).

    Eerdere documentatie voor urllib2is te vinden in Python 2.1 .

De Python 3 standaardbibliotheek heeft een nieuw urllibdie een samengevoegde / refactored / herschreven versie van de oudere modules is.

urllib3is een pakket van derden (dwz niet in Cpython’s standaardbibliotheek). Ondanks de naam is het niet gerelateerd aan de standaard bibliotheekpakketten en is er geen intentie om deze in de toekomst in de standaardbibliotheek op te nemen.

Ten slotte, requestsintern gebruikt urllib3, maar het streeft naar een gemakkelijker-te-gebruik API.


Antwoord 4, autoriteit 3%

Om aan de bestaande antwoorden toe te voegen, ik zie niemand vermelden dat python-verzoeken geen native bibliotheek zijn. Als je het goed vindt om afhankelijkheden toe te voegen, dan zijn verzoeken prima. Als u echter probeert te voorkomen dat u afhankelijkheden toevoegt, is urllib een native python-bibliotheek die al voor u beschikbaar is.


Antwoord 5, autoriteit 2%

Een aanzienlijk verschil betreft het overzetten van Python2 naar Python3. urllib2 bestaat niet voor python3 en zijn methoden geport naar urllib.
Dus je gebruikt dat veel en wilt in de toekomst migreren naar Python3, overweeg dan om urllib te gebruiken.
De 2to3-tool doet echter automatisch het meeste werk voor u.


Antwoord 6

Ik vind de functie urllib.urlencodeleuk, en deze lijkt niet te bestaan in urllib2.

>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
'abc=d+f&def=-%212'

Antwoord 7

De inhoud van een url ophalen:

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.

Het is moeilijk om Python2 en Python3 en requestafhankelijkhedencode voor de reacties te schrijven omdat ze urlopen()-functies en requests.get()functie retourneren verschillende typen:

  • Python2 urllib.request.urlopen()retourneert een http.client.HTTPResponse
  • Python3 urllib.urlopen(url)retourneert een instance
  • Request request.get(url)retourneert een requests.models.Response

Antwoord 8

Ik denk dat alle antwoorden redelijk goed zijn. Maar minder details over urllib3.urllib3 is een zeer krachtige HTTP-client voor python.
Voor het installeren zullen beide volgende commando’s werken,

urllib3

pip gebruiken,

pip install urllib3

of je kunt de nieuwste code van Github krijgen en deze installeren met,

$ git clone git://github.com/urllib3/urllib3.git
$ cd urllib3
$ python setup.py install

Dan ben je klaar om te gaan,

Importeer urllib3 gewoon met,

import urllib3

Hierin, in plaats van rechtstreeks een verbinding tot stand te brengen, heeft u een instantie van PoolManager nodig om verzoeken te doen. Dit zorgt voor verbindingspooling en draadveiligheid voor u. Er is ook een ProxyManager-object voor het routeren van verzoeken via een HTTP/HTTPS-proxy
Hier kunt u de documentatie raadplegen.
voorbeeldgebruik :

>>> from urllib3 import PoolManager
>>> manager = PoolManager(10)
>>> r = manager.request('GET', 'http://google.com/')
>>> r.headers['server']
'gws'
>>> r = manager.request('GET', 'http://yahoo.com/')
>>> r.headers['server']
'YTS/1.20.0'
>>> r = manager.request('POST', 'http://google.com/mail')
>>> r = manager.request('HEAD', 'http://google.com/calendar')
>>> len(manager.pools)
2
>>> conn = manager.connection_from_host('google.com')
>>> conn.num_requests
3

Zoals vermeld in de urrlib3-documentatie, biedt urllib3veel essentiële functies die ontbreken in de standaardbibliotheken van Python.

  • Draadveiligheid.
  • Verbindingspooling.
  • Client-side SSL/TLS-verificatie.
  • Bestandsuploads met meerdelige codering.
  • Helpers voor het opnieuw proberen van verzoeken en omgaan met HTTP-omleidingen.
  • Ondersteuning voor gzip- en deflate-codering.
  • Proxy-ondersteuning voor HTTP en SOCKS.
  • 100% testdekking.

Volg de gebruikershandleiding voor meer details.

requests

Verzoeken gebruikt urllib3onder de kap en maak het zelfs eenvoudiger om requestste maken en gegevens op te halen.
Voor één ding is Keep-Alive 100% automatisch, in vergelijking met urllib3waar het niet is. Het heeft ook evenementenhaken die een callback-functie oproepen wanneer een gebeurtenis wordt geactiveerd, zoals het ontvangen van een reactie
In requestsheeft elk aanvraagtype zijn eigen functie. Dus in plaats van een verbinding of een zwembad te maken, krijgt u rechtstreeks een URL.


Voor installatie requestsPIP gebruiken Gewoon

pip install requests

of u kunt gewoon installeren van de broncode,

$ git clone git://github.com/psf/requests.git
$ cd requests
$ python setup.py install

Dan, import requests

Hier kunt u de officiële Documentatie ,
Voor een geavanceerd gebruik zoals Session Object, SSL-verificatie en evenementhaken, raadpleeg deze URL .


9

U moet in het algemeen URLLIB2 gebruiken, omdat dit soms wat gemakkelijker maakt door aanvraagobjecten te accepteren en ook een uxceptie op protocolfouten op te zetten. Met Google App Engine, kunt u ook niet gebruiken. Je moet de URL FETCH API die Google biedt in zijn sandboxed python omgeving.


10

Een belangrijk punt dat ik mis in de bovenstaande antwoorden is dat urllib een object van het type <class http.client.HTTPResponse>retourneert terwijl requests<class 'requests.models.Response'>.

Hierdoor kan de methode read() worden gebruikt met urllibmaar niet met requests.

P.S. : requestsis al rijk aan zoveel methoden dat het er nauwelijks nog een nodig heeft als read();>

Other episodes