ThiagoAdelino.com

+ idéias

Mês: maio 2016

Extraindo dados de html com Jsoup

Recentemente fora do meu trabalho, recebi algumas ofertas para atuar como freelancer. Basicamente o que o cliente queria era extrair algumas informações de páginas web e gerar alguns relatórios com isso. Nada muito complexo, mas para uma pessoa realizar o trabalho manual de abrir link por link e ler cada uma das informações para gerar o relatório, a automatização desse processo permitiria ao cliente se dedicar a realizar outras operações que agregassem mais valor ao seu trabalho.

Eu já havia tentado trabalhar com manipulação e extração de informações presentes em arquivos xml e html antes, mas nunca gostei das diretivas que o Java permitia na linguagem para conseguir retornar esses dados. A sintaxe para retornar esses dados e a quantidade de verificações, além da própria variação da página html que é lida, pode comprometer a leitura dos dados. Entre uma pesquisa e outra, e sugestões do colega de trabalho Carlos Alberto, eu acabei adotando o jsoup como biblioteca para manipular esses dados.

O diagrama abaixo mostra o fluxo que a minha extração de dados iria realizar. Em um primeiro passo o programa iria ler o html a partir do link, a partir daí eu realizaria a triagem de quais dados eu deveria retornar, e por fim adicionaria isso em um objeto.

diagramafluxo

O jsoup é uma biblioteca java que facilita o trabalho de extração e manipulação de dados usando métodos que se baseiam em DOM, CSS e ‘jquery-like’. Com o jsoup fica bem mais fácil de limpar o html com trechos que não são interessantes, como alguns cabeçalhos html, que no fim das contas acabam só atrapalhando a extração das informações. O jsoup é livre e está disponível no GitHUB.

Para começar a trabalhar com o jsoup no projeto java realizei os seguintes passos:

  • Fiz o download do jar do jsoup, onde existem opções de realizar a inserção manual dos jars no projeto ou adicionar isso no pom.xml, para os que utilizam o maven.
  • Utilizei o Try Jsoup, que é uma espécie de sandbox para o jsoup, permitindo que você consiga extrair com base em tags html ou css, as informações em tempo de execução antes de implementar o extrator usando minha aplicação em Java.

O jsoup possui simplicidade na sua utilização. Por exemplo, no trecho de código abaixo realizo a chamada a url, retornando o html que irei manipular e na sequência acesso o método select para retornar as tags que possuem a propriedade passada como parâmetro. Nesse caso, retorna os valores existentes nas tags <b>.

 

É interessante perceber que ao acessar o método text, é retornado o valor em texto puro para o select realizado, sem delimitações por tags ou lixo proveniente do html extraído.

A partir daí realizei a extração dos dados do cliente sem maiores problemas, não era algo complexo, mas era bem extenso mapear campo a campo no html. Contudo, utilizando Try Jsoup como sandbox foi bem mais fácil pra conseguir concluir.

No GitHUB deixei um projeto de exemplo (jsoup-example) com a biblioteca importada e uma chamada básica para extrair os dados do html. Até a próxima.

Share Button

Kettle – Pentaho Data Integration

logo-pentaho-n

Interessante como fiquei maravilhado no processo de descoberta do funcionamento da ferramenta Kettle (também chamado de Data Integration), da suíte do Pentaho. O Kettle é uma ferramenta de ETL, e para tal, existem diferentes soluções no mercado, tanto pagas quanto gratuitas ou livres.

ETL é um termo inglês que significa Extract Transform Load, ou seja, Extração Transformação e Carga, indicando que são ferramentas que tem como função extrair dados de bases diferentes, sistemas diferentes, realizar transformações afim de adequa-los a determinadas regras e por fim gerar um Data Mart ou Data Warehouse. Porém nada impede que o ETL seja realizado com outros fins.

No meu ambiente de trabalho, o Kettle já era utilizado por alguns colaboradores, sendo esse um dos motivos de eu ter iniciado meu trabalho/aprendizado com essa ferramenta ao invés de outras. Afinal entre uma caneca de café e outra, dava pra aprender alguns truques e macetes com os colegas que já haviam desbravado esse campo.

O Kettle tem uma interface bem simples, com os elementos drag-n-drop, fáceis de movimentar, configurar e organizar.

tela kettle

O Kettle pode ser utilizado tanto para fins mais robustos e que necessitam de acesso a grandes bases de dados, como pode também ser utilizado para extrair alguns dados simples e exportar em uma planilha do excel, o que define é a necessidade do caso. Porém em todos eles o kettle tem steps que facilitam, tanto a extração, quanto a manipulação dos mesmos.

Alguns dos problemas que tive durante a utilização da ferramenta se referem a impossibilidades operacionais em alguns casos. Arquivos muito grandes, estouro de memória e alguns gargalos durante a execução podem tirar qualquer um do sério.

Mas existem formas de configurar cada step da transformação para utilizar de forma inteligente os recursos da máquina. Temos então a possibilidade de segmentação dos arquivos a serem lidos em disco, permitindo a leitura por porção, é possível utilizar pipeline nos steps para habilitar a sua execução de forma simultânea em diferentes instâncias, mas no mesmo fluxo de dados e também a possibilidade de commit nas operações de inserção e atualização dos dados na base por lote, liberando assim memória alocada para os streams a cada commit.

ETL é um processo segmentado e assim como o desenvolvimento de software, é algo que é construído para um fim geral ou específico. E para tanto é necessário bastante análise crítica para a implementação das soluções.
O termo utilizado para definir um processo ETL com início, meio e fim  no Kettle é chamado de Transformação. Nessa transformação estão os steps de Input (ler arquivos de texto, acessar tabelas em bases de dados, acessar webservices e por aí vai), de Output (exportar em arquivo de texto, planilha, inserir ou atualizar em base de dados) e uma infinidade de possibilidades na parte intermediária, ou seja, transformar os dados.

Share Button

Desenvolvido em WordPress & Tema por Anders Norén