Domanda

In Python, quali sono le differenze tra il urllib, urllib2, urllib3 e requests modulo?Perché ci sono tre?Essi sembrano fare la stessa cosa...

È stato utile?

Soluzione

So che è stato già detto, ma mi raccomando la requests Pacchetto Python.

Se hai utilizzato altre lingue oltre a python, probabilmente stai pensando urllib e urllib2 sono facili da usare, non tanto di codice, e molto capace, che come ho usato per pensare.Ma il requests il pacchetto è così incredibilmente utile e breve che tutti dovrebbero essere.

Primo, supporta completamente API restful, ed è molto semplice:

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

Indipendentemente dal fatto che GET / POST, non è necessario codificare i parametri di nuovo, ci vuole semplicemente un dizionario come argomento è buono per andare:

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

In più ha anche un built in JSON decoder (di nuovo, mi sa json.loads() non è molto di più a scrivere, ma questo è sicuramente conveniente):

resp.json()

O se la risposta data è solo testo, utilizzare:

resp.text

Questa è solo la punta dell'iceberg.Questo è l'elenco delle caratteristiche richieste sito:

  • Internazionale Domini e Url
  • Keep-Alive & Pool Di Connessioni
  • Sessioni di Cookie Persistenza
  • Browser in stile SSL Verifica
  • Di Base/Autenticazione Del Digest
  • Elegante Chiave/Valore Cookie
  • La Decompressione Automatica
  • Unicode Risposta Organismi
  • Multipart L'Upload Di File
  • Il Timeout Di Connessione
  • .sotto il supporto
  • Voce di elenco
  • Python 2.6—3.4
  • Thread-safe.

Altri suggerimenti

urllib2 offre alcune funzionalità aggiuntive, vale a dire il urlopen() la funzione consente di specificare le intestazioni (normalmente avresti dovuto usare httplib in passato, che è molto più dettagliata.) Ancora più importante, però, urllib2 fornisce il Request classe di, che permette un approccio dichiarativo per fare una richiesta:

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

Nota che urlencode() è solo in urllib, non urllib2.

Ci sono anche i gestori per l'attuazione di ulteriori URL avanzati di supporto in urllib2.La risposta breve è che, a meno che non si sta lavorando con il codice legacy, si probabilmente desidera utilizzare l'URL opener da urllib2, ma hai ancora bisogno di importare in urllib per alcune funzioni di utilità.

Bonus risposta Con Google App Engine, è possibile utilizzare qualsiasi di httplib, urllib o urllib2, ma tutti loro sono solo wrapper per Google URL Fetch API.Che è ancora soggetto alle stesse limitazioni, quali porte, protocolli, e la lunghezza della risposta ammessi.È possibile utilizzare il core delle biblioteche come ci si aspetterebbe per il recupero Url HTTP, però.

urllib e urllib2 sono entrambi moduli Python che fanno cose relative richiesta URL ma offrono diverse funzionalità.

1) urllib2 può accettare un oggetto di richiesta per impostare le intestazioni per una richiesta di URL, urllib accetta solo un URL.

2) urllib fornisce il urlencode metodo che viene utilizzato per la generazione di GET stringhe di query, urllib2 non ha tale funzione. Questo è uno dei motivi per cui urllib è spesso usato insieme ad urllib2.

richieste -. Richieste è un semplice, libreria HTTP facile da usare, scritto in Python

1) Le richieste Python codifica automaticamente i parametri in modo che solo passarli come argomenti semplici, a differenza del caso di urllib, in cui è necessario utilizzare il metodo urllib.encode () per codificare i parametri prima di passarli.

2) decodificato automaticamente la risposta in Unicode.

3) Le richieste ha anche molto più conveniente errore handling.If l'autenticazione non è riuscita, urllib2 sarebbe sollevare un urllib2.URLError, mentre le richieste sarebbero tornati un oggetto risposta normale, come previsto. Tutto quello che dovete vedere se la richiesta ha avuto successo da booleana response.ok

Per esempio di riferimento - https://dancallahan.info/journal/python-requests/

urllib2.urlopen accetta un'istanza della classe richiesta o un'URL, mentre urllib.urlopen accetta solo un URL.

Una discussione simile ha avuto luogo qui: http://www.velocityreviews.com/forums /t326690-urllib-urllib2-what-is-the-difference.html

Mi piace la funzione urllib.urlencode, e non sembra esistere in urllib2.

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

Una notevole differenza sta porting python2 a python3. urllib2 non esiste per i python3 ei suoi metodi portato su urllib. Quindi si utilizza tale pesantemente e desidera migrare a python3 in futuro, considerare l'utilizzo di urllib. Tuttavia strumento 2to3 farà automaticamente la maggior parte del lavoro per voi.

Giusto per aggiungere alle risposte esistenti, non vedo nessuno di nota che le richieste di pitone non è una libreria nativa. Se siete ok con le dipendenze, aggiungendo, quindi richiede va bene. Tuttavia, se si sta cercando di evitare di aggiungere le dipendenze, urllib è una libreria python nativa che è già a disposizione di voi.

Si dovrebbe in genere utilizzare urllib2, dal momento che questo rende le cose un po 'più facile, a volte accettando oggetti di richiesta e sarà anche sollevare un'URLException su errori di protocollo. Con Google App Engine, però, non è possibile utilizzare. Devi usare la URL Fetch API che Google fornisce nella sua Python in modalità sandbox ambiente.

Per ottenere il contenuto di un URL:

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.

E 'difficile scrivere python2 e python3 e le dipendenze request codice per le risposte, perché urlopen() funzioni e la funzione requests.get() restituiscono tipi diversi:

  • python2 urllib.request.urlopen() restituisce un http.client.HTTPResponse
  • python3 urllib.urlopen(url) restituisce un instance
  • Richiesta request.get(url) restituisce un requests.models.Response

Un punto chiave che trovo manca nelle risposte di cui sopra è che urllib restituisce un oggetto di tipo <class http.client.HTTPResponse> mentre i rendimenti requests <class 'requests.models.Response'>.

A causa di questo, read () metodo può essere utilizzato con urllib ma non con requests.

P.S. : requests è già ricco di tanti metodi che non ha bisogno una più come read();>

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top