« Zpět

Un ejemplo práctico con Web-Harvest de extracción automática de datos de la WWW usando técnicas de WebScraping

Introducción : Web-Harvest for dummies :-)

Web-Harvest es un motor de extracción automática de texto de la WWW, su nombre puede ser traducido literalmente como “cosechador de la Web”. Nos proporciona una potente infraestructura para combinar y utilizar de manera sencilla métodos de extracción ya existentes como pueden ser las expresiones XPath.

Web-Harvest ofrece un conjunto de procesadores para el manejo de datos y para el control del flujo del programa. Cada procesador puede ser considerado como una función con cero o más parámetros de entrada y un resultado de la ejecución. Los procesadores pueden combinarse sobre una tubería (pipeline) que define la cadena de ejecución. Para facilitar la manipulación y reutilización de los datos, Web-Harvest proporciona un contexto donde se almacenan variables.

A continuación se muestra un diagrama que modela una tubería de procesadores (Processor1, ...., Processor3) que trabajan sobre los datos de la WWW y sobre el sistema de ficheros (por ejemplo, para escribir los resultados) y sobre el contexto de variables (por ejemplo, para manipular un dato extraído de la WWW antes de registrarlo en el resultado).

Diagrama de la web oficial del proyecto Web-Harvest

Diagrama de la web oficial del proyecto Web-Harvest

Puedes encontrar Web-Harvest en la web oficial http://web-harvest.sourceforge.net. Nosotros vamos a utilizar en este ejemplo la versión 2.0 beta 1. No es necesario que la descargues pues la hemos añadido en el .zip de ejemplo.

Lenguaje de configuración

Cada proceso de extracción está definido en uno o más ficheros de configuración. Los ficheros de configuración siguen un vocabulario XML propio de Web-Harvest que deberemos aprender aunque su complejidad es relativamente baja e intuitiva.
Cada procesador tiene un elemento XML o una estructura de elementos XML específica que lo describen.

Ejemplo de extracción de datos de la Web con Web-Harvest y Eclipse

Vamos a hacer un pequeño ejemplo práctico. Nuestro objetivo será el siguiente:

Extraer de manera automatizada desde un programa Java de consola los títulos de las secciones de la web ematiz.com.

En la imagen se ilustra nuestro objetivo. Puedes ver una captura de pantalla de la web ematiz.com y en ella se han resaltado en amarillo los títulos que deseamos extraer (“¿Qué ofrecemos?”, “¿Por qué somos diferentes?”, “¿Para quién?”, “¿Por qué trabajar con nosotros?”).

Objetivo

Para conseguirlo vamos a usar Web-Harvest y un proyecto Java Eclipse.

El primer paso consiste en diseñar nuestro proceso de extracción. Para ello necesitamos estudiar la fuente original de datos y ver en qué formato se encuentran. Si vitamos la web http://www.ematiz.com y vemos su código fuente, encontraremos que los títulos de las secciones están especificados como encabezados de primer nivel de HTML (esto es, el elemento <h1>). También podemos observar que todo el texto central está dentro de una capa o contenedor (elemento <div>) cuyo identificador único es “portada”.

A continuación os muestro un extracto del código HTML que estoy describiendo...

<div class="post" id="portada">
<h1>¿Qué ofrecemos?</h1>
<p><strong style="color: black;">Servicios avanzados de Ingeniería de Software</strong>. 
<strong style="font-size:1.1em">¿Y eso qué es?</strong> Resolución de problemas de proyectos de Software, 
Formación a equipos de ingenieros, liderazgo de proyectos y preparación y ejecución de proyectos de
I+D+i. 
Ofrecemos un gran capital humano y un importante <em>know-how</em>. </p>
<h1>¿Por qué somos diferentes?</h1>
<p> <strong style="color: black; text-decoration:none">Somos auténticos expertos y 
apasionados del Software</strong>. <br/> 
Trabajamos muy motivados y con un compromiso claro con los resultados.<br />
Te apoyamos cuando los demás se retiran. Cuando se presentan los grandes problemas en los proyectos software, 
ahí estamos nosotros para 
ayudar a solucionarlos. </p>
<h1>¿Para quién?</h1>
<p> Para empresas u organismos que desarrollan Software o para empresas que quieran innovar en tecnología. <br/> 
Nuestros clientes naturales son las grandes consultoras de tecnología, utilities y las administraciones públicas. </p>
<h1>¿Por qué trabajar con nosotros?</h1>
<p>Disfruta de verdaderos expertos en Java EE y en la Web y perfiles difíciles de 
conseguir en el mercado sin tener que aumentar tu estructura de costes fijos, sin complejos 
procesos de selección y sin tener que preocuparte por su formación posterior ni por 
mantenerlo motivado en la plantilla. <strong style="font-size:1.2em">Ten al experto que necesitas 
cuando y donde quieras</strong>. Y si lo requieres, trabajamos directamente con tus clientes como 
<strong style="color: black">marca blanca</strong>. </p>
</div>

Por tanto el proceso de extracción pormenorizado podríamos describirlo tal como sigue....

  1. Solicitar la web http://www.ematiz.com.
  2. Obtener su código fuente de una manera que sea simple de procesar.
  3. Localizar la capa portada.
  4. Seleccionar los elementos h1 que están anidados dentro de esta capa y extraer su texto.

 

Diseñando el proceso de extracción con un fichero XML de Web-Harvest

Vamos a intentar traducir el diseño a una implementación de Web-Harvest. El fichero de configuración (procesoExtraccion.xml) es el siguiente:

