Was sind die Unterschiede zwischen den Modulen urllib, urllib2, urllib3 und Anfragen?

Lesezeit: 9 Minuten

Benutzer-Avatar
Paul Bigger

Was sind in Python die Unterschiede zwischen der urllib, urllib2, urllib3 und requests Module? Warum gibt es drei? Sie scheinen das Gleiche zu tun…

  • Diese Frage sollte aktualisiert werden, um dies zu verdeutlichen urllib in Python 3 ist eine weitere Option, die auf verschiedene Weise bereinigt wurde. Aber zum Glück vermerkt die offizielle Dokumentation auch, dass “Das Requests-Paket wird für eine HTTP-Client-Schnittstelle auf höherer Ebene empfohlen.” bei 21.6. urllib.request – Erweiterbare Bibliothek zum Öffnen von URLs – Dokumentation zu Python 3.6.3

    – nealmcb

    15. Oktober 2017 um 16:04 Uhr


  • Leider habe ich keine Antworten gesehen, die mir sagen, was urllib3 ist und wie urllib3 unterscheidet sich von der offiziellen urllib Modul.

    – Rick

    13. März 2020 um 9:05 Uhr


  • wohl erwähnenswert httpx — die neuere Requests-Backwords-kompatible Async-Bibliothek.

    – ccpizza

    19. Oktober 2020 um 14:23 Uhr

Benutzer-Avatar
Stall

Ich weiß, es wurde schon gesagt, aber ich kann es nur empfehlen requests Python-Paket.

Wenn Sie andere Sprachen als Python verwendet haben, denken Sie wahrscheinlich urllib und urllib2 sind einfach zu bedienen, haben nicht viel Code und sind sehr leistungsfähig, so dachte ich früher. Aber die requests 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:

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

Egal ob GET / POST, Sie müssen nie wieder Parameter codieren, es nimmt einfach ein Wörterbuch als Argument und ist gut zu gehen:

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

Außerdem hat es sogar einen eingebauten JSON-Decoder (wieder weiß ich json.loads() ist nicht viel mehr zu schreiben, aber das ist sicher praktisch):

resp.json()

Oder wenn Ihre Antwortdaten nur aus Text bestehen, verwenden Sie:

resp.text

Dies ist nur die Spitze des Eisbergs. Dies ist die Liste der Funktionen von der Anforderungsseite:

  • Internationale Domains und URLs
  • Keep-Alive & Connection Pooling
  • Sitzungen mit Cookie-Persistenz
  • SSL-Verifizierung im Browser-Stil
  • Basis-/Digest-Authentifizierung
  • Elegante Schlüssel/Wert-Cookies
  • Automatische Dekomprimierung
  • Unicode-Antwortkörper
  • Hochladen von mehrteiligen Dateien
  • Verbindungs-Timeouts
  • .netrc-Unterstützung
  • Listenpunkt
  • Python 2.7, 3.6–3.9
  • Gewindesicher.

  • Es wäre hilfreich zu beachten, dass die Python 3-Dokumentation noch eine weitere eigene Bibliothek enthält urllib und dass seine Dokumentation auch offiziell feststellt, dass “Das Requests-Paket wird für eine HTTP-Client-Schnittstelle auf höherer Ebene empfohlen.” bei 21.6. urllib.request – Erweiterbare Bibliothek zum Öffnen von URLs – Dokumentation zu Python 3.6.3und das urllib3 ist eine großartige Bibliothek, die von verwendet wird requests.

    – nealmcb

    15. Oktober 2017 um 16:11 Uhr


  • Ok außer ich habe die Abdruckanfrage hat keinen Ersatz für urllib.parse()

    – Bob Stein

    18. Mai 2018 um 15:50 Uhr

  • @Andriy: Was meinst du PS?

    – VimNing

    10. Juni 2021 um 8:03 Uhr

  • Ich verstehe nicht, warum dies die akzeptierte Antwort ist. Es hat die Frage von OP nicht beantwortet.

    – Tyler Crompton

    23. August 2021 um 14:12 Uhr


Benutzer-Avatar
Krass

urllib2 bietet einige zusätzliche Funktionen, nämlich die urlopen() -Funktion können Sie Header angeben (normalerweise hätten Sie in der Vergangenheit httplib verwenden müssen, was weitaus ausführlicher ist). Noch wichtiger ist jedoch, dass urllib2 die Request -Klasse, die einen deklarativeren Ansatz für eine Anfrage ermöglicht:

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

Beachten Sie, dass urlencode() ist nur in urllib, nicht urllib2.

Es gibt auch Handler zum Implementieren 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, aber Sie müssen für einige der Hilfsfunktionen immer noch in urllib importieren.

