Categoria: Programacion Tema: Python Titulo: Interactuar con webs en python
Fecha del Tema: 2012-09-23 23:19:11 Interactuar con webs Existen dos módulos principales para leer datos de URLs en Python: urllib y urllib2. En esta lección aprenderemos a utilizar urllib2 ya que es mucho más completo, aunque urllib tiene funcionalidades propias que no se pueden encontrar en urllib2, por lo que también lo tocaremos de pasada. puede leer datos de una URL usando varios protocolos como urllib2 HTTP, HTTPS, FTP, o Gopher. Se utiliza una función urlopen para crear un objeto parecido a un fichero con el que leer de la URL. Este objeto cuenta con métodos como read, readline, readlines y close, los cuales funcionan exac- tamente 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 método read, como recordareis, sirve para leer el â??archivo" completo o el número de bytes especificado como parámetro, readline para leer una lÃnea, y readlines para leer todas las lÃneas y devolver una lista con ellas. También contamos con un par de métodos geturl, para obtener la URL de la que estamos leyendo (que puede ser útil para comprobar si ha habido una redirección) e info que nos devuelve un objeto con las cabeceras de respuesta del servidor (a las que también se puede acceder mediante el atributo headers). <? import urllib2 try: f = urllib2.urlopen(â??http://www.python.org") print f.read() f.close() except HTTPError, e: print â??Ocurrió un error" print e.code except URLError, e: print â??Ocurrió un error" print e.reason ?> Al trabajar con urllib2 nos podemos encontrar, como vemos, con errores de tipo URLError. Si trabajamos con HTTP podemos encon- trarnos también con errores de la subclase de URLError HTTPError, que se lanzan cuando el servidor devuelve un código de error HTTP, como el error 404 cuando no se encuentra el recurso. También podrÃamos encontrarnos con errores lanzados por la librerÃa que urllib2 utiliza por debajo para las transferencias HTTP: httplib; o con excepciones lanzadas por el propio módulo socket. La función urlopen cuenta con un parámetro opcional data con el que poder enviar información a direcciones HTTP (y solo HTTP) usando POST (los parámetros se envÃan en la propia petición), por ejemplo para responder a un formulario. Este parámetro es una cadena codifi- cada adecuadamente, siguiendo el formato utilizado en las URLs: â??password=contrase%A4a&usuario=manuelâ?? Lo más sencillo para codificar la cadena es utilizar el método urlen- code de urllib, que acepta un diccionario o una lista de tuplas (clave, valor) y genera la cadena codificada correspondiente: <? import urllib, urllib2 params = urllib.urlencode({â??usuario": â??manuel", â??password": â??contraseña"}) 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 función urlretrieve de urllib en lugar de leer de un objeto creado con urlopen y escribir los datos leÃdos. La función urlretrieve toma como parámetros la URL a descar- gar y, opcionalmente, un parámetro filename con la ruta local en la que guardar el archivo, un parámetro data similar al de urlopen y un parámetro reporthook con una función que utilizar para informar del progreso. A excepción de las ocasiones en las que se utiliza el parámetro data las conexiones siempre se realizan utilizando GET (los parámetros se envÃan en la URL). Para enviar datos usando GET basta con concate- nar la cadena resultante de urlencode con la URL a la que nos vamos a conectar mediante el sÃmbolo ?. params = <? urllib.urlencode({â??usuario": â??manuel", â??password": â??contraseña"}) f = urllib2.urlopen(â??http://ejemplo.com/login" + â???" + params)?> En urllib también se utiliza una función urlopen para crear nuestros pseudo-archivos, pero a diferencia de la versión de urllib, la función urlopen de urllib2 también puede tomar como parámetro un objeto Request, en lugar de la URL y los datos a enviar. La clase Request define objetos que encapsulan toda la información relativa a una petición. A través de este objeto podemos realizar peti- ciones más complejas, añadiendo nuestras propias cabeceras, como el User-Agent. El constructor más sencillo para el objeto Request no toma más que una cadena indicando la URL a la que conectarse, por lo que utilizar este objeto como parámetro de urlopen serÃa equivalente a utilizar una cadena con la URL directamente. Sin embargo el constructor de Request también tiene como paráme- tros opcionales una cadena data para mandar datos por POST y un diccionario headers con las cabeceras.
Interactuar con webs Existen dos módulos principales para leer datos de URLs en Python: urllib y urllib2. En esta lección aprenderemos a utilizar urllib2 ya que es mucho más completo, aunque urllib tiene funcionalidades propias que no se pueden encontrar en urllib2, por lo que también lo tocaremos de pasada. puede leer datos de una URL usando varios protocolos como urllib2 HTTP, HTTPS, FTP, o Gopher. Se utiliza una función urlopen para crear un objeto parecido a un fichero con el que leer de la URL. Este objeto cuenta con métodos como read, readline, readlines y close, los cuales funcionan exac- tamente 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 método read, como recordareis, sirve para leer el â??archivo" completo o el número de bytes especificado como parámetro, readline para leer una lÃnea, y readlines para leer todas las lÃneas y devolver una lista con ellas. También contamos con un par de métodos geturl, para obtener la URL de la que estamos leyendo (que puede ser útil para comprobar si ha habido una redirección) e info que nos devuelve un objeto con las cabeceras de respuesta del servidor (a las que también se puede acceder mediante el atributo headers). <? import urllib2 try: f = urllib2.urlopen(â??http://www.python.org") print f.read() f.close() except HTTPError, e: print â??Ocurrió un error" print e.code except URLError, e: print â??Ocurrió un error" print e.reason ?> Al trabajar con urllib2 nos podemos encontrar, como vemos, con errores de tipo URLError. Si trabajamos con HTTP podemos encon- trarnos también con errores de la subclase de URLError HTTPError, que se lanzan cuando el servidor devuelve un código de error HTTP, como el error 404 cuando no se encuentra el recurso. También podrÃamos encontrarnos con errores lanzados por la librerÃa que urllib2 utiliza por debajo para las transferencias HTTP: httplib; o con excepciones lanzadas por el propio módulo socket. La función urlopen cuenta con un parámetro opcional data con el que poder enviar información a direcciones HTTP (y solo HTTP) usando POST (los parámetros se envÃan en la propia petición), por ejemplo para responder a un formulario. Este parámetro es una cadena codifi- cada adecuadamente, siguiendo el formato utilizado en las URLs: â??password=contrase%A4a&usuario=manuelâ?? Lo más sencillo para codificar la cadena es utilizar el método urlen- code de urllib, que acepta un diccionario o una lista de tuplas (clave, valor) y genera la cadena codificada correspondiente: <? import urllib, urllib2 params = urllib.urlencode({â??usuario": â??manuel", â??password": â??contraseña"}) 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 función urlretrieve de urllib en lugar de leer de un objeto creado con urlopen y escribir los datos leÃdos. La función urlretrieve toma como parámetros la URL a descar- gar y, opcionalmente, un parámetro filename con la ruta local en la que guardar el archivo, un parámetro data similar al de urlopen y un parámetro reporthook con una función que utilizar para informar del progreso. A excepción de las ocasiones en las que se utiliza el parámetro data las conexiones siempre se realizan utilizando GET (los parámetros se envÃan en la URL). Para enviar datos usando GET basta con concate- nar la cadena resultante de urlencode con la URL a la que nos vamos a conectar mediante el sÃmbolo ?. params = <? urllib.urlencode({â??usuario": â??manuel", â??password": â??contraseña"}) f = urllib2.urlopen(â??http://ejemplo.com/login" + â???" + params)?> En urllib también se utiliza una función urlopen para crear nuestros pseudo-archivos, pero a diferencia de la versión de urllib, la función urlopen de urllib2 también puede tomar como parámetro un objeto Request, en lugar de la URL y los datos a enviar. La clase Request define objetos que encapsulan toda la información relativa a una petición. A través de este objeto podemos realizar peti- ciones más complejas, añadiendo nuestras propias cabeceras, como el User-Agent. El constructor más sencillo para el objeto Request no toma más que una cadena indicando la URL a la que conectarse, por lo que utilizar este objeto como parámetro de urlopen serÃa equivalente a utilizar una cadena con la URL directamente. Sin embargo el constructor de Request también tiene como paráme- tros opcionales una cadena data para mandar datos por POST y un diccionario headers con las cabeceras.