Question Quelles sont les différences entre le module urllib, urllib2 et demandes?


En Python, quelles sont les différences entre les urllib, urllib2, et requests module? Pourquoi y en a-t-il trois? Ils semblent faire la même chose ...


533
2018-01-07 03:26


origine


Réponses:


Je sais que cela a déjà été dit, mais je recommande fortement le paquet Requêtes python: http://docs.python-requests.org/en/latest/index.html

Si vous avez utilisé des langages autres que python, vous pensez probablement que urllib et urllib2 sont faciles à utiliser, pas beaucoup de code et très performants, c'est ce que je pensais. Mais le paquet Requests est si incroyablement utile et court que tout le monde devrait l'utiliser.

Tout d'abord, il prend en charge une API totalement 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')

Peu importe si GET / POST vous n'avez plus besoin d'encoder les paramètres, il prend simplement un dictionnaire comme argument et est bon à 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 json.loads () n'est pas beaucoup plus à écrire, mais cela est pratique):

resp.json()

Ou si vos données de réponse ne sont que 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
  • Keep-Alive & Connection Pooling
  • Sessions avec persistance de cookies
  • Vérification SSL de type navigateur
  • Authentification de base / Digest
  • Clé élégante / Cookies de valeur
  • Décompression automatique
  • Corps de réponse Unicode
  • Téléchargement de fichiers en plusieurs parties
  • Délais de connexion
  • Prise en charge de .netrc
  • Élément de liste
  • Python 2.6-3.4
  • Thread-safe.

545
2018-02-11 00:32



urllib2 fournit des fonctionnalités supplémentaires, à savoir urlopen() La fonction peut vous permettre de spécifier des en-têtes (normalement vous auriez dû utiliser httplib dans le passé, ce qui est beaucoup plus bavard.) Plus important encore, urllib2 fournit le Request class, qui permet une approche plus déclarative pour faire une 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 seulement dans l'urllib, pas urllib2.

Il existe également des gestionnaires pour implémenter un support URL plus avancé dans urllib2. La réponse courte est, à moins que vous ne travailliez avec le code hérité, vous voulez probablement utiliser l'ouvre d'URL d'urllib2, mais vous devez toujours importer dans urllib pour certaines des fonctions utilitaires.

Réponse en prime Avec Google App Engine, vous pouvez utiliser n'importe quel httplib, urllib ou urllib2, mais tous ne sont que des wrappers pour l'API URL Fetch de Google. Autrement dit, vous êtes toujours soumis aux mêmes limitations telles que les ports, les protocoles et la durée de la réponse autorisée. Cependant, vous pouvez utiliser le noyau des bibliothèques comme vous le souhaitez pour récupérer des URL HTTP.


182
2018-01-07 03:43



urllib et urllib2 sont deux modules Python qui font des choses liées à la requête d'URL mais offrent 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 le urlencode méthode qui est utilisée pour la génération de chaînes de requête GET, urllib2 n'a pas une telle fonction. C'est une des raisons pour lesquelles urllib est souvent utilisé avec urllib2.

Requêtes - Requests 'est une bibliothèque HTTP simple et facile à utiliser écrite en Python.

1) Les requêtes Python encodent automatiquement les paramètres de sorte que vous les transmettez simplement comme des arguments simples, contrairement à urllib, où vous devez utiliser la méthode urllib.encode () encoder les paramètres avant de les passer.

2) Il a décodé automatiquement la réponse en Unicode.

3) Les requêtes ont également une gestion des erreurs beaucoup plus pratique. Si votre authentification échouait, urllib2 soulèverait urllib2.URLError, tandis que Requests retournerait un objet de réponse normal, comme prévu. Tout ce que vous avez à voir si la requête a été couronnée de succès par boolean response.ok

Par exemple référence - https://dancallahan.info/journal/python-requests/


28
2017-09-10 04:14



urllib2.urlopen accepte une instance de la classe Request ou une URL, alors que urllib.urlopen n'accepte qu'une URL.

Une discussion similaire a eu lieu ici: http://www.velocityreviews.com/forums/t326690-urllib-urllib2-what-is-the-difference.html


11
2018-01-07 03:29



J'aime le urllib.urlencode fonction, et il ne semble pas exister dans urllib2.

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

9
2018-01-07 03:51



Une différence considérable concerne le portage de Python2 vers Python3. urllib2 n'existe pas pour python3 et ses méthodes sont portées sur urllib. Donc vous l'utilisez beaucoup et vous voulez migrer vers Python3 à l'avenir, pensez à utiliser urllib. Cependant, l'outil 2to3 effectuera automatiquement la plupart du travail pour vous.


7
2018-04-27 01:07



Vous devriez généralement utiliser urllib2, car cela rend les choses un peu plus faciles en acceptant les objets Request et déclenche également une erreur URLException sur les erreurs de protocole. Avec Google App Engine, vous ne pouvez pas non plus l'utiliser. Vous devez utiliser le URL Fetch API que Google fournit dans son environnement Python en bac à sable.


5
2018-01-07 03:36



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 Python2 et Python3 et request code de dépendances pour les réponses, car ils urlopen() fonctions et requests.get() fonction renvoie différents types:

  • Python2 urllib.request.urlopen() retourne un http.client.HTTPResponse
  • Python3 urllib.urlopen(url) retourne un instance
  • Demande request.get(url) retourne un requests.models.Response

4
2017-12-20 02:29



Juste pour ajouter aux réponses existantes, je ne vois personne mentionner que les requêtes python ne sont pas une bibliothèque native. Si vous êtes d'accord avec l'ajout de dépendances, les demandes sont correctes. Cependant, si vous essayez d'éviter d'ajouter des dépendances, urllib est une bibliothèque python native qui est déjà disponible pour vous.


3
2017-10-30 18:42