Pregunta ¿Cuáles son las diferencias entre los módulos urllib, urllib2 y requests?


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


533
2018-01-07 03:26


origen


Respuestas:


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

Si ha usado otros idiomas además de Python, probablemente esté pensando 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 breve que todos deberían usarlo.

En primer lugar, es compatible con una API totalmente relajante, 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 tiene que volver a codificar los parámetros, simplemente toma un diccionario como argumento y está listo para funcionar.

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 para escribir, pero esto es seguro):

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 URL
  • Keep-Alive & Connection Pooling
  • Sesiones con persistencia de cookies
  • Verificación SSL del estilo del navegador
  • Autenticación básica / implícita
  • Llave elegante / Galletas de valor
  • Descompresión automática
  • Cuerpos de respuesta Unicode
  • Cargas de archivos de varias partes
  • Tiempos de espera de conexión
  • .netrc soporte
  • Artículo de lista
  • Python 2.6-3.4
  • A salvo de amenazas.

545
2018-02-11 00:32



urllib2 proporciona alguna funcionalidad adicional, es decir, urlopen() función puede permitirle especificar encabezados (normalmente habría tenido que usar httplib en el pasado, que es mucho más detallado). Más importante aún, urllib2 proporciona el Request clase, 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() está solo en urllib, no urllib2.

También hay controladores para implementar soporte de 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.

Respuesta de bonificación Con Google App Engine, puede usar cualquiera de httplib, urllib o urllib2, pero todos ellos son solo contenedores para la API de obtención de URL de Google. 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.


182
2018-01-07 03:43



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

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

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

Peticiones - 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 argumentos simples, a diferencia del caso de urllib, donde necesita 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 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 fue exitosa por Boolean respuesta.ok

Por ejemplo referencia - https://dancallahan.info/journal/python-requests/


28
2017-09-10 04:14



urllib2.urlopen acepta una instancia de la clase Request 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-the-difference.html


11
2018-01-07 03:29



me gusta el urllib.urlencode función, y no parece existir en urllib2.

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

9
2018-01-07 03:51



Una diferencia considerable se trata de portar 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.


7
2018-04-27 01:07



Por lo general, debe usar urllib2, ya que esto hace las cosas un poco más fáciles a veces al aceptar objetos de solicitud y también generará una excepción URLEx en errores de protocolo. Sin embargo, con Google App Engine, no puedes usar ninguno de los dos. Tienes que usar el URL Fetch API que Google proporciona en su entorno de entorno reducido de Python.


5
2018-01-07 03:36



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 request código de dependencias para las respuestas porque urlopen() funciones y requests.get() función de devolución de diferentes tipos:

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

4
2017-12-20 02:29