WEBSCRAPING CON SLIMER.JS. PARTE 1. WEBSCRAPING

< script src=”my own” title=”webscraping con slimer. parte 1. webscraping” >

La tierra tiembla, eso es un hecho… ^^’

Pero más allá de eso, me preocupa que en Venezuela haya temblado tan seguido y que la gente esté tan “tranquila” :mrgreen:, es como para ponerse a pensar. Como yo pienso demasiado y muy seguido, me entró la curiosidad de curucutear una tecnología de la que hablé hace bastante tiempo en este post, se trata de Slimer.js, sin profundizar mucho en la documentación, eso lo dejo a ustedes 🙂

Aprovechando la página de Funvisis (Fundación Venezolana de Investigaciones Sismológicas, valga la cuña 😉 ), la cual tiene una información interesante sobre los sismos más recientes en mi bonito tricolor, y de la mano de Slimer.js, voy a hacerle un webscraping a la página, y “jugar” ( 😈 ) posteriormente con el JSON generado, hacer una API REST, persistirla en MongoDB, y tal vez subirla a Heroku

Manos a la ubre…

Slimer.js es bastante completo, tiene [casi] todas las funcionalidades de su competidor Phantom.js (o es al revés la cosa ❓ ), salvo que adolece de una buena documentación 😥 , pero por lo que puedo entender, la gran mayoría de las funciones escritas en Phantom.js, se ejecutan del mismo modo en Slimer.js. La sección de la página sobre la cual vamos a trabajar es esta:

Lista de sismos más recientes

Lista de sismos más recientes en Funvisis

Partiendo del hecho de que la información está estructurada adecuadamente, podemos recibir cada entrada así:

/*Clase Javascript para registrar una entrada de sismo*/
function Sismo(data_array) {
	this.fecha = data_array[0]; 		// fecha
	this.hora = data_array[1];			// hora
	this.latitud = data_array[2];		// latitud
	this.longitud = data_array[3];		// longitud
	this.profundidad = data_array[4];	// profundidad
	this.magnitud = data_array[5];		// magnitud
	this.localizacion = data_array[6];	// localizacion
};

Luego la parte pesada, usando Slimer.js. Para esto usamos el objeto webpage que se encarga de simular el comportamiento de renderizado de una página web como si fuera un navegador (recuerda que Slimer.js está basado en Gecko y XUL 🙂 )

var page = require("webpage").create(); //Instancia "webpage" de Slimer
page.settings = {
	javascriptEnabled: false, //No cargar scripts de la página
	loadImages: false,		//No cargar imágenes de la página
	plainTextAllContext: true //webpage.plainText es String en vez de DOM HTML
};
page.open("http://www.funvisis.gob.ve/sis_reciente.php").then(function(status) {
	if (status == "success") {
		console.log("Datos de "+ page.title);
		console.log("Actualizado al: "+ new Date());
		console.log(">=========================================================<");
		var data = page.plainText.match(/((.+\t)+)/gm); //Array con la data a ser procesada
		var index = 0;
		/*Búsqueda: String donde inician los datos significativos*/
		while(true) {
			if (/^\d+\/\d+\/\d+/.test(data[index]) || index == data.length) {
				break;
			}
			index++;
		}
		var sismos = [];
		/*Iteración: Transformamos el arreglo en un JSON válido*/
		for (var i = index; i < data.length; i++) {
			sismos.push(new Sismo(data[i].split('\t')));
		}
		console.log(JSON.stringify(sismos));
	} else {
		console.log("Pagina no encontrada :\( ");
	}
	page.close();
	slimer.exit();
});

No hay misterio en el procesamiento de la data, no diré más 😎 #nailedit

En la línea 1 se instancia el objeto webpage de Slimer.js que como dije antes, sirve para simular el comportamiento de renderizado de una página web, mientras que en la línea 2, quitamos la obtención de información irrelevante para nuestro caso. Ya en la línea 6, empieza el juego XD .

La línea 12 es por sentido común, ya que generalmente, las celdas de las filas en el contenido de las tablas en HTML5 cuando son instanciadas en formato de texto plano, Javascript las separa con un caractér de tabulador, no así con las celdas de la cabecera de la tabla 😀 , para más información sobre el uso de expresiones regulares vean estos posts.

Luego de obtener la data que interesa, cerramos el cliente headless-browser y salimos del script en las penúltimas líneas.

Se me olvidaba…

La instalación de Slimer.js es trivial si tienes Node.js y cualquier sistema GNU/Linux (yo tengo Debian 8 Jessie):

$ sudo npm -g install slimerjs

O como usuario root si no tienes permisos sudo. Igualmente la ejecución del script es igualmente trivial:

$ slimerjs app.js
Nada amigable, por ahora ^^'

Nada amigable, por ahora ^^’

Sumado a esto, y si la ejecución es adecuada, te saldrán dos ventanas, una con el logo de Slimer.js y otra con el “renderizado” de la página según lo que hayas desarrollado en el script, pero puedes ignorarlas tranquilamente. Por el momento, solo tenemos un flujo JSON con toda la información de la tabla, luego sigo temblando, perdón, pensando 😉

</script>

Anuncios