ThiagoAdelino.com

+ idéias

Tag: jsoup

Enviando seus Tweets por e-mail

Antes de mais nada, este post é dividido em duas partes. Até chegar na versão final da aplicação, passei por algumas alternativas interessantes e achei melhor mostrar como foi esse processo, ao invés de apenas mostrar como ficou a aplicação final.

Estimulado para desenvolver algum projeto que fosse diferente de um HelloWorld e que tivesse um uso, mesmo que de inutilidade, comecei a pensar em algumas possibilidades.

Em redes que acesso, e também no meu trabalho, não tenho acesso ao Twitter, uma das minhas redes sociais preferidas. Conheço pessoas que usam configurações de Proxy para acessar o conteúdo que normalmente seria bloqueado pela política da rede acessada, mas decidi seguir por outro caminho.

O acesso a e-mail é disseminado e liberado em todos os ambientes, seja trabalho, universidade ou colégio, e acessível a todas as pessoas. Pensando nisso decidi desenvolver uma aplicação que rodasse em uma rede com acesso ao Twitter, onde essa aplicação iria ler uma caixa de e-mails, iria ler o campo assunto de cada e-mail(que deveria possuir o perfil a ser acessado), listaria os Twetts e os retornariam na caixa de e-mail que solicitou.

A forma mais fácil de fazer isso seria usando a API do Twitter, que possui um conjunto de webservices definidos para utilização em aplicações de terceiros. Apesar dessa facilidade, decidi realizar uma primeira versão da aplicação lendo os dados diretamente da página HTML.

Iniciei a consulta aos dados da página HTML usando a biblioteca do Jsoup, onde realizava o acesso à página do perfil do twitter (Ex.: http://twitter.com/naosalvo) e a partir dela verificava quais tags compunham os posts dos tweets.

Usei a expressão abaixo para retornar os dados:

O que o Jsoup vai fazer é retornar o texto puro dentro das tags que forem retornadas usando as expressões passadas como parâmetro. Nesse contexto, consegui converter em objeto o texto do tweet e retornar as imagens visíveis em cada um deles. Mas ainda faltavam os vídeos e os Gifs (melhor parte aliás). Abaixo segue o mesmo Tweet, retornado por e-mail e logo em seguida o existente no site do Twitter.

Tweet enviado por e-mail

As imagens e o texto eram simples de serem retornados, porém os vídeos e gifs animados tinham um problema. A página do Twitter exibe os gifs animados como vídeos em formato MP4 (até aí tudo bem), mas eles só são carregados na página, assim como os vídeos, conforme o usuário vai usando o scrolldown, para economizar recursos de requisição à conteúdo e melhorar usabilidade.

A página possuía um javascript que é executado sempre que o trecho da página ficava em evidência, tornando o Jsoup inviável, pelo menos parcialmente, na construção da aplicação que iria fazer o harvesting destas informações. Pesquisa pra lá, pesquisa pra cá, voltei a uma alternativa um pouco grosseira, mas que na maioria dos casos funcionou. Usar o Selenium para realizar scrolldown na página do Twitter e capturar os videos e animações desejadas.

O selenium é uma biblioteca utilizada, entre outras coisas, para automatização de testes funcionais. A grosso modo o selenium Webdriver permite através de diretivas de código, a instanciação de sessões do navegador web, execução de operações na página como preencher campos e clicar em botões e além disso permitia ao desenvolvedor acessar os dados e metadados associados a essa operação. No meu caso eu desejava acessar as tags HTML com os dados dos vídeos preenchidos.

Colocando um pouco mais a mão na massa, adicionei as dependências do selenium no meu projeto usando o maven:

Em seguida, realizei a chamada para instânciar, executar as operações na página e em seguida passar o HTML final de volta para o Jsoup processar. É importante notar que o WebDriver está atuando como um usuário que abre uma janela do navegador, adiciona o endereço e realiza o scroll na página. A partir desse momento o Jsoup começa a agir coletando os vídeos existentes em cada Tweet.

Perceba também que ao final do processo, o WebDriver é chamado novamente com a operação ‘close()‘ que fecha a instância aberta do Browser.

Nesse momento eu tinha um leitor de Tweets analisando qualquer perfil desejado, que apesar do esforço, ainda não funcionava em sua totalidade para retornar os gifs e vídeos. Apesar da tentativa, eu deveria buscar uma luz na API do Twitter.

No próximo post irei compartilhar o projeto e explicar como funcionam o gerenciamento de e-mails (envio e recebimento) e as diretivas de acesso a API do Twitter, o que é preciso e como realizar o acesso usando o Java.
Até lá!

Share Button

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

Desenvolvido em WordPress & Tema por Anders Norén