Saltar al contenido

Cómo usar urllib2 en Python

Visión general

Si bien el título de esta publicación dice “Urllib2”, vamos a mostrar algunos
ejemplos en los que usa urllib, ya que a menudo se usan juntos.

Esta será una publicación de introducción de urllib2, donde vamos a
concéntrese en obtener URL, solicitudes, publicaciones, agentes de usuario y manejo de errores.

Consulte la documentación oficial para obtener más información.

Además, este artículo está escrito para la versión 2.x de Python

HTTP se basa en solicitudes y respuestas: el cliente realiza solicitudes y
los servidores envían respuestas.

Un programa en Internet puede funcionar como cliente (acceder a recursos) o como
un servidor (hace que los servicios estén disponibles).

Una URL identifica un recurso en Internet.

¿Qué es Urllib2?

urllib2 es un módulo de Python que se puede utilizar para buscar URL.

Define funciones y clases para ayudar con las acciones de URL (básicas y resumidas
autenticación, redirecciones, cookies, etc.)

La magia comienza con la importación del módulo urllib2.

¿Cuál es la diferencia entre urllib y urllib2?

Si bien ambos módulos hacen cosas relacionadas con la solicitud de URL, tienen diferentes
funcionalidad

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

urllib proporciona el método urlencode que se utiliza para la generación
de cadenas de consulta GET, urllib2 no tiene tal función.

Por eso urllib y urllib2 a menudo se utilizan juntos.

Consulte la documentación para obtener más información.

Entrenamiento de Python recomendado

Para el entrenamiento de Python, nuestra principal recomendación es DataCamp.

Urllib
Urllib2

¿Qué es urlopen?

urllib2 ofrece una interfaz muy simple, en forma de función urlopen.

Esta función es capaz de buscar URL utilizando una variedad de protocolos diferentes.
(HTTP, FTP,…)

Simplemente pase la URL a urlopen () conseguir un “Similar a un archivo” manejar a los datos remotos.

Además, urllib2 ofrece una interfaz para manejar situaciones comunes –
como autenticación básica, cookies, proxies, etc.

Estos son proporcionados por objetos llamados manejadores y abridores.

Obteniendo URL

Esta es la forma más básica de utilizar la biblioteca.

A continuación, puede ver cómo realizar una solicitud simple con urllib2.

Comience importando el módulo urllib2.

Coloque la respuesta en una variable (respuesta)

La respuesta ahora es un objeto similar a un archivo.

Leer los datos de la respuesta en una cadena (html)

Haz algo con esa cuerda.

Nota si hay un espacio en la URL, deberá analizarlo usando urlencode.

Veamos un ejemplo de cómo funciona esto.

import urllib2
response = urllib2.urlopen('https://www.pythonforbeginners.com/')
print response.info()
html = response.read()
# do something
response.close()  # best practice to close the file

Note: you can also use an URL starting with "ftp:", "file:", etc.).

El servidor remoto acepta los valores entrantes y formatea una respuesta de texto sin formato.
para enviar de vuelta.

El valor de retorno de urlopen () da acceso a los encabezados del servidor HTTP
a través de info () método, y los datos para el recurso remoto a través de métodos como
leer() y readlines ().

Además, el objeto de archivo devuelto por urlopen () es iterable.

Secuencia de comandos urllib2 simple

Muestremos otro ejemplo de un script urllib2 simple

import urllib2
response = urllib2.urlopen('http://python.org/')
print "Response:", response

# Get the URL. This gets the real URL. 
print "The URL is: ", response.geturl()

# Getting the code
print "This gets the code: ", response.code

# Get the Headers. 
# This returns a dictionary-like object that describes the page fetched, 
# particularly the headers sent by the server
print "The Headers are: ", response.info()

# Get the date part of the header
print "The Date is: ", response.info()['date']

# Get the server part of the header
print "The Server is: ", response.info()['server']

# Get all data
html = response.read()
print "Get all data: ", html

# Get only the length
print "Get the length :", len(html)

# Showing that the file object is iterable
for line in response:
 print line.rstrip()

# Note that the rstrip strips the trailing newlines and carriage returns before
# printing the output.
  

Descargar archivos con Urllib2

Este pequeño script descargará un archivo del sitio web pythonforbeginners.com

import urllib2

# file to be written to
file = "downloaded_file.html"

url = "https://www.pythonforbeginners.com/"
response = urllib2.urlopen(url)