Bonusantwort
Mit Google App Engine können Sie httplib, urllib oder urllib2 verwenden, aber alle sind nur Wrapper für die URL-Abruf-API von Google. Das heißt, Sie unterliegen immer noch den gleichen Einschränkungen wie Ports, Protokolle und die Länge der zulässigen Antwort. Sie können den Kern der Bibliotheken jedoch wie erwartet zum Abrufen von HTTP-URLs verwenden.

  • Wie erstellt jemand mit urllib2 eine URL mit einer verschlüsselten Abfragezeichenfolge? Das ist der einzige Grund, warum ich urllib verwende und ich möchte sicherstellen, dass ich alles auf die neueste/beste Art und Weise mache.

    – Gattster

    7. Januar 2010 um 8:51 Uhr

  • Wie in meinem obigen Beispiel verwenden Sie urlopen() und Request aus urllib2und Sie verwenden urlencode() aus urlib. Es schadet nicht wirklich, beide Bibliotheken zu verwenden, solange Sie sicherstellen, dass Sie das richtige Urlopen verwenden. Das [urllib docs][1] sind sich darüber im Klaren, dass dies eine akzeptierte Nutzung ist. [1]: docs.python.org/library/urllib2.html#urllib2.urlopen

    – Krass

    7. Januar 2010 um 14:12 Uhr


  • ich benutzte Dies Kern für urllib2.urlopen ; enthält auch andere Variationen.

    – Andrei-Niculae Petre

    30. Juni 2014 um 10:18 Uhr

  • urllib2 unterstützt kein Put oder Delete, was mühsam ist

    – fkl

    18. Februar 2015 um 21:17 Uhr

  • requests auch benutzerdefinierte Header zulassen: docs.python-requests.org/en/master/user/quickstart/…

    – Omer Dagan

    13. September 2018 um 11:09 Uhr

Benutzer-Avatar
pw

Dies ist mein Verständnis der Beziehungen zwischen den verschiedenen “URLIBs”:

In der Standardbibliothek von Python 2 gibt es zwei HTTP-Bibliotheken nebeneinander. Trotz des ähnlichen Namens sind sie unabhängig: Sie haben ein anderes Design und eine andere Implementierung.

  • urllib war der ursprüngliche Python-HTTP-Client, der der Standardbibliothek in hinzugefügt wurde Python 1.2. Frühere Dokumentation für urllib kann gefunden werden in Python 1.4.

  • urllib2 war ein leistungsfähigerer HTTP-Client, in Python 1.6 hinzugefügtgedacht als Ersatz für urllib:

    urllib2 – neue und verbesserte, aber inkompatible Version von urllib (noch experimentell).

    Frühere Dokumentation für urllib2 kann gefunden werden in Python 2.1.

Die Python 3-Standardbibliothek hat eine Neu urllib Dies ist eine zusammengeführte/umgestaltete/umgeschriebene Version der älteren Module.

urllib3 ist ein Paket eines Drittanbieters (dh nicht in der Standardbibliothek von CPython). Trotz des Namens hat es nichts mit den Standardbibliothekspaketen zu tun, und es ist nicht beabsichtigt, es in Zukunft in die Standardbibliothek aufzunehmen.

Endlich, requests intern verwendet urllib3aber es zielt auf eine einfacher zu verwendende API ab.

  • Tolle Antwort, jetzt habe ich einen weiteren Grund, Anfragen nicht zu verwenden und sicherer zu sein, wenn ich die neuen verwende urllib. Gibt es eine Diskussion/Ankündigung über die Änderung und Verbesserung des Neuen? urllib? Ich habe keine gefunden, bin aber wirklich daran interessiert, mehr darüber zu erfahren.

    – Reorx

    gestern

Benutzer-Avatar
Siyaram Malav

urlib und urllib2 sind beides Python-Module, die sich auf URL-Anforderungen beziehen, aber unterschiedliche Funktionalitäten bieten.

1) urllib2 kann ein Request-Objekt akzeptieren, um die Header für eine URL-Anfrage zu setzen, urllib akzeptiert nur eine URL.

2) urllib bietet die URL-Code -Methode, die zur Generierung von GET-Abfragezeichenfolgen verwendet wird, hat urllib2 keine solche Funktion. Dies ist einer der Gründe, warum urllib oft zusammen mit urllib2 verwendet wird.

Anfragen – Requests“ ist eine einfache, benutzerfreundliche HTTP-Bibliothek, die in Python geschrieben ist.

