Manipulando páginas da web com o HtmlUnit (Java)
Autor: Gutierrez PS | Publicado: 2013-08-13T22:46:00-03:00


Dia desses me perguntaram se eu sabia como fazer um programa para enviar vários arquivos para uma página da web processar, receber o resultado do processamento e salvar de volta no computador, isso para cada arquivo. Daí, como não conhecia algo que fizesse isso, resolvi procurar algo para a linguagem Java, já que achei que era mais fácil trabalhar com a filosofia de orientação a objeto. E acabei encontrando o HtmlUnit.



O HtmlUnit é um navegador sem interface para programas em Java. Ele modela documentos HTML e provê uma API que permite carregar páginas, preencher formulários, clicar em links, etc.


Ou seja, o que eu estava procurando. Eu, particularmente, achei bem fácil de aprender e de manipular. Basicamente, ele transforma cada elemento da página em um objeto (desde que esteja delimitado por tags), e daí você pode verificar qual o conteúdo (um parágrafo, por exemplo), atribuir valores (formulários), e clicar em link, que levam a outras páginas.

Instalação

Antes de começar a programar, o primeiro passo é baixar e instalar a biblioteca na sua IDE. Neste tutorial, estou usando o NetBeans 7.3.1.

Baixe a versão compilada mais nova (htmlunit-x.xx-bin.zip), e descompacte-a
No NetBeans, vá em Ferramentas &gt; Bibliotecas Ant &gt; "Nova Biblioteca...", coloque o nome (HtmlUnit) e dê OK
Depois de criar, na mesma janela, selecione-a na lista à esquerda (se não estiver selecionada), clique em Adicionar JAR/Pasta, e selecione todos os arquivos da pasta lib do arquivo descompactado


Feito isto, a biblioteca deve estar instalada. Para utilizá-la no seu projeto, vá nas propriedades &gt; Bibliotecas &gt; Adicionar Biblioteca e adicione a HtmlUnit.

Guia rápido
Para começar, você deve criar um objeto que será seu navegador.

final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_17);


O parâmetro para o construtor é o user agent, ou seja, como a sua aplicação será reconhecida pelo servidor web. Se você não especificar nenhum, ele usará o padrão, que é o Internet Explorer 8.

Com o seu webClient, você pode carregar páginas:

final HtmlPage page = webClient.getPage("http://htmlunit.sourceforge.net");


E a partir daí você pode fazer o que você quer. Por exemplo, se você quer saber o conteúdo de uma div cuja id é box1, basta fazer

HtmlDivision div = page.getHtmlElementById("box1");
System.out.println(div.asText());


Se você quer um formulário, basta saber o nome dele (atributo name), pegar os campos, alterar o conteúdo e enviar:

HtmlForm form = page.getFormByName("login-form");
HtmlSubmitInput button = form.getInputByValue("Submit");
form.getInputByName("username").setValueAttribute("admin");
form.getInputByName("password").setValueAttribute("1234");
HtmlPage page2 = button.click();


A página devolvida depois que o formulário for enviado será, então, armazenada em page2.


Quando fizer tudo que você quer, lembre-se de fechar todas as "janelas" :P

webClient.closeAllWindows();


Isso é o mínimo que este framework faz. O próprio site tem uns tutoriais bem legais, que dão uma boa base.

Fica a dica ;)


Links
Página principal: http://htmlunit.sourceforge.net/
Tutoriais: http://htmlunit.sourceforge.net/gettingStarted.html
Documentação: http://htmlunit.sourceforge.net/apidocs/index.html