domingo, 2 de enero de 2011

Analizando las 130 mil obras del Gobierno (Parte II: Descargando la información al disco duro)

Nota: A los impacientes de toda la vida les pongo de una vez a disposición los enlaces para que puedan descargar los archivos a su computadora, revisarlos con Excel o en el mejor de las casos con MySQL:

- Los archivos los pueden descargar desde: http://achahuasoncco.blogspot.com/2011/01/analizando-las-130-mil-obras-del_5784.html


Pronto conocerán que esta web no es lo demasiado compleja como para extraer esa información y hacerla disponible para los diferentes analistas.
******************************

Pagina tediosa, para revisar los archivos de uno en uno. Mi idea era, y desde que apareció el bendito sitio, automatizar la descarga de la misma para que desde mi propia PC y con herramientas más útiles pudiera hacerme una idea acerca de los datos que nos ofrecía el Gobierno.

Analizando la página con Mozilla Firebug: 

Recopilar toda la información de cuántas páginas y cuales eran sus URL exactas para hacer una copia local sería una tarea titánica de no ser por el firebug:


La página usa un iframe en el cual se puede ver la información, la primera impresión es que usaron ajax, pero no es así. Bien, después de analizar el código HTML y el código javascript encuentro que las URL de las páginas tienen la siguiente forma

http://www.130milobras.presidencia.gob.pe/detobras.asp?dep=XX&hidpage=YY

En donde XX indica el código de la Región en donde esta hecha la "obra" y YY indica el número de página. Después de darle otra mirada a cada una de las páginas de la lista tenemos lo siguiente:

La Región 01 es Amazonas: 79 páginas
La Región 02 Ancash: 223 páginas
La Región 03 Apurimac: 88 páginas
La Región 04 Arequipa: 137 páginas
La Región 05 Ayacucho:  142 páginas
La Región 06 Cajamarca: 169 páginas
La Región 07 Callao: 22 páginas
La Región 08 Cusco: 190 páginas
La Región 09 Huancavelica: 125 páginas
La Región 10 Huanuco: 87 páginas
La Región 11 Ica: 64 páginas
La Región 12 Junin: 157 páginas
La Región 13 La Libertad: 120 páginas
La Región 14 Lambayeque: 67 páginas
La Región 15 Lima: 274 páginas
La Región 16 Loreto: 76 páginas
La Región 17 Madre de Dios: 18 páginas
La Región 18 Moquegua: 46 páginas
La Región 19 Pasco: 54 páginas
La Región 20 Piura: 117 páginas
La Región 21 Puno: 158 páginas
La Región 22 San Martín: 87 páginas
La Región 23 Tacna: 60 páginas
La Región 24 Tumbes: 35 páginas
La Región 25 Ucayali: 44 páginas
La Región 99 Multidepartamental: 3 páginas

Teniendo esta información sólo queda usar una herramienta para que descargue hacia mi PC, haga una copia local. Al inicio me vino a la mente PHP y su librería cURL para poder automatizar la tarea, sin embargo antes tuve problemas porque PHP por defecto no puede ejecutar un script que supere los 300 segundos, o 5 minutos, así que descarté esa alternativa. En mi corta experiencia con Perl pude recordar que una vez comparé dos archivos de texto, uno con 12 mil registros y otro con 2 mil y el tiempo de procesamiento fue bastante muy rápido pese a que lo hice en una computadora con un procesador Pentium D...

En Perl tenemos:

descargar.pl
******************************************
#! /bin/usr/perl

%zonas = ("01" => "79",
"02" => "223",
"03" => "88",
"04" => "137",
"05" => "142",
"06" => "169",
"07" => "22",
"08" => "190",
"09" => "125",
"10" => "87",
"11" => "64",
"12" => "157",
"13" => "120",
"14" => "67",
"15" => "274",
"16" => "76",
"17" => "18",
"18" => "46",
"19" => "54",
"20" => "117",
"21" => "158",
"22" => "87",
"23" => "60",
"24" => "35",
"25" => "44",
"99" => "3");

use LWP::UserAgent;
use HTTP::Request;

my $ua = LWP::UserAgent->new;
$ua->agent("AgenteSmith 1.0 (http://achahuasoncco.blogspot.com/)");
while (($zona,$paginas) = each %zonas) {
    for ($i = 1; $i <= $paginas; $i++) {
        $nombre = "obra-".$zona."-".$i.".html";
        open(PRUEBA,">>$nombre") || die "No se pudo crear archivo";
        $url = "http://www.130milobras.presidencia.gob.pe/detobras.asp?dep=$zona&hidpage=$i";
        $req = HTTP::Request->new(GET => $url);
        $response = $ua->request($req);
        $cadena = $response->content();
        print PRUEBA $cadena;
        close(PRUEBA);
    }
}

******************************************
Archivo en el cual he almacenado en la variable %zonas los códigos de región (clave) y las páginas a descargar (valor), teniendo la estructura de la forma: $zonas{"region"} = "paginas";
El bucle while externo lo uso para iterar entre regiones y valores por dos razones: La primera es acceder a la URL exacta para descargar la web respectiva y, segundo, para escribir en el disco duro un archivo de la forma obra-XX-YY.html, en donde XX indica la región y YY indica la página respectiva desde donde se está descargando. Para poder hacer la descarga uso los módulos LWP::UserAgent y HTTP::Request.

Después de esperar unos 30 minutos en el segundo intento obtengo las 2642 páginas descargadas a mi disco duro. Durante la primera prueba la conexión con el servidor se cortó después de 458 páginas.

Para poder extraer la información se necesita analizar el código fuente de la página web, ese es el siguiente post.

Buscar:

Se ha producido un error en este gadget.