En Python, quelles sont les différences entre les modules urllib
, urllib2
et requests
? Pourquoi y a-t-il trois? Ils semblent faire la même chose ...
Je sais que cela a déjà été dit, mais je recommanderais vivement le package requests
Python.
Si vous avez utilisé des langages autres que Python, vous pensez probablement que urllib
et urllib2
sont faciles à utiliser, peu de code et très performants, c'est ce que j'avais l'habitude de penser. Mais le paquetage requests
est tellement court et utile que tout le monde devrait l’utiliser.
Premièrement, il prend en charge une API entièrement reposante et est aussi simple que:
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')
Que ce soit avec GET/POST ou plus, vous n’aurez plus jamais à encoder de paramètres, il faut simplement un dictionnaire comme argument et il est bon de le faire:
userdata = {"firstname": "John", "lastname": "Doe", "password": "jdoe123"}
resp = requests.post('http://www.mywebsite.com/user', data=userdata)
De plus, il a même un décodeur JSON intégré (encore une fois, je sais que json.loads()
n’est pas beaucoup plus à écrire, mais c’est bien pratique):
resp.json()
Ou si vos données de réponse sont uniquement du texte, utilisez:
resp.text
Ce n'est que la pointe de l'iceberg. Voici la liste des fonctionnalités du site des demandes:
urllib2 fournit des fonctionnalités supplémentaires, à savoir la fonction urlopen()
peut vous permettre de spécifier des en-têtes (normalement, vous auriez dû utiliser httplib dans le passé, ce qui est beaucoup plus détaillé.) Plus important encore, urllib2 fournit le Request
class, qui permet une approche plus déclarative de la requête:
r = Request(url='http://www.mysite.com')
r.add_header('User-Agent', 'awesome fetcher')
r.add_data(urllib.urlencode({'foo': 'bar'})
response = urlopen(r)
Notez que urlencode()
est uniquement dans urllib, pas urllib2.
Il existe également des gestionnaires pour implémenter un support plus avancé des URL dans urllib2. La réponse courte est que, sauf si vous travaillez avec du code hérité, vous souhaiterez probablement utiliser l'ouvre-URL de urllib2, mais vous devez tout de même importer dans urllib pour certaines fonctions de l'utilitaire.
Réponse bonus Avec Google App Engine, vous pouvez utiliser httplib, urllib ou urllib2, mais tous ne sont que des wrappers pour l'API URL Fetch de Google. En d'autres termes, vous êtes toujours soumis aux mêmes limitations, telles que les ports, les protocoles et la longueur de la réponse autorisée. Vous pouvez cependant utiliser le noyau des bibliothèques comme vous le souhaitez pour récupérer les URL HTTP.
urllib et urllib2 sont tous deux Python modules qui faire des choses liées à la demande d'URL mais offre des fonctionnalités différentes.
1) urllib2 peut accepter un objet Request pour définir les en-têtes d'une requête d'URL, urllib n'accepte qu'une URL.
2) urllib fournit la méthode urlencode utilisée pour la génération de chaînes de requête GET, urllib2 n’ayant pas cette fonction. C'est l'une des raisons pour lesquelles urllib est souvent utilisé avec urllib2.
Requests - Requests ’est une bibliothèque HTTP simple et facile à utiliser, écrite en Python.
1) Python Requests encode les paramètres automatiquement, il vous suffit donc de les transmettre sous forme d'arguments simples, contrairement à urllib, où vous devez utiliser la méthode urllib.encode ( ) pour encoder les paramètres avant de les transmettre.
2) Il a automatiquement décodé la réponse en Unicode.
3) Les requêtes ont également une gestion des erreurs beaucoup plus pratique. Si votre authentification échouait, urllib2 déclencherait une erreur urllib2.URLE, alors que Requests renverrait un objet de réponse normal, comme prévu. Tout ce que vous avez à voir si la requête a été acceptée par booléen response.ok
Par exemple, référence - https://dancallahan.info/journal/python-requests/
urllib2.urlopen accepte une instance de la classe Request ou une URL, alors que urllib.urlopen accepte uniquement une URL.
Une discussion similaire a eu lieu ici: http://www.velocityreviews.com/forums/t326690-urllib-urllib2- what-is-the-difference.html
J'aime la fonction urllib.urlencode
et elle ne semble pas exister dans urllib2
.
>>> urllib.urlencode({'abc':'d f', 'def': '-!2'})
'abc=d+f&def=-%212'
Une différence considérable concerne le portage de Python2 vers Python3. urllib2 n'existe pas pour python3 et ses méthodes portées sur urllib. Donc, si vous utilisez beaucoup et que vous souhaitez migrer vers Python3, envisagez d'utiliser urllib. Cependant, l'outil 2to3 fera automatiquement la plupart du travail à votre place.
Juste pour ajouter aux réponses existantes, je ne vois personne dire que python request n'est pas une bibliothèque native. Si vous acceptez d'ajouter des dépendances, alors les demandes sont acceptables. Cependant, si vous essayez d'éviter d'ajouter des dépendances, urllib est une bibliothèque native python déjà disponible.
Vous devriez généralement utiliser urllib2, car cela rend parfois les choses plus simples en acceptant les objets Request et génère également une exception URLException sur les erreurs de protocole. Avec Google App Engine, vous ne pouvez pas utiliser non plus. Vous devez utiliser le RL Fetch API fourni par Google dans son environnement sandboxed Python.
Pour obtenir le contenu d'une 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.
Il est difficile d’écrire les codes de dépendance Python2 et Python3 et request
pour les réponses car elles urlopen()
fonctions et requests.get()
fonctions renvoient différents types:
urllib.request.urlopen()
renvoie un http.client.HTTPResponse
urllib.urlopen(url)
renvoie un instance
request.get(url)
renvoie un requests.models.Response
Un point clé qui me manque dans les réponses ci-dessus est que urllib renvoie un objet de type <class http.client.HTTPResponse>
alors que requests
renvoie <class 'requests.models.Response'>
.
Pour cette raison, la méthode read () peut être utilisée avec urllib
mais pas avec requests
.
P.S. : requests
est déjà riche en méthodes si nombreuses qu'il en faut à peine une de plus que read()
;>