En Python, quelles sont les différences entre les urllib
, urllib2
, urllib3
et requests
modules? Pourquoi y en a-t-il trois? Ils semblent faire la même chose ...
python
python-requests
urllib2
urllib
python-2.x
Paul Biggar
la source
la source
requests
plupart du temps.urllib2
fonctionne parfois mais nécessite plus de code et est moins élégant. ne pas utiliserurllib
.urllib
Python 3 est encore une autre option, nettoyée de diverses manières. Mais heureusement, la documentation officielle note également que " Le package Requests est recommandé pour une interface client HTTP de niveau supérieur. " À 21.6. urllib.request - Bibliothèque extensible pour ouvrir des URL - Documentation Python 3.6.3Réponses:
Je sais que cela a déjà été dit, mais je recommande fortement le
requests
package Python.Si vous avez utilisé des langages autres que python, vous pensez probablement
urllib
eturllib2
êtes facile à utiliser, pas beaucoup de code et très performant, c'est comme ça que je pensais. Mais lerequests
paquet est si incroyablement utile et court que tout le monde devrait l'utiliser.Tout d'abord, il prend en charge une API entièrement reposante et est aussi simple que:
Peu importe si GET / POST, vous n'avez plus jamais à encoder de paramètres, il prend simplement un dictionnaire comme argument et c'est bon à utiliser:
De plus, il a même un décodeur JSON intégré (encore une fois, je sais que ce
json.loads()
n'est pas beaucoup plus à écrire, mais cela est certainement pratique):Ou si vos données de réponse ne sont que du texte, utilisez:
Ce n'est que la pointe de l'iceberg. Voici la liste des fonctionnalités du site de requêtes:
la source
urllib
et que sa documentation note également officiellement que " le package Requests est recommandé pour une interface client HTTP de niveau supérieur. " À 21.6. urllib.request - Bibliothèque extensible pour ouvrir des URL - Documentation Python 3.6.3 , et c'esturllib3
une excellente bibliothèque utilisée parrequests
.urllib.parse()
urllib2 fournit des fonctionnalités supplémentaires, à savoir que la
urlopen()
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 détaillé.) Plus important encore, urllib2 fournit laRequest
classe, ce qui permet une plus approche déclarative pour faire une demande:Notez que
urlencode()
c'est uniquement dans urllib, pas dans urllib2.Il existe également des gestionnaires pour implémenter une prise en charge d'URL plus avancée dans urllib2. La réponse courte est que, sauf si vous travaillez avec du code hérité, vous souhaiterez probablement utiliser l'ouvreur d'URL d'urllib2, mais vous devez toujours importer dans urllib pour certaines des fonctions de l'utilitaire.
Réponse bonus Avec Google App Engine, vous pouvez utiliser n'importe lequel de 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 longueur de la réponse autorisée. Vous pouvez cependant utiliser le cœur des bibliothèques comme vous vous en doutez pour récupérer des URL HTTP.
la source
urlopen()
etRequest
depuis urllib2 , et vous utilisezurlencode()
depuis urllib . Pas de mal réel à utiliser les deux bibliothèques, tant que vous vous assurez d'utiliser l'urlopen correct. Les [documents urllib] [1] sont clairs sur le fait que cette utilisation est une utilisation acceptée. [1]: docs.python.org/library/urllib2.html#urllib2.urlopenurllib2.urlopen
; contient également d'autres variantes.requests
autorise également les en-têtes personnalisés: docs.python-requests.org/en/master/user/quickstart/…urllib et urllib2 sont tous deux des modules Python qui effectuent des liées aux requêtes URL mais offrent des fonctionnalités différentes.
1) urllib2 peut accepter un objet Request pour définir les en-têtes d'une demande d'URL, urllib n'accepte qu'une URL.
2) urllib fournit la méthode urlencode 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 l'une des raisons pour lesquelles urllib est souvent utilisé avec urllib2.
Demandes - Requests 'est une bibliothèque HTTP simple et facile à utiliser écrite en Python.
1) Les requêtes Python encodent les paramètres automatiquement, vous les transmettez donc simplement comme des arguments simples, contrairement à urllib, où vous devez utiliser la méthode urllib.encode () pour coder les paramètres avant de les transmettre.
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 a échoué, urllib2 déclencherait une urllib2.URLError, tandis que les requêtes renverraient un objet de réponse normal, comme prévu. Tout ce que vous avez à voir si la demande a abouti par réponse booléenne.ok
la source
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, vous l'utilisez intensément et souhaitez migrer vers Python3 à l'avenir, envisagez d'utiliser urllib. Cependant, l'outil 2to3 fera automatiquement la plupart du travail pour vous.
la source
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à à votre disposition.
la source
J'aime la
urllib.urlencode
fonction, et elle ne semble pas existerurllib2
.la source
urllib
Python 3 est encore une autre option, nettoyée de diverses manières. Mais heureusement, la documentation officielle note également que « le package Requests est recommandé pour une interface client HTTP de niveau supérieur » à 21.6. urllib.request - Bibliothèque extensible pour ouvrir des URL - Documentation Python 3.6.3Pour obtenir le contenu d'une URL:
Il est difficile d'écrire
request
du code Python2 et Python3 et des dépendances pour les réponses car cesurlopen()
fonctions etrequests.get()
fonctions renvoient différents types:urllib.request.urlopen()
renvoie unhttp.client.HTTPResponse
urllib.urlopen(url)
renvoie uninstance
request.get(url)
renvoie unrequests.models.Response
la source
Vous devez généralement utiliser urllib2, car cela facilite parfois les choses en acceptant les objets Request et soulèvera également une URLException sur les erreurs de protocole. Avec Google App Engine, vous ne pouvez pas non plus utiliser. Vous devez utiliser l' API URL Fetch fournie par Google dans son environnement Python en bac à sable.
la source
Un point clé que je trouve manquant dans les réponses ci-dessus est que urllib renvoie un objet de type
<class http.client.HTTPResponse>
alors qu'ilrequests
retourne<class 'requests.models.Response'>
.Pour cette raison, la méthode read () peut être utilisée avec
urllib
mais pas avecrequests
.PS:
requests
est déjà riche de tant de méthodes qu'il en a à peine besoin d'une de plusread()
;>la source