Question

En Python, quelles sont les différences entre les urllib, urllib2, urllib3 et < a href = "http://docs.python-requests.org/en/latest/index.html" rel = "nofollow noreferrer"> requests module? Pourquoi y at-il trois? Ils semblent faire la même chose ...

Était-ce utile?

La solution

Je sais que ça a déjà été dit, mais je recommande vivement le requests paquet python.

Si vous avez des langues internationales autres que python, vous pensez probablement urllib et urllib2 sont faciles à utiliser, pas beaucoup de code, et très capable, voilà comment je pensais. Mais le paquet requests est si incroyablement utile et court que tout le monde devrait être l'utiliser.

Tout d'abord, il prend en charge une API entièrement reposant, et est aussi facile 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 ne devez encoder à nouveau les paramètres, il faut simplement un dictionnaire comme argument et il est bon d'aller:

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 (encore une fois, je sais json.loads() est pas beaucoup plus à écrire, mais cela est sûr pratique):

resp.json()

Ou si vos données de réponse est juste le texte, utilisez:

resp.text

Ceci est juste la pointe de l'iceberg. Voici la liste des fonctionnalités du site demande:

  • Domaines internationaux et les URL
  • Keep-Alive & Connection Pooling
  • Sessions avec persistance Cookie
  • style du navigateur de vérification SSL
  • Authentification de base / Digest
  • élégante clé / valeur Cookies
  • automatique Décompression
  • Organes de réponse Unicode
  • multipart Envoi de fichiers
  • Connexion Timeouts
  • soutien .netrc
  • Liste élément
  • Python 02.06 à 03.04
  • Thread-safe.

Autres conseils

urllib2 fournit des fonctionnalités supplémentaires, à savoir la fonction urlopen() peut vous permettre de spécifier les en-têtes (normalement, vous auriez dû utiliser httplib dans le passé, ce qui est beaucoup plus bavard.) Plus important encore, urllib2 fournit la classe Request, ce qui permet une approche plus déclarative à faire une demande:

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 que dans urllib, non urllib2.

Il y a aussi des gestionnaires pour implémenter le support d'URL plus avancés dans urllib2. La réponse courte est, à moins que vous travaillez avec le code existant, vous voulez probablement utiliser l'ouvre-URL de urllib2, mais vous avez encore besoin d'importer dans urllib pour certaines des fonctions utilitaires.

Réponse Bonus Avec Google App Engine, vous pouvez utiliser l'une des httplib, urllib ou urllib2, mais ils sont tous que des emballages pour l'URL de Google Fetch API. Autrement dit, 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 utiliser le noyau des bibliothèques que vous attendez pour récupérer les URL HTTP, bien que.

urllib et urllib2 sont les deux modules Python qui font des choses liées à la demande d'URL, mais offrent des fonctionnalités différentes.

1) urllib2 peut accepter un objet de demande de définir les en-têtes pour une requête d'URL, urllib accepte uniquement une URL.

2) urllib fournit la méthode urlencode qui est utilisé pour la génération de chaînes de requête GET, urllib2 ne possède pas une telle fonction. Ceci est l'une des raisons pour lesquelles urllib est souvent utilisé avec urllib2.

Demandes -. Les demandes est une simple bibliothèque HTTP facile à utiliser écrit en Python

1) Python Les demandes encode les paramètres automatiquement afin que vous les transmettre aussi des arguments simples, à la différence dans le cas de urllib, où vous devez utiliser la méthode urllib.encode () pour coder les paramètres avant de les transmettre.

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

3) Les demandes également erreur a beaucoup plus pratique handling.If votre authentification a échoué, urllib2 soulèverait un urllib2.URLError, tandis que les demandes retourneraient un objet de réponse normale, comme prévu. Tout ce que vous devez voir si la demande a réussi par booléenne response.ok

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

urllib2.urlopen accepte une instance de la classe de demande ou d'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 il ne semble pas exister dans urllib2.

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

Une différence considérable est sur le portage python2 à python3. urllib2 n'existe pas pour python3 et ses méthodes de portage urllib. Donc, vous utilisez que fortement et que vous souhaitez migrer vers python3 à l'avenir, envisagez d'utiliser urllib. Cependant outil 2to3 fera automatiquement la plupart des travaux pour vous.

Il suffit d'ajouter les réponses existantes, je ne vois personne de mentionner que les demandes de python n'est pas une bibliothèque native. Si vous êtes ok avec l'ajout de dépendances, puis demande est très bien. Toutefois, si vous essayez d'éviter d'ajouter des dépendances, urllib est une bibliothèque de python natif qui est déjà à votre disposition.

Vous devez utiliser généralement urllib2, car cela rend les choses un peu plus facile parfois en acceptant des objets de demande et soulèvera également un URLException sur les erreurs de protocole. Avec Google App Engine cependant, vous ne pouvez pas utiliser non plus. Vous devez utiliser l'URL Fetch API que Google fournit dans son sandbox Python environnement.

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 dépendances request code pour les réponses parce qu'ils urlopen() fonctions et la fonction requests.get() retour 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

Un point essentiel que je trouve manque dans les réponses ci-dessus est que urllib retourne un objet de type <class http.client.HTTPResponse> alors que les rendements requests <class 'requests.models.Response'>.

Méthode En raison de cela, lire () peut être utilisé avec urllib mais pas avec requests.

P.S. : requests est déjà riche avec tant de méthodes dont il a besoin à peine un plus comme read();>

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top