Adaptación de JMeter para la minería de datos de estructuras de páginas web.
Director: Carlos Guerrero Tomé
Alumno: Agustín Sabater Piñeiro
ESCUELA POLITÉCNICA SUPERIOR
UNIVERSITAT DE LES ILLES BALEARS
!
14-Sep-12!
1. Adaptación de JMeter para la minería de datos
de estructuras de páginas web.
Alumno Director
Agustín Sabater Piñeiro Carlos Guerrero Tomé
ESCUELA POLITÉCNICA SUPERIOR
UNIVERSITAT DE LES ILLES BALEARS 14-Sep-
12
2. Motivación
Carlos Guerrero necesitaba una herramienta para crear
modelos de los fragmentos de contenidos que forman
una página web para temas de su tesis.
3. Estructura
• Introducción
• Modelo de representación de fragmentos de una
página web
• Detalles técnicos relevantes del proyecto
• Demostración
• Conclusiones
• Líneas de futuro
4. Introducción
Contexto del proyecto
Construir una herramienta que solucione, de manera efectiva, la
necesidad de Carlos Guerrero antes descrita.
Problemática que se resuelve
Herramienta capaz de generar un Grafo acíclico dirigido que
contenga información sobre los fragmentos y sus interrelaciones.
5. Introducción
Objetivos
Crear un sistema que permita observar como cambia el contenido de una
serie de páginas web.
Se pretende poder comparar tanto entre muestras temporales, como entre
muestras de diferentes direcciones.
Debe poder accederse a URLS públicas y que requieran autenticación.
Del código de toda muestra debe buscarse fragmentos que encajen con una
serie de consultas indicadas por el usuario.
El sistema debe ser ampliable con futuros desarrollos.
6. Introducción
Tareas a realizar
•Estudio de las soluciones existentes
•Desarrollo de herramienta de descarga
•Desarrollo de herramienta de análisis de los fragmentos
•Desarrollo de herramienta de relación entre fragmentos
•Desarrollo de herramienta de cálculo de similitud entre fragmentos
7. Modelo de representación de fragmentos
• La mejor manera de modelar la información es un
grafo.
• Usamos un nodo para describir los fragmentos
hallados en cada muestra, y otros nodos para
describir las relaciones entre fragmentos.
• Tanto los nodos de descripición de fragmentos, como
los de relaciones entre nodos, se guardan en ficheros
XML.
8. Modelo de representación de fragmentos
Fichero XML de fragmentos encontrados por muestra
<?xml version="1.0" encoding="UTF-8"?>
<graphml>
<graph edgedefault="directed" id="0">
<node id="-1043487486">
<data key="size">2475</data> Características
<data key="source.code“><![CDATA[<div class=" thing Fragmento
id-t3_xu3yr link promoted promotedlink " Concordante
onclick="click_thing(this)" data-fullname="t3_xu3yr" data-
ups="118" data-downs="370">
…
]]></data>
<data key="url">www.reddit.com</data>
<data key="time">20120821.18.59.02</data>
</node>
…
</graph>
</graphml>
9. Modelo de representación de fragmentos
Fichero XML de relaciones entre fragmentos (único)
<?xml version="1.0" encoding="UTF-8"?>
<graphml>
<graph edgedefault="directed" id="4" />
<key attr.name="staring.tag" attr.type="string »
for="node" id="etiqueta" />
<edge id="0" source="-1774026885" target="1894481576"
url="www.reddit.com"
when="20120820.17.59.10" /> Relaciones con
… otros fragmentos
<edge id="16" source="-1139600470" target="1894481576" y con las muestras
url="www.reddit.com"
when="20120820.17.59.10" />
<edge LevenshteinDistance="786" id="15" node1="-1774026885"
node2="847262418" /> Diferencias
…
entre fragmentos
<edge LevenshteinDistance="172" id="922" node1="-265211993"
node2="713539848" />
</graphml>
10. Detalles técnicos del proyecto
Consideraciones previas
1.Decidir si desarrollar desde cero o seleccionar una
herramienta existente y ampliable mediante plugins.
2.Decidir alguna forma para tratar el XHTML y
detectar fragmentos.
3.Decidir como identificar fragmentos similares.
11. Detalles técnicos del proyecto
Herramientas de prueba de carga analizadas
Licencia Comunidad GUI ¿Ampliable?
Common Public Escasa
License 1.0
Apache License Abundante
2.0
Apache Inexistente
Software
License
12. Detalles técnicos del proyecto
Arquitectura del programa
JMeter
•JMeter está organizado por protocolos y
funcionalidades.
•Clase principal /bin/ApacheJMeter.jar
•Clases de JMeter /lib/
•Extensiones /lib/ext/
•Incidencias de ejecución /bin/jmeter.log
13. Detalles técnicos del proyecto
Se han desarrollado dos plugins de JMeter para cumplir los
objetivos del proyecto final de carrera.
•HTML Downloader
•Query Model Analyzer
14. Detalles técnicos del proyecto
HTML Downloader
•Plugin tipo Listener
•Permite gestionar la lista de
direcciones web a analizar.
•Descarga cada muestra en una
subcarpeta
•Mantiene un registro de la
ejecución
•Puede añadir muestras
suplementarias
15. Detalles técnicos del proyecto
Query Model Analyzer
•Plugin tipo Post Processor
•Analiza las muestras descargadas por
HTML Downloader
•Generar los resultados del análisis en
ficheros XML
•Guarda un fichero de resultados en cada
subcarpeta que contenga muestras, y otro
fichero XML con las relaciones entre nodos.
•Está preparado para ser ampliado con
nuevos tipos de Querys, cálculos de
distancias, y demás.
16. Detalles técnicos del proyecto
XPaths vs Expresiones Regulares
¿Documentos mal Carga de ¿Apoyo de
formados? procesamiento comunidad?
Expresiones Intransigente (o está Costoso Cada día a
regulares contemplado o falla) menos
XPaths 2.0 Sin problemas Justo Cada día a más
17. Detalles técnicos del proyecto
Distancia de Levenshtein
La distancia de Levenshtein entre "casa" y "calle" es de 3 porque se
necesitan al menos tres ediciones elementales para cambiar uno en el
otro.
casa → cala (sustitución de 's' por 'l')
cala → calla (inserción de 'l' entre 'l' y 'a')
calla → calle (sustitución de 'a' por 'e')
18. Detalles técnicos del proyecto
• Abierto a futuros desarrollos
• Licencia utilizada Apache License 2.0
• Posibles mejoras documentadas:
1. Método de búsqueda de fragmentos (XPath 3.0 …)
2. Cambiar la distancia de Levenshtein
3. Añadir un visualizador del grafo de resultados
19. Detalles técnicos del proyecto
• Abierto a futuros desarrollos
En el repositorio de GitHub del proyecto,
[github.com/asabater/Data-mining-with-Jmeter], se encuentra todo
lo necesario para modificar el desarrollo del proyecto.
Método de modificación
• Descargar la versión 2.6 de JMeter, y los archivos del proyecto del
repositorio en GitHub.
• Desde un IDE, Eclipse por ejemplo, modificar las clases y compilar.
• Volver a arrancar JMeter para ver los cambios realizados.
20. Aplicación resultante
//div[contains(concat('
',normalize-
space(@class),' '),' link ')]
22. Conclusiones
• El SW desarrollado cumple satisfactoriamente el objetivo de
poder observar como va cambiando el contenido de una serie de
páginas web, tanto temporalmente como entre aquellas muestras
que provengan de diferentes direcciones.
• Al desarrollar para la plataforma JMeter, el objetivo de permitir
acceso a URLs y publicas está cubierto.
• El objetivo de poder buscar fragmentos dentro de las muestras
descargadas se cumple gracias al uso de las XPaths.
• Carlos Guerrero, considera que su necesidad ha quedado
cubierta con el SW desarrollado
23. Conclusiones
• Las versiones de JMeter son numerosas y cada
vez más incompatibles entre ellas.
• Es muy difícil asegurar la retrocompatiblidad
• JMeter con cada versión es más pesado
• Es muy gratificante ver como no hay imposible
con empeño y trabajo duro
24. Líneas de futuro
• Cambiar XPath 2.0 por un sistema más avanzado
(por ejemplo XPath 3.0)
• Cambiar el cálculo de la Distancia de Levenshtein
por otra medida más adecuada
• Modificar el comportamiento del plugin para que
vaya generando XMLs con resultados a medida que
descarga las muestras
• Añadir un visualizador de ficheros de resultados
25. Adaptación de JMeter para la minería de datos
de estructuras de páginas web.
Alumno Director
Agustín Sabater Piñeiro Carlos Guerrero Tomé
ESCUELA POLITÉCNICA SUPERIOR
UNIVERSITAT DE LES ILLES BALEARS 14-Sep-
12
Notas del editor
Hola, mi nombre es Agustín Sabater Piñeiro, y estoy aquí para hacer la lectura de mi proyecto final de carrera. Tiene por título, “ Adaptación de JMeter para la minería de datos de estructuras de páginas web ” . El proyecto ha sido dirigido por Carlos Guerrero Tomé.
La motivación del proyecto fue la necesidad que tiene Carlos Guerrero de obtener modelos de los fragmentos de contenidos que forman una página web para temas de su tesis. En definitiva poder extraer de una web como esta, información en un formato similar a este. Aquí podemos ver una captura de la página web REDDIT.COM con zonas remarcadas de color rojo, y a la derecha podemos ver un ejemplo del resultado que se desea obtener.
Veamos ahora la estructura que tendrá esta presentación: Primero veremos las herramientas de testing existentes. Pasaremos a comentar los aspectos más importantes del software desarrollado A continuación veremos el modelo de representación de fragmentos de una página web. Luego seguiremos con los detalles técnicos que podemos considerar más relevantes. A continuación veremos una demostración en video del software desarrollado. Como penúltimo punto tratáremos las conclusiones que se han extraído de realizar este proyecto. Y para finalizar repasaremos las posibles líneas de futuro del proyecto.
El contexto del proyecto es construir una herramienta que soluciones, de manera efectiva la necesidad de Carlos Guerrero antes descrita. Para una serie de páginas introducidas por el usuario, los módulos de JMeter implementados se encargan de buscar fragmentos del contenido de las páginas según unas reglas definidas por el propio usuario. Una vez detectados dichos fragmentos, el módulo genera el modelo del contenido de cada página, basado en fragmentos de contenido y relaciones de inclusión entre los distintos fragmentos. Este modelo se encuentra explicado en la documentación, pero es básicamente un grafo acíclico dirigido. El SW desarrollado consigue generar un GRAFO ACÍCLICO DIRIGIDO que contiene información sobre los fragmentos y sus interrelaciones.
Los objetivos con lo que iniciamos el proyecto eran los siguientes. Para empezar debíamos crear un sistema capaz de observar como cambia el contenido de una serie de páginas web. Se pretendía poder comparar tanto muestras temporales, como muestras de diferentes direcciones web. Así mismo, se quería acceder a direcciones web públicas y privadas, que requieran autenticación. Para una serie de páginas introducidas por el usuario, los módulos de JMeter implementados se tienen que encargar de buscar fragmentos del contenido de las páginas según unas reglas definidas por el propio usuario.
Las tareas necesarias para llevar a cabo el proyecto descrito, a grandes rasgos son: Estudiar las herramientas existentes en el mercado Desarrollar el módulo de descargas Desarrollar el módulo de análisis de fragmentos Desarrollar el módulo de relación entre los fragmentos Por último, desarrollar el módulo encargado de realizar el cálculo de similitud entre fragmentos.
La mejor manera para modelar la información la información referente a fragmentos de código, direcciones url, y demás parámetros,
Ahora voy a hablar de los detalles técnicos más relevantes del proyecto, a mi juicio. Lo primero que debimos considerar fue si desarrollar una herramienta desde cero, o bien usar alguna ya existente y ampliable. 2. Primeramente probamos utilizando Expresiones regulares para detectar fragmentos, pero nos dieron muchos problemas por la cantidad de páginas que no están totalmente bien formadas EJEMPLO: Etiquetas <p> sin cerrar, o etiquetas img mal formadas. <img src= “ sasdasd.png ” > 3. Para identificar fragmentos similares se decidió incluir el cálculo de la distancia de Levenshtein . Incluyendo este cálculo en el fichero XML de relaciones, reflejamos el grado de similaridad entre fragmentos.
Analizamos JCrawler, Solex, y JMeter. Decantándonos al final por este último. Por si lo preguntan JCrawler no tiene GUI, y Solex no permite el desarrollo de plugins. Jmeter es una herramienta de prueba de carga para analizar y medir el desempeño de una variedad de servicios, con énfasis en aplicaciones web. Tiene ventajas como la posibilidad de añadir plugins, es gratuita, open-source, y tiene una gran comunidad detrás del proyecto. Las expresiones regulares nos dieron bastantes dolores de cabeza a la hora de enfrentarnos con documentos mal formados (etiquetas sin cierre). Por eso optamos por cambiar y usar las Xpaths 2.0 que ofrecían juntamente con HTMLunit potencia y facilidad de uso. Para poder medir la diferencia entre dos fragmentos de código, nos decantamos por usar la Distancia de Levenshtein Uno de los requisitos del proyecto era facilitar el desarrollo de nuevas funcionalidades en el proyecto. Eso lo hemos cumplido liberando el código, usando interfaces, y documentando todo el proceso de ampliación de funcionalidad.
Ahora veremos los aspectos más relevantes de la arquitectura del programa JMeter. Para empezar hay que decir que JMETER permite varios modos de ejecución, aunque el más común es usar la interfaz gráfica, además de ser lo que yo recomiendo para la ejecución de este proyecto. JMeter, y este proyecto, están desarrollados 100% en JAVA. La estructura de ficheros es la siguiente: La clase principal se encuentra en la subcarpeta /bin de JMeter. Las clases que usa JMeter se encuentran en la subcarpeta /lib Las extensiones se ubican en /lib/ext Los plugins
Para realizar este proyecto correctamente, fue necesario desarrollar dos plugins del programa JMeter. La decisión de desarrollar dos plugins, se debe a que la comunidad de JMeter tiene esa costumbre para tener ordenados los plugins. Este consejo nos lo dieron en el portal JMeter plugins alojado en code.google.com, así como otros cientos que han hecho posible que esta lectura esté sucediendo.
El primero de los plugins desarrollados es el plugin HTML Downloader. Es un plugin de tipo Listener, muestreador, encargado de recibir los que obtiene los plugins de tipo Requesters. Permite gestionar la lista de descargas obtenidas a partir de la lista del usuario. Descarga cada muestra obtenida en una subcarpeta junto con el código XHTML Así mismo, mantiene un registro de lo sucedido durante su ejecución. Puede ser lanzado las veces que se quiera, manteniendo siempre las muestras anteriores y el registro.
El último de los módulos desarrollados, es el plugin Query Model Analyzer. Es un plugin de tipo post processor. Analiza las muestras obtenidas por HTML Downloader, buscando fragmentos que coincidan con las XPaths introducidas por el usuario. Genera los resultados en ficheros XML en las subcarpetas y en la carpeta principal. Está preparado para admitir nuevos desarrollos.
Jmeter es una herramienta de prueba de carga para analizar y medir el desempeño de una variedad de servicios, con énfasis en aplicaciones web. Tiene ventajas como la posibilidad de añadir plugins, es gratuita, open-source, y tiene una gran comunidad detrás del proyecto. Las expresiones regulares nos dieron bastantes dolores de cabeza a la hora de enfrentarnos con documentos mal formados (etiquetas sin cierre). Por eso optamos por cambiar y usar las Xpaths 2.0 que ofrecían juntamente con HTMLunit potencia y facilidad de uso. Para poder medir la diferencia entre dos fragmentos de código, nos decantamos por usar la Distancia de Levenshtein Uno de los requisitos del proyecto era facilitar el desarrollo de nuevas funcionalidades en el proyecto. Eso lo hemos cumplido liberando el código, usando interfaces, y documentando todo el proceso de ampliación de funcionalidad.
Se llama Distancia de Levenshtein, distancia de edición, o distancia entre palabras, al número mínimo de operaciones requeridas para transformar una cadena de caracteres en otra. Esté valor es muy útil para realizar comprobaciones entre nodos ligeramente diferentes. El Algoritmo no añade una gran carga de procesamiento. Abierto a nuevos desarrollos
Se llama Distancia de Levenshtein, distancia de edición, o distancia entre palabras, al número mínimo de operaciones requeridas para transformar una cadena de caracteres en otra. Esté valor es muy útil para realizar comprobaciones entre nodos ligeramente diferentes. El Algoritmo no añade una gran carga de procesamiento. Abierto a nuevos desarrollos
El desarrollo de nuevas funcionalidades, o bien la modificación de las actuales, es muy sencillo. Para empezar en el repositorio de GitHub del proyecto Minería de datos con JMeter, encontraremos toda la información y archivos necesarios. El método de modificación simplificado es el siguiente: 1. Descargar la versión 2.6 de JMeter, y todos los archivos del repositorio de GitHub. 2. Desde un IDE, eclipse recomendado, modificar aquello que se quiera modificar, y compilar. (en el GitHub del proyecto existe un manual de ayuda para esta tarea). 3. Volver a arrancar JMeter y testear los cambios.