2010-01-07 10 views
498

En Python, ¿cuáles son las diferencias entre el módulo urllib, urllib2 y requests? ¿Por qué hay tres? Parece que hacen lo mismo ...¿Cuáles son las diferencias entre los módulos urllib, urllib2 y requests?

+8

no lanzar otra llave en sus planes, pero si estamos hablando acerca de su uso para el acceso HTTP Me gustaría recomendar http://code.google.com/p/httplib2/(httplib2) en su lugar. –

+58

[Solicitudes] (http://docs.python-requests.org/en/latest/index.html) es lo mejor. – Yarin

+1

Sí, use solicitudes. http://stackoverflow.com/questions/22676/how-do-i-download-a-file-over-http-using-python/10744565#10744565 – hughdbrown

Respuesta

511

Sé que se ha dicho ya, pero lo recomiendo mucho el paquete de solicitudes de pitón: http://docs.python-requests.org/en/latest/index.html

Si ha utilizado otros idiomas además del pitón, usted está pensando probablemente urllib y son urllib2 fácil de usar, no tiene mucho código y es muy capaz, así es como solía pensar. Pero el paquete de solicitudes es tan increíblemente útil y breve que todos deberían usarlo.

En primer lugar, es compatible con una API totalmente reparador, y es tan fácil como:

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') 

Independientemente de si GET/POST que nunca tenga que codificar los parámetros de nuevo, simplemente toma un diccionario como un argumento y es bueno para ir.

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

Además, incluso tiene un decodificador json incorporado (de nuevo, lo sé json.(cargas) no es mucho más que escribir, pero este seguro es conveniente):

resp.json() 

O si los datos de respuesta es sólo texto, utilice:

resp.text 

Esto es sólo la punta del el iceberg Esta es la lista de las características del sitio de solicitudes:

  • Domains Internacional y URLs
  • Keep-Alive & Agrupación de conexiones
  • Sesiones con SSL comprobación de las cookies Persistencia
  • de estilo Explorador
  • Básico/Autenticación implícita
  • Llave elegante/Cookies de valor
  • Descompresión automática
  • Cuerpos Unicode respuesta
  • la carga de archivos de varias partes
  • conexión Tiempos de espera
  • .netrc apoyar
  • elemento de la lista
  • Python 2.6-3.4
  • Hilo de seguridad.
+25

Elegí esta respuesta porque la respuesta original se ha ido duro. Entonces, si se pregunta por qué esta respuesta está por delante de una respuesta con 76 votos ascendentes, es porque las Solicitudes son la nueva forma defacto de hacer las cosas. –

+71

@PaulBiggar dices que esta es la mejor respuesta. Pero realmente no responde la pregunta. Vine aquí para descubrir las diferencias entre urllib y urllib2. Especialmente sobre las características de codificación de URL. La respuesta: ¡usa solicitudes! ;) Solo diciendo que tal vez quiera aclarar la pregunta. Tal como está, la respuesta de Crast realmente responde la pregunta perfectamente. – exhuma

+1

@exhuma urllib2 intenta abstraer más las solicitudes de URL con la clase urllib2.Request, pero carece de algunas utilidades comunes por lo que a menudo se usa junto con urllib, y para responder a su pregunta específica: no tiene características de codificación de URL, para param codificando usaría urllib.urlencode(), para la codificación de cadena segura para url usaría urllib.quote()/quote_plus(). Las solicitudes se encargan de todo esto para usted: simplemente agregue cadenas no codificadas/no seguras a la sentencia params; que es parte de la razón por la cual la mayoría de los pitóneros dicen que es una mejor alternativa. – Hutch

5

Debe utilizar generalmente urllib2, ya que esto hace las cosas un poco más fáciles, a veces mediante la aceptación de objetos de solicitud y también levantará un URLException de errores de protocolo. Sin embargo, con Google App Engine, no puedes usar ninguno de los dos. Debe utilizar el URL Fetch API que proporciona Google en su entorno de entorno de prueba de Python.

+2

Lo que dices sobre appengine no es del todo cierto. En realidad, ahora puede usar httplib, urllib y urllib2 en App Engine (son contenedores para la recuperación de url, hecho para que más código sea compatible con appengine.) – Crast

+0

Ah, debe ser nuevo. Mi código falló, por último, lo intenté y tuve que volver a escribir para trabajar con fetch ... –

+0

https://devsite.googleplex.com/appengine/docs/python/urlfetch/overview#Fetching_URLs_in_Python – allyourcode

173

urllib2 proporciona alguna funcionalidad adicional, a saber, la función de urlopen() puede permitirle especificar cabeceras (normalmente usted habría tenido que utilizar httplib en el pasado, que es mucho más detallado.) Más importante, sin embargo, urllib2 proporciona la clase Request , lo que permite un enfoque más declarativo a hacer una petición:

r = Request(url='http://www.mysite.com') 
r.add_header('User-Agent', 'awesome fetcher') 
r.add_data(urllib.urlencode({'foo': 'bar'}) 
response = urlopen(r) 

Tenga en cuenta que es sólo en urlencode() urllib, no urllib2.

También hay controladores para la implementación de soporte URL más avanzado en urllib2. La respuesta corta es que, a menos que trabaje con código heredado, probablemente quiera usar el abridor de URL de urllib2, pero aún necesita importar a urllib para algunas de las funciones de utilidad.

Bono respuesta Con Google App Engine, puede utilizar cualquiera de httplib, urllib o urllib2, pero todos ellos son sólo contenedores para la dirección URL de Google API de Fetch. Es decir, todavía está sujeto a las mismas limitaciones, como puertos, protocolos y la duración de la respuesta permitida. Sin embargo, puedes usar el núcleo de las bibliotecas como lo esperarías para recuperar las URL HTTP.

+1

¿Cómo alguien puede crear una URL con un código codificado? cadena de consulta usando urllib2? Es la única razón por la que estoy usando urllib y me gustaría asegurarme de estar haciendo todo de la manera más moderna. – Gattster

+2

Como en mi ejemplo anterior, usas 'urlopen()' y 'Request' de * urllib2 *, y usas' urlencode() 'de * urllib *. No hay daño real en el uso de ambas bibliotecas, siempre y cuando se asegure de utilizar el urlopen correcto. Los [documentos de urllib] [1] son ​​claros en cuanto a que usar esto es un uso aceptado. [1]: http://docs.python.org/library/urllib2.html#urllib2.urlopen – Crast

+0

Utilicé [esto] (https://gist.github.com/vgoklani/1811970) esencia para 'urllib2 .urlopen'; contiene otras variaciones también –

9

Me gusta la función urllib.urlencode, y no parece existir en urllib2.

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

Solo una nota, tenga cuidado con urlencode ya que no puede manejar objetos directamente - tiene que codificarlos antes de enviarlos a urlencode (u'blá'.encode ('utf-8'), o lo que sea). –

+0

@ user18015: No creo que esto se aplique a Python 3, ¿puedes aclararlo? –

+0

Como mencioné anteriormente, esta pregunta y las diversas respuestas deben actualizarse para aclarar que 'urllib' en Python 3 es otra opción, limpiada de varias maneras. Pero afortunadamente, la documentación oficial también señala que "_El paquete de solicitudes se recomienda para una interfaz de cliente HTTP de nivel superior._" en [21.6. urllib.request - Biblioteca extensible para abrir URLs - Documentación de Python 3.6.3] (https://docs.python.org/3/library/urllib.request.html) – nealmcb

6

Una diferencia considerable consiste en trasladar Python2 a Python3. urllib2 no existe para python3 y sus métodos portados a urllib. Así que lo está usando mucho y quiere migrar a Python3 en el futuro, considere usar urllib. Sin embargo, la herramienta 2to3 automáticamente hará la mayor parte del trabajo por usted.

21

urllib y urllib2 son los dos módulos de Python que hacen URL relacionada con la solicitud cosas, pero ofrecen diferentes funcionalidades.

1) urllib2 puede aceptar un objeto Request para establecer los encabezados para una solicitud de URL, urllib acepta solo una URL.

2) urllib proporciona el método urlencode que se utiliza para la generación de cadenas de consulta GET, urllib2 no tiene esa función. Esta es una de las razones por las que urllib se usa a menudo junto con urllib2.

Solicitudes - Solicitudes 'es una biblioteca HTTP simple, fácil de usar escrita en Python.

1) Las solicitudes de Python codifica los parámetros de forma automática por lo que sólo les pasa argumentos como simples, a diferencia de en el caso de urllib, donde es necesario utilizar el método urllib.encode() para codificar los parámetros antes de pasarlos.

2) Decodificó automáticamente la respuesta en Unicode.

3) Las solicitudes también tienen un manejo de errores mucho más conveniente. Si tu autenticación falla, urllib2 generaría un error urllib2.URLE, mientras que las Solicitudes devolverían un objeto de respuesta normal, como se esperaba.Todo lo que tiene que ver si la solicitud se ha realizado correctamente booleano response.ok

Para el ejemplo de referencia - https://dancallahan.info/journal/python-requests/

1

sólo para añadir a las respuestas existentes, no veo a nadie mencionar que las solicitudes de pitón no es una biblioteca nativa Si está de acuerdo con agregar dependencias, entonces las solicitudes están bien. Sin embargo, si intenta evitar agregar dependencias, urllib es una biblioteca nativa de python que ya está disponible para usted.

1

para obtener el contenido de un 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. 

Es difícil escribir python2 y python3 y el código request dependencias de las respuestas porque urlopen() funciones y requests.get() función devuelven diferentes tipos:

  • Python2 urllib.request.urlopen() devuelve un http.client.HTTPResponse
  • Python3 urllib.urlopen(url) devuelve un instance
  • request.get(url) Solicitud devuelve un requests.models.Response
Cuestiones relacionadas