Guia de aula laboratorial

O guia da 4º aula prática está disponível online. Os tópicos abordados incluem conceitos relacionados com a extracção de dados a partir da Web através da construção de wrappers.

O ficheiro extraccao-web.zip ( http://web.tagus.ist.utl.pt/~bruno.martins/materials/class-materials/labs-gti/extraccao-web/extraccao-web.zip ) inclui vários exemplos para os conceitos abordados nas aulas de laboratório referentes a extracção de informação.

Extracção de dados da Web

A ideia por detrás de um processo de extracção de dados da Web consiste em usar conteúdos não estruturados, disponíveis sob a forma de páginas HTML, por forma a construir grandes repositórios de informação. Isto pode ser feito com base na conversão dos dados disponíveis Web em registos estruturados, através de wrappers. Este processo é muitas vezes denominado por Web Scraping or Web Data Mining.

Os dados na Web encontram-se normalmente misturados com instruções de formatação. De facto, as páginas HTML são desenhadas para ser interpretadas por humanos e não por por processos automáticos de tratamento de informação. No entanto, uma vez que cada página Web está construída de acordo com alguma lógica subjacente, é possível descrever um processo de extracção de dados que permita recuperar a informação, separando-a das instruções de formatação.

Nesta aula prática iremos usar a ferramenta Web-Harvest ( http://web-harvest.sourceforge.net/ ) por forma a construir aplicações simples para extracção de dados a partir de sites Web. No site da ferramenta podemos encontrar a seguinte descrição:

Web-Harvest is Open Source Web Data Extraction tool written in Java. It offers a way to collect desired Web pages and extract useful data from them. In order to do that, it leverages well established techniques and technologies for text/xml manipulation such as XSLT , XQuery and Regular Expressions . Web-Harvest mainly focuses on HTML/XML based web sites which still make vast majority of the Web content. On the other hand, it could be easily supplemented by custom Java libraries in order to augment its extraction capabilities.

Na ferramenta Web-Harvest, cada processo de extracção é definido por um ficheiro de configuração XML. Este ficheiro descreve uma sequência de processos de extracção, os quais executam tarefas específicas por forma a se obter um dado objectivo. Estes processos são executados como um pipeline. A saída de um processo é usada como entrada do processo seguinte (i.e. um processo faz a extracção dos links de uma dada página web, enquanto que o processo seguinte descarrega conteúdos a partir desses URLs). Por exemplo, quando o Web-Harvest executa o seguinte fragmento de um ficheiro de configuração:


<xpath expression="//a[@shape='rect']/@href">
<html-to-xml>
<http url="http://www.somesite.com/"/>
</html-to-xml>
</xpath>

os seguintes passos ocorrem:

  1. Um processador http descarrega o conteúdo do URL especificado.
  2. Um processador html-to-xml limpa o HTML de possíveis erros, produzindo conteúdo XHTML.
  3. Um processador xpath pesquisa o conteúdo XHTML por forma a encontrar links específicos, gerando uma sequência de URLs como saída.

A ferramenta Web-Harvest suporta um conjunto de processadores úteis a várias operações de manipulação e processamento de conteúdos HTML e XML. Entre os elementos que podem ser usados no ficheiro XML de configuração incluem-se os seguintes:


  • text - força uma representação textual do conteúdo.
  • file - input/output de ficheiros.
  • http - envio pedidos HTTP e download dos conteúdos.
  • html-to-xml - limpeza de conteúdos HTML e conversão para XHTML.
  • regexp - pesquisas e substituições com base em expressões regulares.
  • xpath - pesquisas sobre conteúdos XML com base em XPath.
  • xquery - pesquisas sobre conteúdos XML com base em XQuery.
  • xslt - transformações XSLT sobre conteúdos XML.
  • script - aplicação de scripts simples "Java" com lógica específica.

Informação detalhada sobre cada um destes elementos pode ser consultada no manual da ferramenta Web-harvest ( http://web-harvest.sourceforge.net/manual.php ). A ferramenta pode ainda ser usada tanto de uma linha de comandos, como embebida numa aplicação Java mais complexa. A sintaxe simples para a utilização na linha de comandos é a seguint e:

java -jar web-harvest.jar config=ficheiro-configuração.xml workdir=directoria-trabalho

De seguida apresenta-se um exemplo simples de um ficheiro de configuração para o Web-Harvest, o qual permite descarregar imagens do serviço Google Images para uma directoria local, com base numa dada keyword de pesquisa.

<?xml version="1.0" encoding="UTF-8"?>
<config charset="UTF-8">
<!--
Download multi-page list of items.

@param pageUrl - URL of starting page
@param itemXPath - XPath expression to obtain single item in the list
@param nextXPath - XPath expression to URL for the next page
@param maxloops - maximum number of pages downloaded

@return list of all downloaded items
-->
<function name="download-multipage-list">
<return>
<while condition="${pageUrl.toString().length() != 0}" maxloops="${maxloops}" index="i">
<empty>
<var-def name="content">
<html-to-xml>
<http url="${pageUrl}"/>
</html-to-xml>
</var-def>

<var-def name="nextLinkUrl">
<xpath expression="${nextXPath}">
<var name="content"/>
</xpath>
</var-def>

<var-def name="pageUrl">
<template>${sys.fullUrl(pageUrl, nextLinkUrl)}</template>
</var-def>
</empty>
<xpath expression="${itemXPath}">
<var name="content"/>
</xpath>
</while>
</return>
</function>

<!-- defines search keyword and start URL -->
<var-def name="search">platon</var-def>

<var-def name="url">
<template>
http://images.google.com/images?hl=en&amp;q=${search}&amp;btnG=Search+Images&amp;gbv=1
</template>
</var-def>

<!-- collects all image URLs -->
<var-def name="imgLinks">
<call name="download-multipage-list">
<call-param name="pageUrl"><var name="url"/></call-param>
<call-param name="nextXPath">//td[.='Next']/a/@href</call-param>
<call-param name="itemXPath">//img[contains(@src, 'images?q=tbn')]/@src</call-param>
<call-param name="maxloops">5</call-param>
</call>
</var-def>

<!-- download images and saves them to the files -->
<loop item="link" index="i" filter="unique">
<list>
<var name="imgLinks"/>
</list>
<body>
<file action="write" type="binary" path="google_images/${search}_${i}.gif">
<http url="${sys.fullUrl(url, link)}"/>
</file>
</body>
</loop>
</config>

O ficheiro de configuração define uma função download-multipage-list, a qual permite coleccionar todos os URLs dados como resultado a uma pesquisa no Google Images (no exemplo, um máximo de 5 URLs é extraído de cada página de resultados). Um processador loop encarrega-se depois de iterar sobre o conjunto de URLs extraídos, fazendo o download das imagens correspondentes. O resultado da extracção é uma colecção de 100 imagens guardadas localmente no disco.

É de referir que uma ferramenta como o Web-Harvest, a qual se baseia na especificação de regras para a extracção da informação, tem problemas óbvios ao lidar com mudanças de formato nas páginas Web. Sempre que o código HTML muda, torna-se necessário ajustar o ficheiro de configuração do Web-Harvest. A utilização de mecanismos de aprendizagem automática em tarefas de extracção de dados é actualmente um tópico quente de investigação. Em http://www.wifo.uni-mannheim.de/~kuhlins/wrappertools/ encontra uma lista de ferramentas de extracção de informação a partir da Web.

Ferramentas de programação "visual" para o desenvolvimento de processos de extracção de informação a partir da Web também têm vindo a conhecer desenvolvimentos consideráveis. Uma ferramenta interessante é o Yahoo! Pipes ( http://pipes.yahoo.com ), a qual permite a composição visual de cadeias de processamento para a agregação, manipulação e combinação de conteúdos Web.

Links: