901 votes

Dois-je utiliser urllib ou urllib2 ou des demandes?

En Python (2.5), dois-je utiliser urllib ou urllib2 ou des demandes? Quelle est la différence? Ils semblent faire la même chose.

809voto

hutch Points 1723

Je sais que sa été déjà dit, mais je recommande fortement les Demandes paquet python: http://docs.python-requests.org/en/latest/index.html

Si vous avez utilisé d'autres langues que le python, vous pensez probablement urllib et urllib2 sont faciles à utiliser, pas trop de code, et très capable, que j'ai l'habitude de penser. Mais les Demandes paquet est si incroyablement utile et court que tout le monde devrait l'utiliser.

Tout d'abord, il soutient entièrement API restful, 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')

Indépendamment du fait que GET/POST, vous ne jamais avoir à coder les paramètres, il suffit de prendre un dictionnaire comme un argument et il est bon pour aller.

userdata = {"firstname": "John", "lastname": "Doe", "password": "jdoe123"}
resp = requests.post('http://www.mywebsite.com/user', params=userdata)

En Plus il a même construit dans le json décodeur (encore une fois, je sais json.charges() n'est pas beaucoup plus à écrire, mais c'est sûr, c'est pratique):

resp.json()

Ou si votre réponse est juste le texte, utilisez:

resp.text

C'est juste la pointe de l'iceberg. C'est la liste des fonctions à partir de la demande du site:

  • Les Domaines internationaux et des Url
  • Keep-Alive & Pool De Connexion
  • Des séances avec Témoin de la Persistance
  • Navigateur de style Vérification SSL
  • De Base/L'Authentification Digest
  • Élégant Clé/Valeur Cookies
  • Décompression Automatique
  • Unicode Réponse Des Organismes
  • Multipart Les Uploads De Fichier
  • Les Délais De Connexion
  • .netrc soutien
  • Élément de la liste
  • Python 2.6-3.3
  • Thread-safe.

224voto

Crast Points 6207

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

Il y a aussi des gestionnaires pour la mise en œuvre plus avancé de la prise en charge des URL dans urllib2. La réponse courte est, sauf si vous travaillez avec le code existant, vous voudrez probablement utiliser l'URL ouvreur de urllib2, mais vous avez encore besoin de les importer dans urllib pour certaines des fonctions de l'utilitaire.

Bonus de réponse Avec Google App Engine, vous pouvez utiliser l'une des httplib, urllib ou urllib2, mais ils sont tous simplement des wrappers pour Google URL Chercher de l'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 la base de bibliothèques que vous attendez pour récupérer les Url HTTP.

12voto

Danny Roberts Points 1325

urllib2.urlopen accepte une instance de la classe de Requête 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

11voto

Gattster Points 1113

J'aime l' urllib.urlencode de la fonction, et il ne semble pas exister en urllib2.

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

5voto

Chinmay Kanchi Points 16353

Vous devez généralement utiliser urllib2, car cela rend les choses un peu plus facile à la fois par l'acceptation de la Demande d'objets et mettra aussi à l'URLException sur les erreurs de protocole. Avec Google App Engine, vous ne pouvez pas utiliser. Vous devez utiliser l' URL Fetch API Google prévoit dans son bac à sable Python environnement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X