python python-requests urllib2 urllib python-2.x

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



python-requests python-2.x (9)

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


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


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 el código de las dependencias de Python2 y Python3 y request 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 requests.models.Response

Por lo general, debe utilizar 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.


Sé que ya se ha dicho, pero recomiendo encarecidamente el paquete Python de solicitudes: requests

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 (una vez más, 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 de estilo 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.

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.


Una diferencia considerable es acerca de 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.


urllib2 proporciona alguna funcionalidad adicional, a saber, 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 en 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 extra Con Google App Engine, puede utilizar 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 usar 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 simple y fácil de usar escrita en Python.

1) Python Requests codifica los parámetros automáticamente, por lo que solo 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) Decodificó 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/