#open the file for writing
fh = open(file, "w")

# read from request while writing to file
fh.write(response.read())
fh.close()

# You can also use the with statement:
with open(file, 'w') as f: f.write(response.read())

La diferencia en este script es que usamos ‘wb’, lo que significa que abrimos el
archivo binario.

import urllib2

mp3file = urllib2.urlopen("http://www.example.com/songs/mp3.mp3")

output = open('test.mp3','wb')

output.write(mp3file.read())

output.close()

Solicitudes Urllib2

El objeto Solicitud representa la solicitud HTTP que está realizando.

En su forma más simple, crea un objeto de solicitud que especifica la URL que desea
ir a buscar.

Llamar a urlopen con este objeto Request devuelve un objeto de respuesta para la URL
solicitado.

La función de solicitud en la clase urllib2 acepta tanto la URL como el parámetro.

Cuando no incluye los datos (y solo pasa la URL), la solicitud que se realiza
es en realidad una solicitud GET

Cuando incluye los datos, la solicitud que se realiza es una solicitud POST, donde el
url será la URL de la publicación y el parámetro será el contenido de la publicación http.

Echemos un vistazo al siguiente ejemplo.

import urllib2
import urllib

# Specify the url
url="https://www.pythonforbeginners.com"

# This packages the request (it doesn't make it) 
request = urllib2.Request(url)

# Sends the request and catches the response
response = urllib2.urlopen(request)

# Extracts the response
html = response.read()

# Print it out
print html 

Puede configurar los datos salientes en la Solicitud para publicarlos en el servidor.

Además, puede pasar información adicional de datos (“metadatos”) sobre los datos o
la solicitud sobre sí misma, al servidor: esta información se envía como HTTP
“Encabezados”.

Si desea POST datos, primero debe crear los datos en un diccionario.

Asegúrese de comprender lo que hace el código.

# Prepare the data
query_args = { 'q':'query string', 'foo':'bar' }

# This urlencodes your data (that's why we need to import urllib at the top)
data = urllib.urlencode(query_args)

# Send HTTP POST request
request = urllib2.Request(url, data)

response = urllib2.urlopen(request)
 
html = response.read()

# Print the result
print html

Agentes de usuario

La forma en que un navegador se identifica a sí mismo es a través del encabezado User-Agent.

Por defecto urllib2 se identifica como Python-urllib / xy
donde xey son los números de versión mayor y menor de la versión de Python.

Esto podría confundir el sitio o simplemente no funcionar.

Con urllib2 puede agregar sus propios encabezados con urllib2.

La razón por la que querría hacer eso es que a algunos sitios web no les gusta ser
navegado por programas.

Si está creando una aplicación que accederá a los recursos web de otras personas,
es cortés incluir información real del agente de usuario en sus solicitudes,
para que puedan identificar la fuente de las visitas más fácilmente.

Cuando crea el objeto Solicitud, puede agregar sus encabezados a un diccionario,
y use add_header () para establecer el valor del agente de usuario antes de abrir la solicitud.

Eso se vería así:

# Importing the module
import urllib2

# Define the url
url="http://www.google.com/#q=my_search"

# Add your headers
headers = {'User-Agent' : 'Mozilla 5.10'}

# Create the Request. 
request = urllib2.Request(url, None, headers)

# Getting the response
response = urllib2.urlopen(request)

# Print the headers
print response.headers

También puede agregar encabezados con “add_header ()”

sintaxis: Request.add_header (key, val)

urllib2.Request.add_header

En el siguiente ejemplo, use Mozilla 5.10 como un agente de usuario, y eso también es lo que
aparecerá en el archivo de registro del servidor web.

import urllib2

req = urllib2.Request('http://192.168.1.2/')

req.add_header('User-agent', 'Mozilla 5.10')

res = urllib2.urlopen(req)

html = res.read()

print html

Esto es lo que aparecerá en el archivo de registro.
“GET / HTTP / 1.1? 200151 “-” “¿Mozilla 5.10?

urllib.urlparse

El módulo urlparse proporciona funciones para analizar cadenas de URL.

Define una interfaz estándar para romper el localizador uniforme de recursos (URL)
encadena en varias partes opcionales, llamadas componentes, conocidas como
(esquema, ubicación, ruta, consulta y fragmento)

Digamos que tiene una URL:
http://www.python.org:80/index.html

los esquema sería http

los localización sería www.python.org:80

los camino es index.html

No tenemos ninguno consulta y fragmento

Las funciones más comunes son urljoin y urlsplit

import urlparse

url = "http://python.org"

domain = urlparse.urlsplit(url)[1].split(':')[0]

print "The domain name of the url is: ", domain

Para obtener más información sobre urlparse, consulte el oficial documentación.

urllib.urlencode

Cuando pasa información a través de una URL, debe asegurarse de que solo utilice
caracteres permitidos específicos.

Los caracteres permitidos son caracteres alfabéticos, números y algunos caracteres especiales.
caracteres que tienen significado en la cadena de URL.

El carácter codificado con más frecuencia es el espacio personaje.

Verá este carácter cada vez que vea un signo más (+) en una URL.

Esto representa el carácter de espacio.

El signo más actúa como un carácter especial que representa un espacio en una URL.

Los argumentos se pueden pasar al servidor codificándolos y agregándolos
a la URL.

Echemos un vistazo al siguiente ejemplo.

import urllib
import urllib2

query_args = { 'q':'query string', 'foo':'bar' } # you have to pass in a dictionary  

encoded_args = urllib.urlencode(query_args)

print 'Encoded:', encoded_args

url="http://python.org/?" + encoded_args

print urllib2.urlopen(url).read()

Si imprimiera esto ahora, obtendría una cadena codificada como esta:
q = query + string & foo = bar

El código de urlen de Python toma pares de variable / valor y crea un escape correctamente
querystring:

from urllib import urlencode

artist = "Kruder & Dorfmeister"

artist = urlencode({'ArtistSearch':artist})

Esto hace que la variable artista sea igual a:

Salida: ArtistSearch = Kruder +% 26 + Dorfmeister

Manejo de errores

Esta sección de manejo de errores se basa en la información del gran artículo de Voidspace.org.uk:
Urllib2 – El manual perdido

urlopen aumenta URLError cuando no puede manejar una respuesta.

Error HTTP es la subclase de URLError planteado en el caso específico de las URL HTTP.

URLError

A menudo, se genera URLError porque no hay conexión de red,
o el servidor especificado no existe.

En este caso, la excepción generada tendrá un atributo ‘motivo’,
que es una tupla que contiene un código de error y un mensaje de error de texto.

Ejemplo de URLError

req = urllib2.Request('http://www.pretend_server.org')

try: 
    urllib2.urlopen(req)

except URLError, e:
    print e.reason

(4, 'getaddrinfo failed')
Error HTTP

Cada respuesta HTTP del servidor contiene un “código de estado” numérico.

A veces, el código de estado indica que el servidor no puede cumplir
la solicitud.

Los controladores predeterminados manejarán algunas de estas respuestas por usted (por ejemplo,
si la respuesta es una “redirección” que solicita al cliente que busque el documento
desde una URL diferente, urllib2 se encargará de eso por usted).

Para aquellos que no puede manejar, urlopen generará un HTTPError.

Los errores típicos incluyen ‘404’ (página no encontrada), ‘403’ (solicitud prohibida),
y ‘401’ (se requiere autenticación).

Cuando se genera un error, el servidor responde devolviendo un código de error HTTP
y una página de error.

Puede utilizar la instancia HTTPError como respuesta en la página devuelta.

Esto significa que además del atributo de código, también tiene read, geturl,
e información, métodos.

req = urllib2.Request('http://www.python.org/fish.html')

try:
    urllib2.urlopen(req)

except URLError, e:
    print e.code
    print e.read()
from urllib2 import Request, urlopen, URLError

req = Request(someurl)

try:
    response = urlopen(req)

except URLError, e:

    if hasattr(e, 'reason'):
        print 'We failed to reach a server.'
        print 'Reason: ', e.reason

    elif hasattr(e, 'code'):
        print 'The server could not fulfill the request.'
        print 'Error code: ', e.code
else:
    # everything is fine

Por favor, eche un vistazo a los enlaces a continuación para comprender mejor Urllib2.
Biblioteca.

Fuentes y lectura adicional

http://pymotw.com/2/urllib2/
http://www.kentsjohnson.com/
http://www.voidspace.org.uk/python/articles/urllib2.shtml
http://techmalt.com/
http://www.hacksparrow.com/
http://docs.python.org/2/howto/urllib2.html
http://www.stackoverflow.com
http://www.oreillynet.com/

Entrenamiento de Python recomendado

Para el entrenamiento de Python, nuestra principal recomendación es DataCamp.