<config charset="UTF-8">
      <var-def name="titulosCuerpoPortada">
        <xpath expression="//div[@id='portada']//h1/text()">
            <html-to-xml>
                <http url="http://www.ematiz.com/"/>
            </html-to-xml>
        </xpath>
    </var-def>
</config>

 

Este fichero sigue el lenguaje de configuración propio de Web-Harvest al que antes hacíamos referencia. Define el proceso de extracción que habíamos descrito, vamos a estudiarlo en detalle.

  • La línea 5. contiene el elemento http que sirve para solicitar una URL. Web-Harvest enviará una petición HTTP y obtendrá como resultado la respuesta HTTP (la página HTML).
  • Las líneas 4 y 6 definen el elemento html-to-xml. Nótese que el resultado de hacer la petición HTTP está anidado dentro de este nuevo elemento. ¿Para qué sirve esto? Pues fácil, le estamos solicitando a Web-Harvest que pase el código HTML a un formato XML estricto, esto es, si el programador de la web había cometido incorrecciones (como no incorporar la etiqueta de cierre de un elemento HTML) serán corregidas y el documento se interpretará como un documento XML válido.
  • En la línea 3 se define el elemento xpath. Este elemento nos sirve para realizar búsquedas de elementos dentro de un documento XML. En nuestro caso lo que queríamos era “Localizar la capa portada y seleccionar los elementos h1 que están anidados dentro de esta capa y extraer su texto.”. Jústamente esto es lo que le estamos pidiendo a Web-Harvest que haga a través de la expresión XPath “//div[@id='portada']//h1/text()” . Esta expresión puede traducirse como “selecciona todas las capas que estén en cualquier lugar del documento XML, quédate con aquella que tenga el identificador ‘portada’, obtén todos los hijos de cualquier nivel (por eso aparece la doble barra) que sean encabezados de primer nivel y por último extrae el texto. Si no sabes XPath puedes ver muchos ejemplos interesantes en XPath Examples (http://www.w3schools.com/XPath/xpath_examples.asp) y puedes aprender a construir estas expresiones (que son estándares de la W3C) en W3CShools (http://www.w3schools.com/XPath/).
  • La línea 2 define una variable. El nombre de la variable es “titulosCuerpoPortada” y su valor será el resultado del elemento anidado, es decir, los títulos.
  • La línea 1 define el elemento raíz ‘config’. Todos los ficheros de definición de procesos de extracción de Web-Harvest tendrán este elemento como raíz.

Creando un programa principal que invoque el proceso de extracción en Web-Harvest

Ya tenemos diseñado nuestro proceso de extracción en el documento XML. Ahora necesitamos crear un pequeño programa Java. Podemos hacerlo con cualquier IDE, nosotros hemos utilizado Eclipse Helios y hemos creado un nuevo “Java Project”.
Posteriormente creamos una clave Java y le añadimos un método main en el que vamos a crear un objeto que lea la configuración del proceso de extracción. Este objeto será de la clase org.webharvest.definition.ScraperConfiguration (http://web-harvest.sourceforge.net/doc/org/webharvest/definition/Scraper...) . Una vez cargada la configuración de extracción, procederemos a crear un objeto extractor. Este objeto será de la clase org.webharvest.runtime.Scraper.

// 1. Cargamos la configuracion
ScraperConfiguration config = new ScraperConfiguration(
"procesoExtraccion.xml");

// 2. Creamos el objeto extractor
Scraper scraper = new Scraper(config, "/webscraping");

 

La clase Scraper posee un metodo execute que pone en marcha el proceso de extracción.

// 3. Ponemos en marcha el proceso de extracción
scraper.execute();

Una vez ejecutada esta sentencia, tendremos disponibles los resultados...

// 4. Obtenemos la variable titulosCuerpoPortada del contexto de variables
// de Web-Harvest. En dicha variable deberiamos encontrar los titulos de la web
// que hemos procesado. Mira en el procesoExtraccion.xml si no lo entiendes
// y veras que en dicha definicion solicitamos a Web-Harvest que cree esta
// variable
Variable titulosCuerpoPortada = (Variable) scraper.getContext().get("titulosCuerpoPortada");

Por último sólo nos resta imprimir los resultados

// 6. Imprimimos en consola
System.out.println("=== Encabezados h1 de la web ematiz.com ====");
System.out.println(titulosCuerpoPortada);

 

El resultado esperado es ...

=== Encabezados h1 de la web ematiz.com ====
¿Qué ofrecemos?
¿Por qué somos diferentes?
¿Para quién?
¿Por qué trabajar con nosotros?

Como habéis visto en este sencillo ejemplo, Web-Harvest nos permite obtener información de la WWW de manera automática. Esto abre grandes posibilidades a la reestructuración de datos que han sido publicados en la WWW como datos no estructurados con el formato HTML. ¡Podemos usar la WWW como una gran base de datos!. Por ejemplo, podremos volver a estructurar en entidades los datos económicos que un Ayuntamiento haya publicado en una tabla HTML para después poder hacer búsquedas, filtrados, estadísticas, etc. Nosotros ya lo estamos utilizando en proyectos de I+D+i. ¡Esperamos vuestros comentarios!

Descarga del ejemplo (Download)

Puedes descargar el ejemplo completo en un proyecto de Eclipse (lo hemos creado con Eclipse Helios) en la siguiente URL : http://www.tekuento.net/downloads/EjemploWebHarvest.zip

El proyecto incluye las librerías de Web-Harvest aunque deberás reconfigurar las rutas en el proyecto de Eclipse. Para más información, lee el README.txt.

Komentáře
Trackback URL:

comments powered by Disqus