WebStruct (Samuel Solís: SISTEMAS DE INFORMACIÓN en MI2)

Hace tiempo leí un artículo en la página web ciencia-explicada en que se hablaba de un pequeño motor que localizaba el número de links más corto para ir de un término a otro dentro de la wikipedia. En ese artículo (link para enlazar: http://www.ciencia-explicada.com/2010/12/el-buscador-de-caminos-en-wikipedia.html) se hablaba sobre cómo llegar en tres clicks de “chiquito de la calzada” a “Obama”. En ese momento nació la idea de WebStruct. La distancia que hay entre esos dos personajes no es demasiado relevante, pero sí puede serlo dentro de algunas páginas dentro de un portal bien estructurado y que tenga un fin. De esta forma, fue madurando la idea de crear un sistema que permitiese generar un grafo de un portal de Internet y así poder aplicar toda la teoría de grafos, potente y muy estudiada, para realizar pequeñas aplicaciones que nos den resultados relevantes en los campos de accesibilidad y analítica web.

El objetivo es poder ofrecer a los analistas webs herramientas que permitan obtener información sobre la estructura de la página web. No sólo el número de enlaces entre las páginas, sino cómo son esos enlaces, dónde están situados, errores relativos a accesibilidad y posicionamiento en buscadores, etc.

Técnicamente el programa está hecho en C++ con una estructuración pensada para poder ampliarlo y modificarlo de forma sencilla. Para realizar las peticiones HTTP se ha utilizado la librería libCurl que permite una cantidad de opciones considerable, en vista a posibles ampliaciones de la funcionalidad. Así mismo, el análisis del código HTML de cada una de las páginas del portal se realizará (aún está por integrar) con la herramienta Bison y Lexx, que permiten también incrementar las opciones a realizar desde este punto.

Para el desarrollo del proyecto está siguiendo una metodología basada en el concepto del “mínimo proyecto viable” por lo que en esta primera iteración se intentará realizar algo funcional pero con pocas prestaciones, pudiendo ser ampliado en diferentes iteraciones.

Algunos enlaces interesantes:

Sobre grafos en las redes sociales:

Los grafos y su relación con las redes sociales

Página de libCurl:
http://curl.haxx.se/libcurl/cplusplus/

Página oficial de Bison:
http://www.gnu.org/software/bison/

Artículo de ciencia-explicada:
http://www.ciencia-explicada.com/2010/12/el-buscador-de-caminos-en-wikipedia.html

pablogarguez

@pablogarguez es actualmente #Investigador y Profesor Titular de Ingeniería Informática de la Escuela Politécnica en la Universidad de Extremadura en Cáceres. Ha sido Director General de Agenda Digital de la Consejería de Economía, Ciencia y Agenda Digital de la Junta de Extremadura, desde septiembre de 2019 a agosto de 2023. Fue Director de la Escuela Politécnica de Cáceres (School of Technology) de la Universidad de Extremadura durante 3 años (2017-2019), con titulaciones de grado, máster y doctorado en los campos de Ingeniería Civil, Edificación, Informática y Telecomunicaciones. Su trayectoria docente comienza en 1997 básicamente en asignaturas de Programación y de Bases de Datos. Su actividad investigadora se ha centrado en el Reconocimiento de Patrones y la Ciberseguridad. Fruto de esta labor de investigación, resaltar que es coautor de más de veinte artículos publicados en revistas internacionales indexadas en JCR, con un índice H de 12 en cuanto a las citas conseguidas por estos artículos. Actualmente tiene 3 sexenios de investigación a nivel nacional, y el último de ellos es un sexenio vivo (activo). También posee un sexenio de transferencia en la única convocatoria abierta hasta ahora por el Ministerio (2019).

5 comentarios en “WebStruct (Samuel Solís: SISTEMAS DE INFORMACIÓN en MI2)”

  1. EL PARSER SE RESISTE

    Mucho está costando la realización de un parse de HTML en C++. La idea inicial es obtener todos los enlaces de na página HTML, pudiendo guardar sus clases, identificadores, y por supuesto, urls destino. Lo que en principio parece una tarea fácil se complica si queremos hacerla mínimamente ampliable.

    La idea es desarrollar el parser de tal manera que en un futuro de una forma sencilla se pueda añadir funcionalidad a la aplicación. En vez de buscar enlaces, buscaremos enlaces dentro de elementos, identificaremos otros elementos de la página etc.

    Después de mucho rebuscar por la red y no encontrar ninguno implementado en C++, llegamos al a conclusión de que tocaba trabajar un poco más de la cuenta. Flexx y Bison son buenas herramientas de análisis que conocía de antemano y que fueron la primera opción. Varios días después, y tras mantener contacto con personas que conocían mejor la herramienta vimos que la integración no iba a ser nada sencilla. No es una herramienta para tratar una cantidad tan grande de ficheros, pero se iba a intentar. En el proceso de búsqueda de documentación sobre flexx++ (la variante de flexx orientado a objetos) encontré una herramienta de más fácil integración aunque menos potencia, se trata de la librería Spirit.

    Spirit es una librería de parseado de texto con bastante potencia. He podido observar ejemplos muy chulos con relativamente poco código. Sin embargo, su manejo no es nada trivial y aunque le he dedicado muchas horas a su estudio y a la realización del tutorial oficial (el inglés me fastidió un poco, pero conseguimos avances) aun no he sido capaz de implementar algo funcional al respecto. Pero seguiremos intentándolo. Siempre queda la última opción de realizarlo con las herramientas propias de c++ y strings, cosa que voy a intentar por todos los medios evitar pues me parece muy tedioso y poco flexible.

    Siendo esto la última parte de esta primera versión del proyecto, pues el grafo (la estructura) está construida y la herramienta para hacer peticiones HHTP también está integrada. ¡Sólo queda el último empujón! aunque lógicamente dado lo crítico del proceso está costando integrarlo.

    No cesaremos, desde luego. Si alguien tiene recomendaciones sobre el parseo de código en C++ que no dude en contactar conmigo.

    ¡Un saludo a todos!


    Samuel Solís
    samuelbarsa@gmail.com
    http://estoyausente.blogspot.com

  2. Otra forma más sencilla y natural es transformar en XHTML las páginas HTML que te descargues. Y posteriormente analizar (parsear) las páginas XHTML con un programa XSL que te permita extraer la información que deseas para cada enlace.
    Lo mejor es almacenar la información que extraigas también en XML para que luego puedas procesarla usando la misma técnica.
    También puede ser de utilidad para este tipo de problemas usar lenguajes XML de representación de grafos (como gxl y graphxml) y herramientas como graphviz para generar diferentes salidas a partir de un grafo de entrada.
    Ánimo y suerte con el trabajo.

  3. Dado que la idea general es tratar la información del contenido HTML, se me ocurre que otra posibilidad podría ser obtener toda esa información via DOM (Documento Objecto Model) y utilizar Javascript para ello, desde las páginas HTML en el cliente (el propio navegador Web).
    Y, como comenta Antonio Polo, almacenar toda esa información en XML, o incluso en alguna base de datos open source tipo Mysql.El estudio de toda la información podría realizarse a posteriori mediante consultas de esa BD.

    Desde luego la idea es muy buena y si sólo falta algún lenguaje de programación interna para su implementación, pues aquí dejo alguna idea.

    Un saludp

  4. Hola,

    gracias a los dos por las aportaciones.

    Valoré la idea de pasar el HTML a XHTML pues era bastante simple (ya hay algoritmos que lo hacen, no voy a reinventar la rueda) y luego tratarlo así, pero preferí mantener el código tal cual para poder realizar análisis sobre el mismo.

    Además decidí no gastar mucho esfuerzo en el parser en esta fase pues es un tema muy complejo y con muchas vías de escape que me gustaría analizar con más tiempo.

    La representación del grafo en XML es algo que tenía pensado, sobre todo para poder realizar cosas con él de manera sencilla en php. Sin embargo poco después salió la idea de pasarlo a Mysql e integrarlo con un sistema y me gustó mucho. Pese a que aun tengo que valorar bien las opciones creo que me decantaré por intentar guardar resultados en una base de datos (Mysql y php se llevan muy bien).

    Lo que no conocía eran las herramientas XML que mencionas, por lo que las revisaré antes de realizar nada con ese tema.

    Respecto al DOM… no he planteado la posibilidad de meter mano a javascript. La idea de hacer esta aplicación en un lenguaje como C++ era para aportar un plus de rendimiento. Actualmente el programa es capaz de analizar 50 nodos en menos de un segundo. Es cierto que en realizar las peticiones tarda una pasada (imaginate cargar 50 páginas web) pero no me está copando el procesador.es algo irremediable.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *