Frage

In Python, was sind die Unterschiede zwischen der urllib, urllib2, urllib3 und < a href = "http://docs.python-requests.org/en/latest/index.html" rel = "nofollow noreferrer"> requests Modul? Warum gibt es drei? Sie scheinen das gleiche zu tun ...

War es hilfreich?

Lösung

Ich weiß es schon gesagt, aber ich würde die requests Python-Paket.

Wenn Sie verwendeten Sprachen haben andere als Python, sind Sie wahrscheinlich urllib und urllib2 Denken sind einfach zu bedienen, nicht viel Code und hochleistungsfähig, das ist, wie ich denke, verwendet. Aber das requests Paket ist so unglaublich nützlich und kurz, dass jeder sein sollte, es zu benutzen.

Erstens unterstützt es eine voll 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')

Unabhängig davon, ob GET / POST, müssen Sie nie wieder Parameter codieren, dauert es 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)

Plus es hat sogar ein in JSON-Decoder eingebaut (wieder, ich weiß json.loads() ist nicht viel mehr zu schreiben, aber das ist sicher bequem):

resp.json()

Oder wenn Ihre Antwortdaten ist nur Text, verwenden Sie:

resp.text

Dies ist nur die Spitze des Eisbergs. Dies ist die Liste der Features von den Anfragen Website:

  • Internationale Domains und URLs
  • Keep-Alive & Connection Pooling
  • Sitzungen mit persistenten Cookies
  • Browser-Stil SSL Verification
  • Basic / Digest-Authentifizierung
  • Elegant Schlüssel / Wert-Plätzchen
  • Automatische Dekomprimierung
  • Unicode-Response-Bodies
  • Mehrteiliger Datei-Uploads
  • Verbindung Timeouts
  • .netrc Unterstützung
  • Liste item
  • Python 2,6-3,4
  • Thread-sicher.

Andere Tipps

urllib2 einige zusätzliche Funktionen bietet, nämlich die urlopen() Funktion erlauben können Sie Header angeben (normalerweise würden Sie httplib in der Vergangenheit zu verwenden gehabt haben, die weit ausführlicher ist.) Noch wichtiger ist aber, urllib2 stellt die Request Klasse, die für einen deklarativen Ansatz ermöglicht eine Anfrage zu tun:

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 für erweiterte URL-Unterstützung in urllib2 implementieren. Die kurze Antwort ist, es sei denn, Sie mit Legacy-Code arbeiten, werden Sie wahrscheinlich die URL Opener von urllib2 verwenden möchten, aber Sie müssen noch für einige der Utility-Funktionen in urllib importieren.

Bonus Antwort Mit Google App Engine, können Sie alle httplib, urllib oder urllib2 verwenden, aber alle von ihnen sind nur Wrapper für die Google-URL API abrufen. Das heißt, Sie sind immer noch unterliegen den gleichen Einschränkungen wie Ports, Protokolle und die Länge der Antwort erlaubt. Sie können den Kern der Bibliotheken verwenden, wie Sie für das Abrufen von HTTP-URLs erwarten würden, aber.

urllib und urllib2 sind beide Python-Module, die URL-Anfrage bezogenes tun, sondern bieten unterschiedliche Funktionalitäten.

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

2) urllib liefert die urlencode Methode, die für die Erzeugung von GET Query-Strings verwendet wird, urllib2 nicht über eine solche Funktion. Dies ist einer der Gründe, warum urllib oft zusammen mit urllib2 verwendet wird.

Anfragen -. Anfrage ist eine einfache, leicht zu bedienende HTTP-Bibliothek in Python geschrieben

1) Python Requests codiert die Parameter automatisch, so dass Sie sie nur als einfache Argumente übergeben, anders als im Fall von urllib, in dem Sie die Methode verwenden, müssen urllib.encode () , um die Parameter zu codieren vor ihnen vorbei.

2) Es decodiert automatisch die Antwort in Unicode.

3) ersucht hat auch viel bequemer Fehler Abwicklung mit Ihrer Authentifizierung fehlgeschlagen, würde urllib2 eine urllib2.URLError erhöhen, während Anfragen eine normale Antwort Objekt zurückgeben würde, wie erwartet. Alle müssen Sie sehen, ob die Anfrage von boolean erfolgreich war response.ok

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

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

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

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

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

Ein wesentlicher Unterschied besteht darin, über Python2 zu Python3 portieren. urllib2 existiert nicht für python3 und seine Methoden portiert urllib. So verwenden Sie das stark und wollen Python3 in Zukunft migrieren, sollten urllib verwenden. Allerdings wird 2to3-Tool automatisch tun die meiste Arbeit für Sie.

Nur um die vorhandenen Antworten hinzuzufügen, ich sehe niemand, dass Python-Anfragen ist keine native Bibliothek zu erwähnen. Wenn Sie mit dem Hinzufügen von Abhängigkeiten ok sind, fordert dann in Ordnung ist. Wenn Sie jedoch versuchen, um Abhängigkeiten zu vermeiden Hinzufügen urllib ist eine native Python-Bibliothek, die Sie bereits zur Verfügung steht.

Sie sollten in der Regel urllib2 verwenden, da diese Dinge ein wenig einfacher zu Zeiten machen von Request Objekte zu akzeptieren und wird auch ein URLException auf Protokollfehler erhöhen. Mit Google App Engine obwohl, können Sie auch nicht verwenden. Sie haben die URL Fetch API verwenden , dass Google in seiner Sandbox Python bietet Umwelt.

Um den Inhalt einer URL zu erhalten:

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 schwer Python2 und Python3 und request Abhängigkeiten Code für die Antworten zu schreiben, weil sie Funktionen urlopen() und requests.get() Funktion verschiedene Typen zurück:

  • Python2 urllib.request.urlopen() gibt einen http.client.HTTPResponse
  • Python3 urllib.urlopen(url) gibt ein instance
  • Anfrage request.get(url) gibt eine requests.models.Response

Ein wichtiger Punkt, den ich in den oben genannten Antworten fehlt, ist, dass urllib ein Objekt vom Typ <class http.client.HTTPResponse> kehrt während requests kehrt <class 'requests.models.Response'>.

Aufgrund dieser Tatsache lesen () -Methode mit urllib verwendet werden kann, aber nicht mit requests.

P. S. : requests ist mit so vielen Methoden, die bereits reich, dass es ein mehr als read() kaum benötigt;>

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top