Skip to content

Técnicas elementales de Data Mining automatizado: Extracción de enlaces de una página web

Publicado por Sergio Hernando el 17 enero 2008

Hola,

Estaba haciendo algún experimento que otro, y se me ha ocurrido contaros un poco de qué va el asunto.

La minería de datos Web es una técnica crucial. Los buscadores viven de ella, y para nuestra desgracia, también la usan los spammers para incorporar contenidos a sus listas de distribución. Muy esquemáticamente, minar datos Web equivale a automatizar procesos que buscan datos en páginas y generan inteligencia posterior, extrayendo información de los contenidos minados e incorporando criterios de almacenamiento a una base de datos. Por ejemplo, buscar páginas que contengan la palabra clave "Linux" y generar una base de datos donde aparece la URL de la página que contiene el término, el número de veces que la contiene (densidad de keyword) y si aparece o no el término buscado en la URL es un minado de datos elemental con inteligencia.

En síntesis, una araña o buscador Web es un conjunto de programas que recorren páginas y van incorporando a su índice información para que luego podamos buscarlos por criterios introduciendo en el buscador un conjunto de términos que queremos localizar. Huelga decir que las arañas modernas recaban mucha más información que la que hemos puesto de ejemplo, y generan bases de datos donde los criterios son múltiples y de toda índole, constituyéndose en algunos casos como motores tendentes a la inteligencia artificial. Ejemplos de arañas moderna pueden ser Googlebot, o Yahoo! Slurp, que son los motores principales que asisten los procesos de minería de los buscadores Google y Yahoo! respectivamente.

Para ilustrar estos procesos de minería automatizado, vamos a recurrir ejemplos muy sencillos en Perl. El motivo de escoger Perl es por la presencia de módulos ya elaborados especializados en recuperación de datos Web, y de hecho, muchos buscadores se apoyan en software programado en este lenguaje. No os preocupéis, que no vamos a programar una araña, tan sólo veremos funcionalidades básicas que cualquier motor de búsqueda incorpora para ejemplificar las técnicas de minería automatizada de datos.

Lo más elemental

Vamos a recuperar el código fuente de una página. Para ello empleamos el siguiente código que salvaremos como script1.pl, y donde nos apoyaremos en el módulo LWP::Simple, una versión simplificada de libwww-perl.

  1.  
  2. use LWP::Simple;
  3.  
  4. getprint("http://www.perl.org");
  5.  
  6. die "Ejecucion finalizada\n";
  7.  

Ejecutamos:

  1.  
  2. perl script1.pl
  3.  

La salida de este script no es otra que el código fuente HTML puro y duro de http://www.perl.org

Grabar una página HTML

Otro ejemplo para ilustrar los mecanismos de recuperación es grabar una página. Para ello, nuevamente, nos apoyamos en LWP::Simple, pero esta vez en la función getstore();

  1.  
  2. use LWP::Simple;
  3.  
  4. getstore("http://www.perl.org", "paginaguardada.html");
  5.  
  6. die "Ejecucion finalizada\n";
  7.  

La salida de este comando es un fichero llamado paginaguardada.html, en el que se ha volcado el código fuente que se recuperaría mediante getprint(); en un fichero HTML. Eso sí, sólo se vuelca la página, no los enlaces que requiera, como por ejemplo, hojas de estilo. Transporte de código a fichero, puro y duro.

Complicando un poco más las cosas

Todo esto se puede complicar todo lo que queramos. El último ejemplo nos va a permitir sacar a fichero la colección de enlaces http:// presentes en una página determinada. Para ello vamos imaginar que alguien quiere coger los enlaces de las guías de seguridad de la NSA que tengo publicados en http://www.sahw.com/wp/archivos/2007/12/11/guias-de-configuracion-de-seguridad-de-la-nsa/
para poder publicarlos en su blog. Una posible manera es editar el código fuente, copiar en un editor, filtrar y salvar. Mediante Perl es más sencillo y lo haremos empleando otro módulo típico en minería automatizada, HTML::LinkExtor, especializado en la extracción de enlaces de documentos HTML. Generamos el fichero script2.pl con el siguiente código:

  1.  
  2. use HTML::LinkExtor;
  3. use LWP::Simple;
  4.  
  5. my $pagina = get(shift) ||
  6.  
  7. "<html><body>Not found</body></html>";
  8.  
  9. my $recuperador = new HTML::LinkExtor;
  10.  
  11. $recuperador->parse($pagina);
  12.  
  13. my @enlaces = $recuperador->links;
  14.  
  15. foreach (@enlaces) {
  16.  
  17. while (my ($exclusiones) = splice(@$_, 2)) {
  18.  
  19. next unless $exclusiones =~ m/nsa.gov/;
  20.  
  21. print "$exclusiones\n";
  22.  
  23. }
  24. }
  25.  

Ejecutamos especificando la URL que queremos rastrear:

  1.  
  2. perl script2.pl "http://www.sahw.com/wp/archivos/2007/12/11/guias-de-configuracion-de-seguridad-de-la-nsa/"
  3.  

El resultado es una colección de enlaces directos a los documentos expuestos en el artículo, y que cumple con el criterio de exclusión que hemos declarado (mostrar sólo enlaces que contengan la secuencia nsa.gov)

http://www.nsa.gov/notices/notic00004.cfm?Address=/snac/app/I733-033R-2006.pdf
http://www.nsa.gov/notices/notic00004.cfm?Address=/snac/app/I733-032R-2006.pdf
http://www.nsa.gov/notices/notic00004.cfm?Address=/snac/app/I733-004R-2007.pdf
http://www.nsa.gov/notices/notic00004.cfm?Address=/snac/app/I733-005R-2007.pdf
http://www.nsa.gov/notices/notic00004.cfm?Address=/snac/app/I733-007R-2007.pdf
http://www.nsa.gov/notices/notic00004.cfm?Address=/snac/webs/I33-004R-2005.pdf
http://www.nsa.gov/notices/notic00004.cfm?Address=/snac/app/I731-008R-2006.pdf

...

y así hasta un total de 96 URLs que están enlazadas en ese artículo.

¿Cuantos enlaces contienen todos los artículos de este blog?

El proceso de extracción de enlaces se puede automatizar de múltiples maneras, así que preparé un script en bash que ejecutaba cíclicamente el script de extracción perl, de modo que se ejecutase sobre la totalidad de artículos el blog. He recorrido todos los enlaces, comenzando por http://www.sahw.com/wp/archivos/2004/01/06/ao-nuevo-weblog-nuevo/, primer enlace vivo del blog, y que publiqué el 6 de enero de enero de 2004 (me acabo de dar cuenta que hace 12 días este blog empezó su andadura en su cuarto año de vida, lo que son las cosas). La recolecta la detuve a comienzos de esta semana, con lo que no están todos, pero sí su mayoría.

La minería la hice sin tratamiento de errores, con lo que los potenciales cortes de conexión o caídas del hospedaje pueden haber mermado la cantidad de enlaces recolectados. Sea como fuere, el resultado es este fichero, donde están recogidos todos los enlaces publicados en artículos y comentarios. Esta misma operación la hacen a diario Google, Yahoo y un sinfín más de agentes, entre los que lógicamente están los operados por spammers en busca de información. Obviamente, no se conforman con sólo enumerar los enlaces, sino que los guardan y los relacionan con los artículos de diversas maneras.

Para el que no tenga ganas de contar, estos 267277 bytes contienen 5222 enlaces, lo que implica que en los 1107 días que llevamos abiertos, entre todos hemos enlazado una media de 4,71 enlaces por día. Algunos son URLs no válidas, ya que son inventadas por los comentaristas (http://CriticasobrelosAntispyware, http://Google, http://Informacinenespaol, http://Informacion, http://Julio y similares) si bien son en número casi despreciables. Están ordenados alfabéticamente :)

Un saludo,

Be Sociable, Share!
Un comentario

Trackbacks & Pingbacks

  1. meneame.net

Escribir un comentario

Note: XHTML permitido. Tu email nunca será publicado.

Suscribirse a los comentarios via RSS