Wat zijn in Python de verschillen tussen de urllib
, urllib2
, urllib3
en 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 requests
Python-pakket.
Als je andere talen dan python hebt gebruikt, denk je waarschijnlijk dat urllib
en urllib2
gemakkelijk te gebruiken zijn, niet veel code, en zeer capabel, dat is hoe Ik dacht al. Maar het pakket requests
is 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 request
biedt, 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.
-
urllib
was het origineel Python HTTP-client, toegevoegd aan de standaardbibliotheek in python 1.2 . Eerdere documentatie voorurllib
is te vinden in python 1.4 . -
urllib2
was een meer Capable HTTP-client, toegevoegd in Python 1.6 , bedoeld als vervanging voorurllib
:URLLIB2 – nieuwe en verbeterde maar onverenigbare versie van URLLIB (nog steeds experimenteel).
Eerdere documentatie voor
urllib2
is te vinden in Python 2.1 .
De Python 3 standaardbibliotheek heeft een nieuw urllib
die een samengevoegde / refactored / herschreven versie van de oudere modules is.
urllib3
is 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, requests
intern 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.urlencode
leuk, 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 request
afhankelijkhedencode voor de reacties te schrijven omdat ze urlopen()
-functies en requests.get()
functie retourneren verschillende typen:
- Python2
urllib.request.urlopen()
retourneert eenhttp.client.HTTPResponse
- Python3
urllib.urlopen(url)
retourneert eeninstance
- Request
request.get(url)
retourneert eenrequests.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 urllib3
veel 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.
- Reactieinhoud(Het HTTPResponse-object geeft status , gegevens,
en kopattributen) - io Wrappers gebruiken met Reactie-inhoud
- Een queryparameter maken
- Geavanceerd gebruik van urllib3
requests
Verzoeken gebruikt urllib3
onder de kap en maak het zelfs eenvoudiger om requests
te maken en gegevens op te halen.
Voor één ding is Keep-Alive 100% automatisch, in vergelijking met urllib3
waar het niet is. Het heeft ook evenementenhaken die een callback-functie oproepen wanneer een gebeurtenis wordt geactiveerd, zoals het ontvangen van een reactie
In requests
heeft elk aanvraagtype zijn eigen functie. Dus in plaats van een verbinding of een zwembad te maken, krijgt u rechtstreeks een URL.
Voor installatie requests
PIP 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 urllib
maar niet met requests
.
P.S. : requests
is al rijk aan zoveel methoden dat het er nauwelijks nog een nodig heeft als read()
;>