web-dev-qa-db-fra.com

Quelles sont les différences entre les modules urllib, urllib2 et request?

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 ...

654
Paul Biggar

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:

  • Domaines et URL internationaux
  • Maintien en vie et mise en commun des connexions
  • Sessions avec persistance des cookies
  • Vérification SSL de type navigateur
  • Authentification de base/Digest
  • Biscuits élégants de clé/valeur
  • Décompression automatique
  • Corps de réponse Unicode
  • Téléchargement de fichiers en plusieurs parties
  • Délais de connexion
  • soutien .netrc
  • Élément de liste
  • Python 2.6-3.4
  • Fil-safe.
633
Hutch

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.

191
Crast

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/

38
Siyaram Malav

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

12
Danny Roberts

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'
11
Gattster

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.

10
Arash

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.

8
Zeitgeist

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.

5
Chinmay Kanchi

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:

  • Python2 urllib.request.urlopen() renvoie un http.client.HTTPResponse
  • Python3 urllib.urlopen(url) renvoie un instance
  • Request request.get(url) renvoie un requests.models.Response
5
alvas

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();>

1
paradoxlover