En Python, ¿cuáles son las diferencias entre los urllib
, urllib2
, urllib3
y requests
los módulos? ¿Por qué hay tres? Parecen hacer lo mismo ...
python
python-requests
urllib2
urllib
python-2.x
Paul Biggar
fuente
fuente
requests
mayor parte del tiempo. a vecesurllib2
funciona pero requiere más código y es menos elegante. no utiliceurllib
.urllib
en Python 3 hay otra opción, limpiada de varias maneras. Pero, afortunadamente, la documentación oficial también señala que " el paquete Solicitudes se recomienda para una interfaz de cliente HTTP de nivel superior " en 21.6. urllib.request - Biblioteca extensible para abrir URL - Documentación de Python 3.6.3Respuestas:
Sé que ya se ha dicho, pero recomiendo encarecidamente el
requests
paquete Python.Si ha usado otros lenguajes que no sean python, probablemente esté pensando
urllib
yurllib2
sea fácil de usar, no tenga mucho código y sea altamente capaz, así es como solía pensar. Pero elrequests
paquete es tan increíblemente útil y breve que todos deberían usarlo.Primero, es compatible con una API totalmente relajante y es tan fácil como:
Independientemente de si GET / POST, nunca tendrá que codificar parámetros nuevamente, simplemente toma un diccionario como argumento y está listo para comenzar:
Además, incluso tiene un decodificador JSON incorporado (de nuevo, sé
json.loads()
que no es mucho más que escribir, pero esto es conveniente):O si sus datos de respuesta son solo texto, use:
Esto es sólo la punta del iceberg. Esta es la lista de características del sitio de solicitudes:
fuente
urllib
y que su documentación también señala oficialmente 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 , y esaurllib3
es una gran biblioteca utilizada porrequests
.urllib.parse()
urllib2 proporciona alguna funcionalidad adicional, es decir, la
urlopen()
función 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 laRequest
clase, que permite enfoque declarativo para hacer una solicitud: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 breve es que, a menos que esté trabajando 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 adicional Con Google App Engine, puede usar cualquiera de httplib, urllib o urllib2, pero todos ellos son solo envoltorios para la API URL Fetch de Google. Es decir, aún está sujeto a las mismas limitaciones, como puertos, protocolos y la duración de la respuesta permitida. Sin embargo, puede usar el núcleo de las bibliotecas como esperaría para recuperar URL HTTP.
fuente
urlopen()
yRequest
desde urllib2 , y usasurlencode()
desde urllib . No hay daño real en el uso de ambas bibliotecas, siempre y cuando se asegure de usar el urlopen correcto. Los [urllib docs] [1] tienen claro que usar esto es un uso aceptado. [1]: docs.python.org/library/urllib2.html#urllib2.urlopenurllib2.urlopen
; contiene otras variaciones también.requests
también permite encabezados personalizados: docs.python-requests.org/en/master/user/quickstart/…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 Request para configurar los encabezados de 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 a menudo se usa urllib junto con urllib2.
Solicitudes : las solicitudes son 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 debe pasarlos como argumentos simples, 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 Solicitudes devolverá un objeto de respuesta normal, como se esperaba. Todo lo que tiene que ver si la solicitud fue exitosa por boolean response.ok
fuente
Una diferencia considerable es 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 hará automáticamente la mayor parte del trabajo por usted.
fuente
Solo para agregar a las respuestas existentes, no veo que nadie 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.
fuente
Me gusta la
urllib.urlencode
función, y no parece existir enurllib2
.fuente
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 URL - Documentación de Python 3.6.3Para obtener el contenido de una url:
Es difícil escribir Python2 y Python3 y el
request
código de dependencias para las respuestas porque susurlopen()
funciones yrequests.get()
funciones devuelven diferentes tipos:urllib.request.urlopen()
devuelve unhttp.client.HTTPResponse
urllib.urlopen(url)
devuelve uninstance
request.get(url)
devuelve unrequests.models.Response
fuente
En 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 URLE en los errores de protocolo. Sin embargo, con Google App Engine, tampoco puedes usarlo. Debe utilizar la API de obtención de URL que proporciona Google en su entorno de Python de espacio aislado.
fuente
Un punto clave que me parece que falta en las respuestas anteriores es que urllib devuelve un objeto de tipo
<class http.client.HTTPResponse>
mientras querequests
devuelve<class 'requests.models.Response'>
.Debido a esto, el método read () se puede usar con
urllib
pero no conrequests
.PD:
requests
ya es rico en tantos métodos que apenas necesita uno más comoread()
;>fuente