Pregunta

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

¿Fue útil?

Solución

Sé que ya se ha dicho, pero recomiendo ampliamente el requests Paquete de Python.

Si ha utilizado otros lenguajes además de Python, probablemente esté pensando 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 requests El paquete es tan increíblemente útil y breve que todo el mundo debería utilizarlo.

En primer lugar, admite una API completamente 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 es GET/POST, nunca más tendrá que codificar parámetros, simplemente toma un diccionario como argumento y está listo para comenzar:

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

Además, incluso tiene un decodificador JSON integrado (nuevamente, lo sé). json.loads() No hay mucho más que escribir, pero esto seguro es conveniente):

resp.json()

O si los datos de tu respuesta son solo texto, usa:

resp.text

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

  • Dominios y URL internacionales
  • Keep-Alive y agrupación de conexiones
  • Sesiones con persistencia de cookies
  • Verificación SSL estilo navegador
  • Autenticación básica/digest
  • Galletas elegantes de clave/valor
  • Descompresión automática
  • Cuerpos de respuesta Unicode
  • Cargas de archivos de varias partes
  • Tiempos de espera de conexión
  • soporte .netrc
  • Elemento de lista
  • Pitón 2.6—3.4
  • A salvo de amenazas.

Otros consejos

urllib2 proporciona algunas funciones adicionales, a saber, la urlopen() La 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 la Request clase, que permite un enfoque más declarativo para realizar 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 en urllib2.

También hay controladores para implementar soporte de URL más avanzado en urllib2.La respuesta corta es, 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 la utilidad.

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

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 de solicitud para establecer las cabeceras de una petición de URL, urllib sólo acepta una dirección URL.

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

Las solicitudes -. Solicitudes es un simple librería HTTP, fácil de usar, escrito 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) Se descodifica automáticamente la respuesta en Unicode.

3) Las solicitudes también tiene errores mucho más conveniente handling.If su falla la autenticación, urllib2 elevaría un urllib2.URLError, mientras que las solicitudes volverí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

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

urllib2.urlopen acepta una instancia de la clase de solicitud o una URL, mientras que urllib.urlopen sólo acepta una dirección URL.

se llevó a cabo una discusión similar aquí: http://www.velocityreviews.com/forums /t326690-urllib-urllib2-what-is-the-difference.html

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'

Una diferencia considerable se trata de portar python2 a python3. urllib2 no existe para python3 y sus métodos portado a urllib. Así que usted está utilizando en gran medida y desea migrar a python3 en el futuro, considerar el uso de urllib. Sin embargo herramienta 2to3 automáticamente hará la mayor parte del trabajo para usted.

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ás bien con la adición de las dependencias, luego solicita está muy bien. Sin embargo, si usted está tratando de evitar la adición de dependencias, urllib es una biblioteca nativa de Python que ya está disponible para usted.

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. Con Google App Engine sin embargo, no se puede utilizar cualquiera. Usted tiene que utilizar la URL Fetch API que Google ofrece en su recinto de seguridad Python medio ambiente.

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

  • python2 urllib.request.urlopen() devuelve un http.client.HTTPResponse
  • vuelve python3 urllib.urlopen(url) un instance
  • Solicitud request.get(url) devuelve un requests.models.Response

Un punto clave que me parece que faltan en las respuestas anteriores es que urllib devuelve un objeto de tipo <class http.client.HTTPResponse> mientras que los retornos requests <class 'requests.models.Response'>.

Debido a esto, leer () método puede ser utilizado con urllib pero no con requests.

P.S. : requests ya está llena de tantos métodos que apenas necesita una más como read();>

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top