In Python, was sind die Unterschiede zwischen der urllib
, urllib2
, urllib3
und requests
Module? Warum gibt es drei? Sie scheinen dasselbe zu tun ...
python
python-requests
urllib2
urllib
python-2.x
Paul Biggar
quelle
quelle
requests
meiste Zeit.urllib2
funktioniert manchmal , erfordert aber mehr Code und ist weniger elegant. nicht benutzenurllib
.urllib
Python 3 eine weitere Option ist, die auf verschiedene Weise bereinigt wird. Zum Glück wird in der offiziellen Dokumentation jedoch auch darauf hingewiesen, dass " Das Requests-Paket für eine übergeordnete HTTP-Client-Schnittstelle empfohlen wird " ( 21.6). urllib.request - Erweiterbare Bibliothek zum Öffnen von URLs - Python 3.6.3-DokumentationAntworten:
Ich weiß, dass es bereits gesagt wurde, aber ich würde das
requests
Python-Paket wärmstens empfehlen .Wenn Sie andere Sprachen als Python verwendet haben, denken Sie wahrscheinlich
urllib
undurllib2
sind einfach zu bedienen, nicht viel Code und sehr leistungsfähig. So habe ich früher gedacht. Aber dasrequests
Paket ist so unglaublich nützlich und kurz, dass jeder es verwenden sollte.Erstens unterstützt es eine vollständig erholsame API und ist so einfach wie:
Unabhängig davon, ob GET / POST, Sie müssen nie wieder Parameter codieren, es wird einfach ein Wörterbuch als Argument verwendet und es kann losgehen:
Außerdem hat es sogar einen eingebauten JSON-Decoder (ich weiß wieder, dass
json.loads()
es nicht viel mehr zu schreiben gibt, aber das ist sicher praktisch):Oder wenn Ihre Antwortdaten nur Text sind, verwenden Sie:
Dies ist nur die Spitze des Eisbergs. Dies ist die Liste der Funktionen auf der Anforderungssite:
quelle
urllib
und dass in der Dokumentation auch offiziell angegeben ist, dass " Das Requests-Paket für eine übergeordnete HTTP-Client-Schnittstelle empfohlen wird " ( 21.6). urllib.request - Erweiterbare Bibliothek zum Öffnen von URLs - Python 3.6.3-Dokumentation , und dasurllib3
ist eine großartige Bibliothek, die von verwendet wirdrequests
.urllib.parse()
urllib2 bietet einige zusätzliche Funktionen, nämlich die
urlopen()
Funktion, mit der Sie Header angeben können (normalerweise hätten Sie in der Vergangenheit httplib verwenden müssen, was weitaus ausführlicher ist). Noch wichtiger ist jedoch, dass urllib2 dieRequest
Klasse bereitstellt , die mehr ermöglicht deklarativer Ansatz zur Bearbeitung einer Anfrage:Beachten Sie, dass dies
urlencode()
nur in urllib und nicht in urllib2 erfolgt.Es gibt auch Handler für die Implementierung einer erweiterten URL-Unterstützung in urllib2. Die kurze Antwort lautet: Wenn Sie nicht mit Legacy-Code arbeiten, möchten Sie wahrscheinlich den URL-Öffner von urllib2 verwenden, müssen jedoch für einige der Dienstprogrammfunktionen noch in urllib importieren.
Bonus Antwort Mit Google App Engine, können Sie alle httplib verwenden, urllib oder urllib2, aber alle von ihnen sind nur Wrapper für die Google-URL API abrufen. Das heißt, Sie unterliegen immer noch denselben Einschränkungen wie Ports, Protokollen und der Länge der zulässigen Antwort. Sie können den Kern der Bibliotheken jedoch wie erwartet zum Abrufen von HTTP-URLs verwenden.
quelle
urlopen()
undRequest
von urllib2 und Sie verwendenurlencode()
von urllib . Kein wirklicher Schaden bei der Verwendung beider Bibliotheken, solange Sie sicherstellen, dass Sie die richtige URL verwenden. Die [urllib docs] [1] sind sich darüber im Klaren, dass die Verwendung dieser Option akzeptiert wird. [1]: docs.python.org/library/urllib2.html#urllib2.urlopenurllib2.urlopen
; enthält auch andere Variationen.requests
Erlaubeurllib und urllib2 sind beide Python-Module, die URL-Request-bezogene Dinge ausführen, aber unterschiedliche Funktionen bieten.
1) urllib2 kann ein Request-Objekt akzeptieren, um die Header für eine URL-Anfrage festzulegen. Urllib akzeptiert nur eine URL.
2) urllib stellt die urlencode- Methode bereit , die zur Erzeugung von GET-Abfragezeichenfolgen verwendet wird. Urllib2 hat keine solche Funktion. Dies ist einer der Gründe, warum urllib häufig zusammen mit urllib2 verwendet wird.
Requests - Requests 'ist eine einfache, benutzerfreundliche HTTP-Bibliothek, die in Python geschrieben wurde.
1) Python Requests codiert die Parameter automatisch, sodass Sie sie nur als einfache Argumente übergeben, im Gegensatz zu urllib, wo Sie die Methode urllib.encode () verwenden müssen , um die Parameter zu codieren, bevor Sie sie übergeben.
2) Die Antwort wird automatisch in Unicode dekodiert.
3) Anfragen haben auch eine weitaus bequemere Fehlerbehandlung. Wenn Ihre Authentifizierung fehlschlägt, würde urllib2 einen urllib2.URLError auslösen, während Anfragen erwartungsgemäß ein normales Antwortobjekt zurückgeben würden. Alles, was Sie sehen müssen, um zu sehen, ob die Anfrage von boolean response.ok erfolgreich war
quelle
Ein wesentlicher Unterschied besteht darin, Python2 auf Python3 zu portieren. urllib2 existiert nicht für python3 und seine auf urllib portierten Methoden. Wenn Sie das also stark nutzen und in Zukunft auf Python3 migrieren möchten, sollten Sie urllib verwenden. Das 2to3-Tool erledigt jedoch automatisch den größten Teil der Arbeit für Sie.
quelle
Nur um die vorhandenen Antworten zu ergänzen, sehe ich niemanden, der erwähnt, dass Python-Anfragen keine native Bibliothek sind. Wenn Sie mit dem Hinzufügen von Abhängigkeiten einverstanden sind, sind Anforderungen in Ordnung. Wenn Sie jedoch versuchen, das Hinzufügen von Abhängigkeiten zu vermeiden, ist urllib eine native Python-Bibliothek, die Ihnen bereits zur Verfügung steht.
quelle
Ich mag die
urllib.urlencode
Funktion und sie scheint in nicht zu existierenurllib2
.quelle
urllib
Python 3 eine weitere Option ist, die auf verschiedene Weise bereinigt wird. Zum Glück wird in der offiziellen Dokumentation auch darauf hingewiesen, dass " Das Requests-Paket für eine übergeordnete HTTP-Client-Schnittstelle empfohlen wird " ( 21.6.). urllib.request - Erweiterbare Bibliothek zum Öffnen von URLs - Python 3.6.3-DokumentationSo erhalten Sie den Inhalt einer URL:
Es ist schwierig, Python2- und Python3- und
request
Abhängigkeitscode für die Antworten zu schreiben, da sieurlopen()
funktionieren undrequests.get()
unterschiedliche Typen zurückgeben:urllib.request.urlopen()
gibt a zurückhttp.client.HTTPResponse
urllib.urlopen(url)
gibt eine zurückinstance
request.get(url)
gibt a zurückrequests.models.Response
quelle
Sie sollten im Allgemeinen urllib2 verwenden, da dies die Dinge manchmal etwas einfacher macht, indem Anforderungsobjekte akzeptiert werden, und auch eine URLException für Protokollfehler auslöst. Mit Google App Engine können Sie jedoch auch nicht verwenden. Sie müssen die URL-Abruf-API verwenden , die Google in seiner Python-Umgebung mit Sandbox bereitstellt.
quelle
Ein wichtiger Punkt, der in den obigen Antworten fehlt, ist, dass urllib ein Objekt vom Typ zurückgibt,
<class http.client.HTTPResponse>
während esrequests
zurückgibt<class 'requests.models.Response'>
.Aus diesem Grund kann die read () -Methode mit,
urllib
aber nicht mit verwendet werdenrequests
.PS:
requests
ist bereits reich an so vielen Methoden, dass es kaum noch eine braucht alsread()
;>quelle