| This post was kindly contributed by Ciencia Política Computacional - go there to comment and to read the full post. |
La gracia de los métodos computacionales de análisis de datos reside en parte en la enorme cantidad de datos con la que disponemos en estos tiempos digitales, y la relativa facilidad para acceder a ellos. Pero en general los datos no vienen servidos en bandeja de plata, limpitos y ordenados, sino que requieren de mucho pre-procesamiento. Tan importante como los análisis que podamos realizar es, en mi opinión, contar con las herramientas necesarias para obtener datos y procesarlos.
El webcraping es la extracción de datos crudos de la web. Encuentro estas técnicas super útiles y me encantaría poder dominarlas, pero la verdad me cuesta bastante avanzar en este área.
A modo de práctica me propuse extraer la información de las recientes elecciones nacionales como figuran en el sitio http://www.elecciones2011.gob.ar
Esta vez, voy a necesitar el packete XML.
library(XML)
La idea general es esta: Cargar una URL y guardar la tabla con los resultados.
# La url corresponde a los resultados del total país
url <- "http://www.elecciones2011.gob.ar/paginas/paginas/dat99/DPR99999A.htm"
# Por default esta función guarda la tabla mas grande,
# que en este caso es la que queremos.
total <- readHTMLTable(url)
# Nos devuelve un vector simplificado con los componentes
# de la lista total
n.rows <- unlist(lapply(total, function(t) dim(t)[1]))
# Guardamos los datos como un data frame
df<-as.data.frame(total[[which.max(n.rows)]])
El resultado es algo más o menos así:
| Agrupaciones políticas | Resultados | NA | |
|---|---|---|---|
| 1 | Alianza Frente para la Victoria | 11.593.023 | 53,96% |
| 2 | FERNANDEZ DE KIRCHNER, CRISTINA -BOUDOU, AMADO | NA | NA |
| 3 | Alianza Frente Amplio Progresista | 3.624.518 | 16,87% |
| 4 | BINNER, HERMES JUAN -MORANDINI, NORMA ELENA | NA | NA |
| 5 | Alianza Unión para el Desarrollo Social | 2.395.056 | 11,15% |
| 6 | ALFONSIN, RICARDO LUIS -GONZALEZ FRAGA, JAVIER ANTONIO | NA | NA |
| 7 | Alianza Compromiso Federal | 1.714.385 | 7,98% |
| 8 | RODRIGUEZ SAA, ALBERTO JOSE -VERNET, JOSE MARIA | NA | NA |
| 9 | Alianza Frente Popular | 1.264.609 | 5,89% |
| 10 | DUHALDE, EDUARDO -DAS NEVES, MARIO | NA | NA |
| 11 | Alianza Frente de Izquierda y de los Trabajadores | 497.082 | 2,31% |
| 12 | ALTAMIRA, JORGE -CASTILLO, CHRISTIAN CARLOS HERNAN | NA | NA |
| 13 | Coalición Cívica - Afirmación para una República Igualitaria ARI | 396.171 | 1,84% |
| 14 | CARRIO, ELISA MARIA EVELINA -PEREZ, JOSE ADRIAN | NA | NA |
Nada mal para solo unas líneas. Claro que la idea es obtener los datos a nivel provincial y a nivel municipal / comunal. Acá es donde se me complican las cosas.
Para realizar el mismo procedimiento a nivel provincial, primero necesito las urls correspondientes. Para esto utilizo la funcion readLines.
# Obtenemos el código de la página principal
pag <- readLines("http://www.elecciones2011.gob.ar/paginas/paginas/dat99/DPR99999A.htm")
# Extraemos las líneas con los link. Hay que buscar en el código
# los tags que las identifican, en este caso <li>
# La función grep busca patrones de texto en un vector. Por alguna razón
# no me toma la línea de la CABA, pero bueno por ahora...lets move on.
links <- pag[grep("<li>", pag)]
# Extraemos solo los caracteres que forman parte de las urls
links<- substr(links,34,53)
# Como nuestros links solo muestran una parte,
# necesitamos la base de la url
url_base<-"http://www.elecciones2011.gob.ar/paginas/paginas"
# Pegamos la base de la url + el resto del link
urls<-paste(url_base, links,sep="")
# Borramos la primer línea que la del total país.
urls<- urls[-1]
Con esto ya tengo un vector con todas los urls a nivel provincial. La idea es hacer el procedimiento automático mediante una función que tomé cada línea/url y le aplique la funcion readHTMLTable. Suena sencillo, pero todavía no le encontré la vuelta.
Voy a seguir viendo como puedo hacer, mientras tanto toda ayuda es bienvenida.