0% encontró este documento útil (0 votos)
304 vistas5 páginas

Existen Dos Módulos Principales para Leer Datos de URLs en Python

Este documento explica cómo utilizar los módulos urllib y urllib2 en Python para leer datos de URLs. urllib2 es más completo y permite leer datos de varios protocolos como HTTP, HTTPS y FTP usando la función urlopen. También permite manejar errores, enviar datos POST, añadir cabeceras personalizadas, e instalar manejadores para autenticación, proxies y cookies.

Cargado por

Ricardo Scarleth
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
304 vistas5 páginas

Existen Dos Módulos Principales para Leer Datos de URLs en Python

Este documento explica cómo utilizar los módulos urllib y urllib2 en Python para leer datos de URLs. urllib2 es más completo y permite leer datos de varios protocolos como HTTP, HTTPS y FTP usando la función urlopen. También permite manejar errores, enviar datos POST, añadir cabeceras personalizadas, e instalar manejadores para autenticación, proxies y cookies.

Cargado por

Ricardo Scarleth
Derechos de autor
© Attribution Non-Commercial (BY-NC)
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 5

Existen dos mdulos principales para leer datos de URLs en Python: urllib y urllib2.

En esta leccin aprenderemos a utilizar urllib2 ya que es mucho ms completo, aunque urllib tiene funcionalidades propias que no se pueden encontrar en urllib2, por lo que tambin lo tocaremos de pasada.
urllib2

puede leer datos de una URL usando varios protocolos como HTTP, HTTPS, FTP, o Gopher. Se utiliza una funcin urlopen para crear un objeto parecido a un fichero con el que leer de la URL. Este objeto cuenta con mtodos como read, readline, readlines y close, los cuales funcionan exactamente igual que en los objetos file, aunque en realidad estamos trabajando con un wrapper que nos abstrae de un socket que se utiliza por debajo. El mtodo read, como recordareis, sirve para leer el archivo completo o el nmero de bytes especificado como parmetro, readline para leer una lnea, y readlines para leer todas las lneas y devolver una lista con ellas. Tambin contamos con un par de mtodos geturl, para obtener la URL de la que estamos leyendo (que puede ser til para comprobar si ha habido una redireccin) e info que nos devuelve un objeto con las cabeceras de respuesta del servidor (a las que tambin se puede acceder mediante el atributo headers). view plaincopy to clipboardprint? 1. import urllib2 2. 3. try: 4. f = urllib2.urlopen("http://www.python.org") 5. print f.read() 6. f.close() 7. except HTTPError, e: 8. print "Ocurri un error" 9. print e.code 10. except URLError, e: 11. print "Ocurri un error" 12. print e.reason Al trabajar con urllib2 nos podemos encontrar, como vemos, con errores de tipo URLError. Si trabajamos con HTTP podemos encontrarnos tambin con errores de la subclase de URLError HTTPError, que se lanzan cuando el servidor devuelve un cdigo de error HTTP, como el error 404 cuando no se encuentra el recurso. Tambin podramos encontrarnos con errores lanzados por la librera que urllib2 utiliza por debajo para las transferencias HTTP: httplib; o con excepciones lanzadas por el propio mdulo socket. La funcin urlopen cuenta con un parmetro opcional data con el que poder enviar informacin a direcciones HTTP (y solo HTTP) usando POST (los parmetros se envan en

la propia peticin), por ejemplo para responder a un formulario. Este parmetro es una cadena codificada adecuadamente, siguiendo el formato utilizado en las URLs: password=contrase%A4a&usuario=manuel Lo ms sencillo para codificar la cadena es utilizar el mtodo urlencode de urllib, que acepta un diccionario o una lista de tuplas (clave, valor) y genera la cadena codificada correspondiente: view plaincopy to clipboardprint? 1. import urllib, urllib2 2. 3. params = urllib.urlencode({"usuario": "manuel", "password": "contrasea"}) 4. f = urllib2.urlopen("http://ejemplo.com/login", params) Si lo nico que queremos hacer es descargar el contenido de una URL a un archivo local, podemos utilizar la funcin urlretrieve de urllib en lugar de leer de un objeto creado con urlopen y escribir los datos ledos. La funcin urlretrieve toma como parmetros la URL a descargar y, opcionalmente, un parmetro filename con la ruta local en la que guardar el archivo, un parmetro data similar al de urlopen y un parmetro reporthook con una funcin que utilizar para informar del progreso. A excepcin de las ocasiones en las que se utiliza el parmetro data las conexiones siempre se realizan utilizando GET (los parmetros se envan en la URL). Para enviar datos usando GET basta con concatenar la cadena resultante de urlencode con la URL a la que nos vamos a conectar mediante el smbolo ?. view plaincopy to clipboardprint? 1. params = urllib.urlencode({"usuario": "manuel", "password": "contrasea"}) 2. 3. f = urllib2.urlopen("http://ejemplo.com/login" + "?" + params) En urllib tambin se utiliza una funcin urlopen para crear nuestros pseudo-archivos, pero a diferencia de la versin de urllib, la funcin urlopen de urllib2 tambin puede tomar como parmetro un objeto Request, en lugar de la URL y los datos a enviar. La clase Request define objetos que encapsulan toda la informacin relativa a una peticin. A travs de este objeto podemos realizar peticiones ms complejas, aadiendo nuestras propias cabeceras, como el User-Agent.

El constructor ms sencillo para el objeto Request no toma ms que una cadena indicando la URL a la que conectarse, por lo que utilizar este objeto como parmetro de urlopen sera equivalente a utilizar una cadena con la URL directamente. Sin embargo el constructor de Request tambin tiene como parmetros opcionales una cadena data para mandar datos por POST, un diccionario headers con las cabeceras y un par de campos origin_req_host y unverifiable, que quedan fuera del propsito de la leccin. Veamos cmo aadir nuestras propias cabeceras utilizando como ejemplo la cabecera UserAgent. El User-Agent es una cabecera que sirve para identificar el navegador y sistema operativo que estamos utilizando para conectarnos a esa URL. Por defecto urllib2 se identifica como Python-urllib/2.5; si quisiramos identificarnos como un Linux corriendo Konqueror por ejemplo, usaramos un cdigo similar al siguiente: view plaincopy to clipboardprint? 1. 2. 3. 4. 5. ua = "Mozilla/5.0 (compatible; Konqueror/3.5.8; Linux)" h = {"User-Agent": ua} r = urllib2.Request("http://www.python.org", headers=h) f = urllib2.urlopen(r) print f.read()

Para personalizar la forma en que trabaja urllib2 podemos instalar un grupo de manejadores (handlers) agrupados en un objeto de la clase OpenerDirector (opener o abridor), que ser el que se utilice a partir de ese momento al llamar a urlopen. Para construir un opener se utiliza la funcin build_opener a la que se le pasa los manejadores que formarn parte del opener. El opener se encargar de encadenar la ejecucin de los distintos manejadores en el orden dado. Tambin se puede usar el constructor de OpenerDirector, y aadir los manejadores usando su mtodo add_handler. Para instalar el opener una vez creado se utiliza la funcin install_opener, que toma como parmetro el opener a instalar. Tambin se podra, si slo queremos abrir la URL con ese opener una sola vez, utilizar el mtodo open del opener.
urllib2

cuenta con handlers que se encargan de manejar los esquemas disponibles (HTTP, HTTPS, FTP), manejar la autenticacin, manejar las redirecciones, etc. Para aadir autenticacin tendramos que instalar un opener que incluyera como manejador HTTPBasicAuthHandler, ProxyBasicAuthHandler, HTTPDigestAuthHandler y/o ProxyDigestAuthHandler. Para utilizar autenticacin HTTP bsica, por ejemplo, usaramos HTTPBasicAuthHandler:

view plaincopy to clipboardprint? 1. 2. 3. 4. 5. 6. 7. aut_h = urllib2.HTTPBasicAuthHandler() aut_h.add_password("realm", "host", "usuario", "password") opener = urllib2.build_opener(aut_h) urllib2.install_opener(opener) f = urllib2.urlopen("http://www.python.org")

Si quisiramos especificar un proxy en el cdigo tendramos que utilizar un opener que contuviera el manejador ProxyHandler. El manejador por defecto incluye una instacia de ProxyHandler construido llamando al inicializador sin parmetros, con lo que se lee la lista de proxies a utilizar de la variable de entorno adecuada. Sin embargo tambin podemos construir un ProxyHandler pasando como parmetro al inicializador un diccionario cuyas claves son los protocolos y los valores, la URL del proxy a utilizar para dicho protocolo. view plaincopy to clipboardprint? 1. 2. 3. 4. 5. 6. proxy_h = urllib2.ProxyHandler({"http" : "http://miproxy.net:123"}) opener = urllib2.build_opener(proxy_h) urllib2.install_opener(opener) f = urllib2.urlopen("http://www.python.org")

Para que se guarden las cookies que manda HTTP utilizamos el manejador HTTPCookieProcessor. view plaincopy to clipboardprint? 1. 2. 3. 4. 5. 6. cookie_h = urllib2.HTTPCookieProcessor() opener = urllib2.build_opener(cookie_h) urllib2.install_opener(opener) f = urllib2.urlopen("http://www.python.org")

Si queremos acceder a estas cookies o poder mandar nuestras propias cookies, podemos pasarle como parmetro al inicializador de HTTPCookieProcessor un objeto de tipo CookieJar del mdulo cookielib. Para leer las cookies mandadas basta crear un objeto iterable a partir del CookieJar (tambin podramos buscar las cabeceras correspondientes, pero este sistema es ms claro y sencillo):

view plaincopy to clipboardprint? 1. import urllib2, cookielib 2. 3. cookie_j = cookielib.CookieJar() 4. 5. cookie_h = urllib2.HTTPCookieProcessor(cookie_j) 6. 7. opener = urllib2.build_opener(cookie_h) 8. opener.open("http://www.python.org") 9. 10. for num, cookie in enumerate(cookie_j): 11. print num, cookie.name 12. print cookie.value 13. print En el improbable caso de que necesitramos aadir una cookie antes de realizar la conexin, en lugar de conectarnos para que el sitio la mande, podramos utilizar el mtodo set_cookie de CookieJar, al que le pasamos un objeto de tipo Cookie. El constructor de Cookie, no obstante, es bastante complicado.

También podría gustarte