Código para automatizar la obtención de datos usando R

por Isaura Espinosa de los Monteros

Esta entrada busca mostrar una manera de sistematizar la obtención de datos de internet, a través de un proceso mucho menos cansado y falible que el fastidioso proceso de copiar y pegar, celda por celda en Excel. La herramienta que se utilizará es R, no sólo porque dentro de sus ventajas está el hecho de que es gratis (lenguaje que puedes obtener ), sino porque es completamente programable, lo que brinda flexibilidad para realizar funciones especializadas. Los principales comandos que usaré para crear el código son gregexpr y gsub. Éstos serán útiles para identificar patrones dentro del texto que conforma el código fuente de la página de internet que contiene la información deseada, hacerles modificaciones pertinentes y extraerlos.

La aplicación que le daré a este proceso será la creación de una base de datos con la totalidad de proposiciones hechas por los diputados de la 59a legislatura (2003-06). Los campos de interés para la base de datos serán el título de la proposición, quién la propuso, quién la suscribió, si fue aprobada o no, si fue turnada o no a una comisión, la fecha en que fue presentada y el link para leer más al respecto en internet. El código que he generado para la legislatura 59 puede replicarse fácilmente para otras legislaturas.

Lo primero que hice fue visitar la página web de la cámara de diputados (http://gaceta.diputados.gob.mx) para identificar, en el código HTML, los registros de las proposiciones. Cada periodo de cada legislatura tiene un código fuente propio, todos estos códigos comparten la misma estructura. Un primer vistazo a este código nos dará la pauta a seguir para programar la obtención de datos. La sintaxis del código fuente HTML permite buscar marcadores. Un vistazo al código fuente permite detectar que cada proposición es un pedazo de información que empieza con las palabras “Con punto de acuerdo” y termina con la dirección URL de una página de internet. Este subconjunto del código contiene toda la información que se recuperó y sistematizó. Un ejemplo aparece a continuación.

<ul><li> Con punto de acuerdo, para crear una comisión especial plural que dé seguimiento exhaustivo a las investigaciones que las autoridades competentes realizan a fin de esclarecer los homicidios perpetrados contra mujeres en Ciudad Juárez, Chihuahua. <br>Presentada por legisladoras y legisladores de diversos grupos parlamentarios. <br>Turnada a la Junta de Coordinación Política. <br><a href=”/Gaceta/59/2003/sep/20030903.html#Propo20030903CiudadJuarez“>Gaceta Parlamentaria</a>, número 1325, miércoles 3 de septiembre de 2003. (1) </li></ul>

Mi código comenzará por instruir a R a que lea y guarde las páginas de internet para poder acceder a la información que se encuentra ahí:

gp59_P_a1primero <- getURL("http://gaceta.diputados.gob.mx/Gaceta/Proposiciones/59/gp59_P_a1primero.html")

El proceso se repite cambiando el subdirectorio correspondiente a los demás periodos de la 59 Legislatura, creando tantos objetos como periodos hubo. Posteriormente agrupé cada uno de los objetos creados en una lista:

leg59_files <- ls(pattern="gp59")

Lo que sigue es un loop que itera las operaciones de búsqueda y extracción de datos en cada uno de los elementos de la lista hasta llegar al final.

for(k in 1:length(leg59_files)){
    current <- eval(parse(text=leg59_files[k]))
}

La primera forma de subdividir el código será por fechas. El pedazo que tomo y que va de una fecha a la siguiente contiene un número variable de proposiciones. Las fechas son identificables por el marcador #CC0000, que en la página web es lo que lo imprime en rojo, color distinto al resto de la página. Un ejemplo es el siguiente.

<br><font color=”#CC0000″>Martes 2 de septiembre de 2003</font>

El loop repetirá las instrucciones para cada una de las n fechas en que fueron presentadas proposiciones en la legislatura.

for(n in 1:(length(gregexpr(pattern = "\"#CC0000\"",current)[[1]])-1)){
    chunk1 <- gregexpr(pattern = "\"#CC0000\"",current)[[1]][n]
    chunk2 <- gregexpr(pattern = "\"#CC0000\"",current)[[1]][n+1]
    chunk <- substring(current,chunk1,chunk2)
    fechachunk1 <- gregexpr(pattern = ">",chunk)[[1]][1]
    fechachunk2 <- gregexpr(pattern = "<",chunk)[[1]][1]
    fecha <- substring(chunk, fechachunk1 +1, fechachunk2 -1)
}

Una vez establecida esta división, se hará la división por proposición, que como se había dicho anteriormente va desde la frase “Con punto de acuerdo” hasta el html de la proposición.  La nueva subdivisión –subchunk en mi código, que en inglés denomina un sub-pedazo– se concatena para que toda la información que va desde el primer carácter hasta la primera aparición de “html” se tome como una propuesta; del carácter que sucede inmediatamente a lo anterior hasta las siguiente instancia de “html” como otra propuesta, y así sucesivamente.

subchunk1 <- gregexpr(pattern = ".html", chunk)
subchunk1 <- c(1, subchunk1[[1]])

Aunque cada división que se hizo tiene un claro patrón de inicio y uno de fin, cada pedazo tiene una composición distinta. Intenté abordar todas las diferencias mediante un condicional (if). Se podría decir que este condicional corta en pedacitos las proposiciones, haciendo un corte en cada característica de la propuesta. Un corte cuando aparece quien la presento, un corte si fue suscrita y por quién, un corte si fue turnada y un último corte si fue aprobada. De esta manera si existiera una proposición que tuviera cada una de estas características entonces tendría cuatro cortes.

# subchunk es la propuesta hasta el html
subchunk <- substring(chunk, subchunk1[i], subchunk1[i+1] + 4)
inprop <- gregexpr(pattern = "Con punto de acuerdo,", subchunk)
finprop <- gregexpr(pattern = "Presentada", subchunk)
propuesta <- substring(subchunk, inprop[[1]][1], finprop[[1]][1])

# Fin del que propone, hay varias opciones:
finpresentada1 <- gregexpr(pattern = "Suscrita", subchunk)
finpresentada2 <- gregexpr(pattern = "Aprobada", subchunk)
finpresentada3 <- gregexpr(pattern = "Turnado", subchunk)
finpresentada4 <- gregexpr(pattern = "Turnada", subchunk)

#Final subchunk
finsubchunk <- gregexpr(pattern = "href", subchunk)
link <-substring(subchunk, finsubchunk, subchunk1[i+1])
flag <- 0

if(!is.na(finpresentada1)){
    if(finpresentada1[[1]][1] != -1){
        presentada <- substring(subchunk, finprop[[1]][1], finpresentada1)
        if(finpresentada2[[1]][1] != -1 ){
            suscrita <- substring(subchunk, finpresentada1, finpresentada2[[1]][1])
        }
        if(finpresentada3[[1]][1] != -1 ){
            turnado <- substring(sucbchunk, finpresentada1, finpresentada3)
        }
        if(finpresentada4[[1]][1] != -1 ){
            turnado <- substring(subchunk, finpresentada1, finpresentada4[[1]][1])
        }
    }
}
if(!is.na(finpresentada2)){
    if(finpresentada2[[1]][1] != -1 ){
        presentada <- substring(subchunk, finprop[[1]][1], finpresentada2[[1]][1])
        aprobada <- substring(subchunk, finpresentada2[[1]][1], finsubchunk)
    }
}
if(!is.na(finpresentada3)){
    if(finpresentada3[[1]][1] != -1 ){
        presentada <- substring(subchunk, finprop[[1]][1], finpresentada3)
        turnado <- substring(subchunk, finpresentada3, finsubchunk)
    }
}
if(!is.na(finpresentada4)){
    if(finpresentada4[[1]][1] != -1 ){
        presentada <- substring(subchunk, finprop[[1]][1], finpresentada4[[1]][1])
        turnado <- substring(subchunk, finpresentada4[[1]][1], finsubchunk)
    }
}

El código que he mostrado en esta entrada no pretende ser el único ni el mejor para construir una base de datos sobre proposiciones. Pero demuestra que un politólogo puede echar mano de excelentes herramientas para automatizar la obtención de información y crear bases de datos. Lo que antes se hacía vaciando información registro por registro a una base de excel – se leía la página de internet, se memorizaban pedazos, se los reescribía – puede hacerse en una fracción del tiempo mediante código informático.

Anuncios

3 pensamientos en “Código para automatizar la obtención de datos usando R

  1. Reblogueó esto en stats, political science, and religiony comentado:
    Este post, cuyo crédito corresponde por entero a Isaura Espinosa de los Monteros (pasante de Ciencia Política y Relaciones Internacionales del ITAM en la ciudad de México), busca sistematizar la obtención de datos de internet, a través de un proceso mucho menos cansado que el fastidioso “copiar y pegar” celda por celda en una hoja de cálculo. El paquete estadística que se utiliza es R. Vale la pena leerlo.

Deje una respuesta / Leave a Reply

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

w

Conectando a %s