¿Cuáles son las diferencias entre el módulo urllib, urllib2 y peticiones?

En Python, ¿cuáles son las diferencias entre urllib , urllib2 y el módulo de requests ? ¿Por qué hay tres? Parecen hacer lo mismo …

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

Si ha usado otros idiomas además de python, probablemente piense que urllib y urllib2 son fáciles de usar, no tienen mucho código y son muy capaces, así es como solía pensar. Pero el paquete de solicitudes es tan increíblemente útil y corto que todos deberían usarlo.

Primero, es compatible con una API completamente reparadora, 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 nunca tendrá que volver a codificar parámetros, simplemente toma un diccionario como argumento y está listo.

 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, sé que json.loads () no es mucho más que escribir, pero esto es conveniente):

 resp.json() 

O si sus datos de respuesta son solo texto, use:

 resp.text 

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

  • Dominios internacionales y URLs
  • Keep-Alive & Connection Pooling
  • Sesiones con Persistencia de Galletas
  • Verificación SSL al estilo del navegador
  • Autenticación Básica / Digest
  • Galletas elegantes de clave / valor
  • Descompresión automática
  • Cuerpos de respuesta Unicode
  • Cargas de archivos multiparte
  • Tiempos de espera de conexión
  • soporte .netrc
  • Elemento de lista
  • Python 2.6—3.4
  • A salvo de amenazas.

urllib2 proporciona alguna funcionalidad adicional, es decir, la función urlopen() puede permitirle especificar encabezados (normalmente habría tenido que usar httplib en el pasado, que es mucho más detallado). Sin embargo, lo más importante es que urllib2 proporciona la clase Request , que permite un enfoque más declarativo para hacer una solicitud:

 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 urlencode() solo está en urllib, no urllib2.

También hay controladores para implementar un soporte de URL más avanzado en urllib2. La respuesta corta es que, a menos que esté trabajando con un código heredado, es probable que desee usar el abridor de URL de urllib2, pero aún necesita importar en urllib para algunas de las funciones de utilidad.

Respuesta adicional Con Google App Engine, puede usar cualquiera de httplib, urllib o urllib2, pero todos ellos son solo envoltorios para la API de recuperación de URL de Google. Es decir, aún está sujeto a las mismas limitaciones, como puertos, protocolos y la longitud de la respuesta permitida. Sin embargo, puede utilizar el núcleo de las bibliotecas como esperaría para recuperar las URL de HTTP.

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

1) urllib2 puede aceptar un objeto de solicitud para establecer los encabezados de una solicitud de URL, urllib solo acepta 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 sencilla y fácil de usar escrita en Python.

1) Python Requests codifica los parámetros automáticamente, por lo que simplemente los pasa como simples argumentos, a diferencia del caso de urllib, donde debe usar el método urllib.encode () para codificar los parámetros antes de pasarlos.

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

3) Las solicitudes también tienen un manejo de errores mucho más conveniente. Si su autenticación falla, urllib2 generará un error urllib2.URLE, mientras que las solicitudes devolverán un objeto de respuesta normal, como se esperaba. Todo lo que tiene que ver si la solicitud fue exitosa por boolean response.ok

Referencia de ejemplo: https://dancallahan.info/journal/python-requests/

urllib2.urlopen acepta una instancia de la clase de solicitud o una url, mientras que urllib.urlopen solo acepta una url.

Una discusión similar tuvo lugar aquí: http://www.velocityreviews.com/forums/t326690-urllib-urllib2-what-is-thetheddference.html

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

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

Una diferencia considerable es sobre cómo portar Python2 a Python3. urllib2 no existe para python3 y sus métodos portados a urllib. Por lo tanto, lo está utilizando mucho y desea migrar a Python3 en el futuro, considere usar urllib. Sin embargo, la herramienta 2to3 automáticamente hará la mayor parte del trabajo por usted.

Solo para agregar a las respuestas existentes, no veo a nadie que mencione que las solicitudes de python no son una biblioteca nativa. Si está de acuerdo con agregar dependencias, entonces las solicitudes están bien. Sin embargo, si está intentando evitar agregar dependencias, urllib es una biblioteca nativa de Python que ya está disponible para usted.

Por lo general, debe usar urllib2, ya que esto hace que las cosas sean un poco más fáciles a veces al aceptar los objetos de solicitud y también generará una URLException en los errores de protocolo. Sin embargo, con Google App Engine, tampoco puedes usarlo. Debe utilizar la API de recuperación de URL que Google proporciona en su entorno Python de espacio aislado.

Para obtener el contenido de una 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 de dependencias de request para las respuestas porque las funciones urlopen() y la función requests.get() devuelven diferentes tipos:

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

Un punto clave que encuentro que falta en las respuestas anteriores es que urllib devuelve un objeto de tipo mientras que las requests devuelven .

Debido a esto, el método read () se puede utilizar con urllib pero no con requests .

PD: las requests ya están llenas de tantos métodos que apenas necesita uno más que read() ;>