Web scraping rudimentario

October 27, 2011
By

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íticasResultadosNA
1Alianza Frente para la Victoria11.593.02353,96%
2FERNANDEZ DE KIRCHNER, CRISTINA -BOUDOU, AMADONANA
3Alianza Frente Amplio Progresista3.624.51816,87%
4BINNER, HERMES JUAN -MORANDINI, NORMA ELENANANA
5Alianza Unión para el Desarrollo Social2.395.05611,15%
6ALFONSIN, RICARDO LUIS -GONZALEZ FRAGA, JAVIER ANTONIONANA
7Alianza Compromiso Federal1.714.3857,98%
8RODRIGUEZ SAA, ALBERTO JOSE -VERNET, JOSE MARIANANA
9Alianza Frente Popular1.264.6095,89%
10DUHALDE, EDUARDO -DAS NEVES, MARIONANA
11Alianza Frente de Izquierda y de los Trabajadores497.0822,31%
12ALTAMIRA, JORGE -CASTILLO, CHRISTIAN CARLOS HERNANNANA
13Coalición Cívica - Afirmación para una República Igualitaria ARI396.1711,84%
14CARRIO, ELISA MARIA EVELINA -PEREZ, JOSE ADRIANNANA

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.

Tags: ,

Comments are closed.