1047 Stimmen

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

Was sind in Python die Unterschiede zwischen dem urllib , urllib2 , urllib3 y requests Module? Warum sind es drei? Sie scheinen das Gleiche zu tun...

25 Stimmen

Diese Frage sollte aktualisiert werden, um klarzustellen, dass urllib in Python 3 ist eine weitere Option, die auf verschiedene Weise bereinigt wurde. Aber glücklicherweise weist die offizielle Dokumentation auch darauf hin, dass " Das Paket Requests wird für eine übergeordnete HTTP-Client-Schnittstelle empfohlen. " unter 21.6. urllib.request - Erweiterbare Bibliothek zum Öffnen von URLs - Python 3.6.3 Dokumentation

20 Stimmen

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

3 Stimmen

Wahrscheinlich erwähnenswert httpx - die neuere requests-backwords-kompatible async-Bibliothek.

880voto

Hutch Punkte 9842

Ich weiß, dass es schon gesagt wurde, aber ich empfehle dringend die requests Python-Paket.

Wenn Sie andere Sprachen als Python verwendet haben, denken Sie wahrscheinlich urllib y urllib2 sind einfach zu bedienen, enthalten 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 benutzen sollte.

Erstens unterstützt es eine vollständig restful 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 kodieren, sondern nehmen einfach ein Wörterbuch als Argument und sind startklar:

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 (auch hier weiß ich json.loads() gibt es nicht mehr viel zu schreiben, aber das ist sicher praktisch):

resp.json()

Wenn Ihre Antwortdaten nur Text sind, verwenden Sie:

resp.text

Dies ist nur die Spitze des Eisbergs. Dies ist die Liste der Funktionen auf der Antragsseite:

  • Internationale Domains und URLs
  • Keep-Alive & Verbindungspooling
  • Sitzungen mit Cookie-Persistenz
  • Browser-ähnliche SSL-Überprüfung
  • Basis-/Digest-Authentifizierung
  • Elegante Schlüssel/Wert-Cookies
  • Automatische Dekomprimierung
  • Unicode-Antwort-Körper
  • Mehrteilige Dateiuploads
  • Zeitüberschreitungen bei Verbindungen
  • .netrc-Unterstützung
  • Posten auflisten
  • Python 2.7, 3.6-3.9
  • Thread-sicher.

11 Stimmen

Es wäre hilfreich zu wissen, dass die Python 3 Dokumentation noch eine weitere Bibliothek enthält urllib und dass in der Dokumentation auch offiziell vermerkt ist, dass " Das Paket Requests wird für eine übergeordnete HTTP-Client-Schnittstelle empfohlen. " unter 21.6. urllib.request - Erweiterbare Bibliothek zum Öffnen von URLs - Python 3.6.3 Dokumentation und dass urllib3 ist eine großartige Bibliothek, die von requests .

4 Stimmen

Ich habe allerdings den Eindruck, dass Antrag hat keinen Ersatz für urllib.parse()

0 Stimmen

@Andriy: Was haben Sie mit PS gemeint?

277voto

pdw Punkte 7189

So verstehe ich die Beziehungen zwischen den verschiedenen "urllibs":

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

  • urllib war der ursprüngliche Python-HTTP-Client, der der Standardbibliothek in Python 1.2 . Die frühere Dokumentation für urllib finden Sie in Python 1.4 .

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

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

    Frühere Dokumentation für urllib2 finden Sie in Python 2.1 .

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

urllib3 ist ein Drittanbieter-Paket (d.h. nicht in der Standardbibliothek von CPython). Trotz des Namens hat es nichts mit den Paketen der Standardbibliothek zu tun, und es ist nicht beabsichtigt, es in Zukunft in die Standardbibliothek aufzunehmen.

Endlich, requests verwendet intern urllib3 aber sie zielt auf eine leichter zu verwendende API ab.

228voto

Crast Punkte 15288

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 sehr viel ausführlicher ist). Noch wichtiger ist jedoch, dass urllib2 die Funktion Request Klasse, die einen deklarativen Ansatz für die Durchführung einer 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 in urllib2.

Es gibt auch Handler für die Implementierung einer erweiterten URL-Unterstützung in urllib2. Die kurze Antwort ist, dass Sie, sofern Sie nicht mit Legacy-Code arbeiten, wahrscheinlich den URL-Opener von urllib2 verwenden möchten, aber Sie müssen immer noch in urllib für einige der Utility-Funktionen importieren.

Bonus-Antwort Mit Google App Engine können Sie httplib, urllib oder urllib2 verwenden, aber alle sind nur Wrapper für die URL-Fetch-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 so verwenden, wie Sie es für das Abrufen von HTTP-URLs erwarten würden.

1 Stimmen

Wie erstellt jemand eine URL mit einer kodierten Abfragezeichenfolge mit urllib2? Es ist der einzige Grund, ich bin mit urllib und ich möchte sicherstellen, dass ich alles tun, die neueste/größte Weg.

2 Stimmen

Wie in meinem obigen Beispiel, verwenden Sie urlopen() y Request von urllib2 und Sie verwenden urlencode() von urllib . Es kann nicht schaden, beide Bibliotheken zu verwenden, solange Sie sicherstellen, dass Sie die richtige urlopen verwenden. Die [urllib docs][1] sind sich darüber im Klaren, dass dies eine akzeptierte Verwendung ist. [1]: docs.python.org/library/urllib2.html#urllib2.urlopen

0 Stimmen

Ich habe ce gist für urllib2.urlopen ; enthält auch andere Varianten.

68voto

Siyaram Malav Punkte 3562

urllib y urllib2 sind beides Python-Module, die sich mit URL-Anfragen befassen, 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 urlencode Methode, die für die Generierung von GET-Abfragezeichenfolgen verwendet wird, verfügt urllib2 nicht über eine solche Funktion. Dies ist einer der Gründe, warum urllib oft zusammen mit urllib2 verwendet wird.

Anfragen an - Requests" ist eine einfache, benutzerfreundliche HTTP-Bibliothek, die in Python geschrieben wurde.

1) Python Requests kodiert die Parameter automatisch, so dass Sie sie als einfache Argumente übergeben können, anders als im Fall von urllib, wo Sie die Methode urllib.encode() um die Parameter zu kodieren, bevor sie übergeben werden.

2) Es dekodiert die Antwort automatisch in Unicode.

3) Requests hat auch eine weitaus bequemere Fehlerbehandlung: Wenn die Authentifizierung fehlschlägt, würde urllib2 einen urllib2.URLError auslösen, während Requests wie erwartet ein normales Antwortobjekt zurückgibt. Alles, was Sie tun müssen, um zu sehen, ob die Anfrage erfolgreich war, ist ein Boolean Antwort.ok

23 Stimmen

Was ist mit urllib3?

5 Stimmen

@PiratenApp Anfragen wird auf der Grundlage von urllib3 . Ich denke, Code mit urllib3 direkt kann effizienter sein, weil es Sie die Sitzung wiederverwenden können, während Anforderungen (zumindest Anforderungen 2, die jeder verwendet) erstellt eine für jede Anforderung, aber zitieren Sie mich nicht auf das. Beide sind nicht Teil der Standardbibliothek ( dennoch )

40voto

Zeitgeist Punkte 1162

Nur um die vorhandenen Antworten zu ergänzen: Ich sehe niemanden, der erwähnt, dass Python Requests keine native Bibliothek ist. Wenn Sie mit dem Hinzufügen von Abhängigkeiten in Ordnung sind, dann ist Requests 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.

3 Stimmen

Stimmt, wenn Sie keine Abhängigkeiten hinzufügen wollen, ist urllib verfügbar. Aber beachten Sie, dass auch die Offizielle Python-Dokumentation empfiehlt die Bibliothek der Anfragen: "Das Requests-Paket wird für eine übergeordnete HTTP-Client-Schnittstelle empfohlen."

5 Stimmen

@hlongmore Natürlich würden die meisten Leute nicht mit der niedrigen Ebene urllib beschäftigen wollen, und Requests Bibliothek bietet eine schöne Ebene der Abstraktion. Es ist, als würde man eine Pfannkuchenmischung aus der Packung verwenden, anstatt sie von Grund auf neu zu machen. Vor- und Nachteile.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X