wake-up-neo.net

Was sind die Unterschiede zwischen dem urllib-, dem urllib2- und dem Anforderungsmodul?

Was sind in Python die Unterschiede zwischen dem Modul urllib, urllib2 und requests ? Warum gibt es drei? Sie scheinen dasselbe zu tun ...

654
Paul Biggar

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, dass urllib und urllib2 einfach zu verwenden sind, nicht viel Code und sehr leistungsfähig, so dachte ich früher. Aber das Paket requests 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')

Unabhängig davon, ob Sie GET/POST verwenden oder nicht, müssen Sie die Parameter nie wieder codieren. Es wird lediglich ein Wörterbuch als Argument verwendet.

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, dass json.loads() nicht viel mehr zu schreiben ist, aber das ist sicher praktisch):

resp.json()

Wenn es sich bei Ihren Antwortdaten nur um Text handelt, verwenden Sie:

resp.text

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

  • 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-Antwortkörper
  • Upload mehrteiliger Dateien
  • Verbindungs-Timeouts
  • .netrc Unterstützung
  • Listenpunkt
  • Python 2.6 - 3.4
  • Thread-sicher.
633
Hutch

urllib2 bietet einige zusätzliche Funktionen, nämlich die Funktion urlopen(), mit der Sie Header angeben können (normalerweise mussten Sie in der Vergangenheit httplib verwenden, was weitaus ausführlicher ist.) Noch wichtiger ist jedoch, dass urllib2 die Funktion Request -Klasse, die einen aussagekräftigeren Ansatz für die Ausfü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() nur in urllib ist, nicht in urllib2.

Es gibt auch Handler für die Implementierung einer erweiterten URL-Unterstützung in urllib2. Die kurze Antwort lautet: Wenn Sie nicht mit altem Code arbeiten, möchten Sie wahrscheinlich den URL-Öffner von urllib2 verwenden, müssen aber dennoch für einige der Dienstprogrammfunktionen 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-Fetch-API von Google. Das heißt, Sie unterliegen weiterhin den gleichen Einschränkungen wie Ports, Protokolle und der zulässigen Länge der Antwort. Sie können den Kern der Bibliotheken jedoch wie erwartet zum Abrufen von HTTP-URLs verwenden.

191
Crast

urllib und urllib2 sind beide Python Module, die URL-bezogene Inhalte anfordern, aber unterschiedliche Funktionen anbieten.

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

2) urllib stellt die urlencode Methode zur Verfügung, die zur Generierung von GET Query Strings 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 vor der Übergabe zu codieren.

2) Die Antwort wird automatisch in Unicode dekodiert.

3) Requests hat auch eine weitaus bequemere Fehlerbehandlung. Wenn Ihre Authentifizierung fehlschlägt, würde urllib2 einen urllib2.URLError auslösen, während Requests erwartungsgemäß ein normales Antwortobjekt zurückgeben würde. Alles was Sie sehen müssen, um zu sehen, ob die Anfrage erfolgreich war. Boolean response.ok

Zum Beispiel Referenz - https://dancallahan.info/journal/python-requests/

38
Siyaram Malav

urllib2.urlopen akzeptiert eine Instanz der Request-Klasse oder eine URL, während urllib.urlopen nur eine URL akzeptiert.

Eine ähnliche Diskussion fand hier statt: http://www.velocityreviews.com/forums/t326690-urllib-urllib2-what-is-the-difference.html

12
Danny Roberts

Ich mag die Funktion urllib.urlencode und sie scheint in urllib2 nicht zu existieren.

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

Ein wesentlicher Unterschied besteht darin, Python2 auf Python3 zu portieren. urllib2 existiert nicht für python3 und seine nach urllib portierten Methoden. Sie verwenden das also sehr häufig und möchten in Zukunft auf Python3 migrieren, ziehen Sie die Verwendung von urllib in Betracht. Das 2to3-Tool erledigt jedoch automatisch den größten Teil der Arbeit für Sie.

10
Arash

Nur um die vorhandenen Antworten zu ergänzen, sehe ich niemanden, der erwähnt, dass python Anfragen keine native Bibliothek sind. Wenn Sie Abhängigkeiten hinzufügen können, 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.

8
Zeitgeist

Sie sollten in der Regel urllib2 verwenden, da dies durch das Akzeptieren von Request-Objekten zuweilen zu einer Erleichterung führt und außerdem eine URLException bei Protokollfehlern auslöst. Mit Google App Engine können Sie jedoch auch nicht verwenden. Sie müssen das RL Fetch API verwenden, das Google in seiner Python Sandbox-Umgebung bereitstellt.

5
Chinmay Kanchi

So rufen Sie den Inhalt einer URL ab:

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.

Es ist schwierig, Python2- und Python3- und request-Abhängigkeitscode für die Antworten zu schreiben, da sie urlopen() -Funktionen und requests.get() -Funktionen unterschiedliche Typen zurückgeben:

  • Python2 urllib.request.urlopen() gibt einen http.client.HTTPResponse zurück
  • Python3 urllib.urlopen(url) gibt ein instance zurück
  • Request request.get(url) gibt einen requests.models.Response zurück
5
alvas

Ein wichtiger Punkt, den ich in den obigen Antworten vermisse, ist, dass urllib ein Objekt vom Typ <class http.client.HTTPResponse> zurückgibt, während requests<class 'requests.models.Response'> zurückgibt.

Aus diesem Grund kann die read () -Methode mit urllib verwendet werden, nicht jedoch mit requests.

P.S. : requests ist bereits reich an so vielen Methoden, dass es kaum noch eine als read();> benötigt

1
paradoxlover