Obtener la tabla de posiciones del futbol chileno con crawler Goutte y laravel 5.2

Con la página nopuedojuegaelcolo.com he retomado lo que es el desarrollo de sistemas con laravel, para el sitio dedicado al popular recién mencionado, en donde quiero saber con quién juega el popular, cuando, como salió y en qué posición va el albo he utilizado varias cosas que he aprendido de personas y de varias pegas.

El primer encuentro con un crawler (o Una araña web, según wikipedia: es un programa que inspecciona las páginas de internet de forma metódica y automatizada), fue una vez que el Rolando Pérez, en planes s.a, necesitaba obtener el precio del dólar de ‘x’ pagina por allá por el 2010, y como le daba ‘flojera’ ingresarlo manuelmente creo un crawler para esto, yo solo sabía que eso hacía, pero nunca lo implemente ni lo vi.

El encuentro más cercano fue con scrapy y el camilo chacón en miningtag. Scrapy es una librería en python súper poderosa para hacer crawlers (veala acá https://scrapy.org/). Así que se puede decir que el concepto y ver cómo funcionaban las arañas se lo debo a chacón, es más, es el que me motivo a automatizar estas cosas, así que gracias chacón.

Una vez creado el sitio nopuedojuegaelcolo.com, me vi en la necesidad de automatizar unas tareas, ingresar datos toma tiempo, y como buen programador flojo me vi en la necesidad de automatizar tareas, una de esas fue el ingreso uno por uno las posiciones de los equipos del torneo nacional.

Entonces, vamos a codear, pero a lo flojo:

Lo primero que debemos hacer es un proyecto en laravel (5.3), para esto lo haremos utilizando composer:

composer create-project –prefer-dist laravel/laravel latabla “5.3.*”

Una vez creado el proyecto seguimos las instrucciones de goutte, se encuentran en el siguiente link laravel-goutte

La primera instrucción nos pide agregar laravel-goutte a nuestro proyecto, entonces corremos, posicionados en nuestro directorio, el siguiente comando:

composer require weidner/goutte

Una vez ejecutado el comando, y siguiendo el manual, agregamos las  aliases y providers.

En el ejemplo de github, la araña, se pasea por duckduckgo, nosotros utilizaremos el siguiente link para obtener la tabla de posiciones del futbol chileno.

http://es.fcstats.com/tabla,primera-division-chile,59,1.php

goutte, funciona utilizando los selectores de jquery para acceder a las clases e ids de los elementos html.

Entonces, investiguemos con el inspector la tabla:

1

Como se ve en la imagen, la tabla tiene la etiqueta tr y el id team_1024, que pertenece a colocolito, si se sigue inspeccionando se obtienen los ids de los demás clubes por deducción.

Quedando nuestro codigo de routes (el mismo del ejemplo de github, pero adaptado para obtener los datos de la tabla) de la siguiente forma:


Route::get('/', function() {

$crawler = Goutte::request('GET', 'http://es.fcstats.com/tabla,primera-division-chile,59,1.php');
//echo '
<pre>';var_dump($crawler); die();
echo '<font color="black">';
$crawler->filter('#team_1024')->each(function ($node) {
//  dump($node->text());
$td = $node->filter('tr')->text();
echo  $td;
});
echo '
';
$crawler->filter('#team_1035')->each(function ($node) {
//dump($node->text());
$td = $node->filter('tr')->text();
echo  $td;
});
echo '
';
$crawler->filter('#team_1413')->each(function ($node) {
//dump($node->text());
$td = $node->filter('tr')->text();
echo  $td;
});

echo '
';
$crawler->filter('#team_1029')->each(function ($node) {
//dump($node->text());
$td = $node->filter('tr')->text();
echo  $td;
});
echo '
';
$crawler->filter('#team_1028')->each(function ($node) {
//dump($node->text());
$td = $node->filter('tr')->text();
echo  $td;
});
echo '
';
$crawler->filter('#team_1026')->each(function ($node) {
//dump($node->text());
$td = $node->filter('tr')->text();
echo  $td;
});
echo '
';
$crawler->filter('#team_4028')->each(function ($node) {
//dump($node->text());
$td = $node->filter('tr')->text();
echo  $td;
});

echo '</font >';
die();

});

Si escribimos en nuestro navegador http://localhost/latabla/public/ obtendremos posición del equipo, nombre del equipo, partidos jugados, ganados, empatados, perdidos, goles a favor, en contra y el puntaje tal como se ve en la imagen:

2

Que es lo mismo que tenemos acá:

3

Y bueno, ya obteniendo los datos procesar los datos con los ids de los equipos y los espacios que tenemos por cada fila (tr) codear un insert a la base de datos es un juego, que se debe cranear cada uno.

Saludos.

Event-drive Architecture: el mediador

En nuestro primer post sobre EDA, mencionamos que este patrón de arquitectura tiene su eje en la producción, detección y respuesta ante un evento que tiene un significado para el sistema. Cada evento se propaga de manera inmediata a otras partes del sistema y así puede ser conocido por otras aplicaciones o clientes de la arquitectura. También, mencionamos que en esta arquitectura se habla de productor a quien produce el evento, y a consumidor, a quien recibe el evento.

Sigue leyendo

Event-Driven Architecture y Colas de mensajes.

Esta entrada es la primera de una serie de post acerca de Colas de mensajes, message queue o MQ, que dejare como testimonio en este blog.

La idea de esta serie de POST es mostrar como se utiliza ZeroMQ como librería de Colas de mensaje (y sockets), en su versión para .NET NETMQ, como base para un sistema orientado a eventos (EDA o Event-Driven architecture). Sigue leyendo

Class Library en c#

Una DLL (Dynamic-link library) o, en español, biblioteca de enlace dinámico, hace referencia  a archivos con código ejecutable que se vinculan a un programa en tiempo de ejecución.

Las DLLs, más comúnmente conocidas como librerías, contienen rutinas que pueden ser re – utilizadas por otras aplicaciones. Las de DLLs nos ayudan a mejorar la re utilización de código, ya que, en lugar de volver a escribir/copiar una y otras vez las rutinas en cada programa que se  necesite, estas se crean solo una vez y luego solo se hace referencia a nuestra librería desde el programa que necesite la funcionalidad.

Sigue leyendo