1) Python Requests codiert die Parameter automatisch, sodass Sie sie einfach als einfache Argumente übergeben, anders als im Fall von urllib, wo Sie die Methode verwenden müssen urllib.encode() um die Parameter zu codieren, bevor sie übergeben werden.

2) Die Antwort wurde automatisch in Unicode dekodiert.

3) Requests hat auch eine viel bequemere Fehlerbehandlung. Wenn Ihre Authentifizierung fehlschlägt, würde urllib2 einen urllib2.URLError auslösen, während Requests wie erwartet ein normales Antwortobjekt zurückgeben würde. Alles, was Sie sehen müssen, ob die Anfrage von boolean erfolgreich war Antwort.ok

Nur um die vorhandenen Antworten zu ergänzen, sehe ich niemanden, der erwähnt, dass Python-Anforderungen 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.

  • Richtig, wenn Sie das Hinzufügen von Abhängigkeiten vermeiden möchten, ist urllib verfügbar. Aber beachten Sie, dass sogar die Offizielle Python-Dokumentation empfiehlt die Requests-Bibliothek: “Das Requests-Paket wird für eine HTTP-Client-Schnittstelle auf höherer Ebene empfohlen.”

    – hlongmore

    9. Juni 2020 um 18:00 Uhr

  • @hlongmore Natürlich möchten sich die meisten Leute nicht mit URLLIB auf niedriger Ebene befassen, und die Requests-Bibliothek bietet eine gute Abstraktionsebene. Es ist, als würde man eine Pfannkuchenmischung in einer Schachtel verwenden, anstatt sie von Grund auf neu zu machen. Vor-und Nachteile.

    – Zeitgeist

    10. Juni 2020 um 17:46 Uhr

Ein wesentlicher Unterschied besteht in der Portierung von Python2 nach Python3. urllib2 existiert nicht für python3 und seine auf urllib portierten Methoden. Sie verwenden das also stark und möchten in Zukunft zu Python3 migrieren, ziehen Sie die Verwendung von urllib in Betracht. Das 2to3-Tool erledigt jedoch automatisch die meiste Arbeit für Sie.

  • Richtig, wenn Sie das Hinzufügen von Abhängigkeiten vermeiden möchten, ist urllib verfügbar. Aber beachten Sie, dass sogar die Offizielle Python-Dokumentation empfiehlt die Requests-Bibliothek: “Das Requests-Paket wird für eine HTTP-Client-Schnittstelle auf höherer Ebene empfohlen.”

    – hlongmore

    9. Juni 2020 um 18:00 Uhr

  • @hlongmore Natürlich möchten sich die meisten Leute nicht mit URLLIB auf niedriger Ebene befassen, und die Requests-Bibliothek bietet eine gute Abstraktionsebene. Es ist, als würde man eine Pfannkuchenmischung in einer Schachtel verwenden, anstatt sie von Grund auf neu zu machen. Vor-und Nachteile.

    – Zeitgeist

    10. Juni 2020 um 17:46 Uhr

Benutzer-Avatar
Gattster

Ich mag urllib.urlencode Funktion, und es scheint in nicht zu existieren urllib2.

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

  • Nur eine Anmerkung, seien Sie vorsichtig mit urlencode, da es -Objekte nicht direkt verarbeiten kann – Sie müssen sie codieren, bevor Sie sie an urlencode senden (u’blá’.encode(‘utf-8’) oder was auch immer).

    Benutzer18015

    27. Juni 2011 um 2:12 Uhr

  • @ user18015: Ich glaube nicht, dass dies für Python 3 gilt, können Sie das klarstellen?

    – Janus Troelsen

    17. Dezember 2012 um 16:10 Uhr

  • Wie ich oben erwähnt habe, sollten diese Frage und die verschiedenen Antworten aktualisiert werden, um dies zu verdeutlichen urllib in Python 3 ist eine weitere Option, die auf verschiedene Weise bereinigt wurde. Aber zum Glück vermerkt die offizielle Dokumentation auch, dass “Das Requests-Paket wird für eine HTTP-Client-Schnittstelle auf höherer Ebene empfohlen.” bei 21.6. urllib.request – Erweiterbare Bibliothek zum Öffnen von URLs – Dokumentation zu Python 3.6.3

    – nealmcb

    15. Oktober 2017 um 16:06 Uhr

  • urllib2 existiert überhaupt nicht in Python 3

    – Boris Werchowskij

    28. Dezember 2019 um 22:16 Uhr

  • Es wurde in Python 3 nach urllib.parse.urlencode verschoben.

    – Martijn Pieters

    21. Mai 2021 um 20:21 Uhr

1143870cookie-checkWas sind die Unterschiede zwischen den Modulen urllib, urllib2, urllib3 und Anfragen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy