Script para extraer los datos de correo electrónico, blog, Twitter, Facebook y Youtube de los diputados del Congreso

Uno de los cometidos del Proyecto Praeter Orwell [Actualización 04-01-2017: proyecto no continuado] es el de poner a disposición pública, de una manera estructurada en archivos de valores separados por comas, los datos que se hallan repartidos por las webs de organismos oficiales.

Para realizar esta labor, utilizo técnicas de scraping mediante scripts que escribo en lenguaje Python. A continuación publico el script que utilizo para generar el archivo csv con los datos de los nombres y apellidos, partido político, correos electrónicos, dirección de blog, de página de Facebook, y de cuentas de Twitter y Youtube extraídas de la web del Congreso de los Diputados. El resultado es este archivo.

El script consta de las típicas importaciones, generación del nombre del archivo en el que almacenaremos los datos y 4 funciones: get_tree(url), get_urls_diputados(), extraer_datos(url) y crear_csv(urls, outfile), que paso a explicar.

Importamos los módulos y creamos el nombre del archivo (outfile) en el que se almacenarán los datos. El nombre final del archivo será del estilo "2011-08-06_diputados_twitter.csv". Si hace uso de este script, le recomiendo que o cambie el valor del directorio donde se creará el archivo o cree el mismo ("clean-data/poder-legislativo/personas/parlamentarios/congreso/") tomando como base el directorio desde el que se ejecutará el script. De todas maneras, es interesante conservar la ruta debido a la estructura de directorios propuesta en el Proyecto Praeter Orwell.

La función get_tree(url) genera el árbol del archivo que luego usaremos para extraer datos. Esta función prepara la conexión http añadiendo las cabeceras de User-agent identificándose como 'Mozilla/5.0'. La cabecera User-agent es necesaria pues el servidor de la web del Congreso así lo requiere, impidiendo la conexión en el caso en que la conexión no haya identificado el agente.

La función get_urls_diputados() genera una lista que corresponde a las 350 urls de los diputados del Congreso y lo realiza en dos etapas: en la primera de ellas obtiene las urls de las páginas índice, que ofrecen un máximo de 25 urls de diputados por índice, mientras que en la segunda etapa se conecta a la web del Congreso y extrae las 350 urls de los diputados desde las 13 urls de índices.

Para ello en la primera etapa hace uso "hard coded" de los datos de la url de índice, que divide en un prefijo y un sufijo (que son
invariables), dentro de los cuales introduce la cadena variable "&paginaActual=%s&idLegislatura=9" donde sustituye "%s" por el rango de 0 a 14.

En la segunda etapa, parsea la url del índice y mediante xpath extrae todos los enlaces de los parlamentarios: "parlamentarios = tree.xpath('//div[4]//li/a')"

La función extraer_datos(url) es la función que extraerá del código HTML los datos que consideramos relevantes y que son: el nombre y apellidos del diputado, el partido político, sus correos electrónicos (hay diputados con dos correos electrónicos), la dirección de su blog y sus cuentas de Twitter, Facebook y Youtube.

Esta función nuevamente utiliza xpath para identificar los datos y extraerlos y devuelve un diccionario cuyas claves son los datos que posteriormente procesaremos.

Por último, la función crear_csv(urls, outfile) genera el archivo csv con los datos extraídos por la función extraer_datos(url). Toma dos parámetros: "urls" -la lista de urls creada con la función get_urls_diputados()- y "outfile", que es el nombre del archivo que deseamos generar.

Para generar el archivo csv, basta ejecutar desde la línea de comandos la orden "$python congreso_twitter.py".

A continuación, el archivo completo: