Voltar ao blogue
Guias
Raluca PenciucLast updated on Apr 22, 20269 min read

O Guia Completo para Web Scraping com Java

O Guia Completo para Web Scraping com Java

Ao contrário da mentalidade do século XX de que «tempo é dinheiro», hoje em dia tudo gira em torno dos dados. Especialmente na última década, os web scrapers tornaram-se extremamente populares. Não é difícil perceber porquê: a Internet está repleta de informações valiosas que podem fazer ou quebrar empresas.

À medida que as empresas se apercebem dos benefícios da extração de dados, cada vez mais pessoas estão a aprender a criar o seu próprio scraper. Além de ter o potencial de impulsionar os negócios, pode também ser um projeto interessante para os programadores aperfeiçoarem as suas competências de programação.

Se faz parte da equipa Java, mas o seu trabalho não tem nada a ver com web scraping, irá conhecer um novo nicho onde pode colocar as suas competências em prática. O artigo irá fornecer um tutorial passo a passo sobre como criar um web scraper simples usando Java para extrair dados de sites e, em seguida, guardá-los localmente em formato CSV.

Compreender o web scraping

A que se refere o web scraping? Muitos sites não disponibilizam os seus dados através de APIs públicas, pelo que os web scrapers extraem dados diretamente do navegador. É muito semelhante a uma pessoa a copiar texto manualmente, mas é feito num piscar de olhos.

Quando se considera que uma melhor inteligência empresarial significa melhores decisões, este processo é mais valioso do que parece à primeira vista. Os sites estão a produzir cada vez mais conteúdo, pelo que já não é aconselhável realizar esta operação inteiramente à mão.

Pode estar a perguntar-se: «O que vou fazer com estes dados?». Bem, vamos ver alguns dos casos de utilização em que o web scraping pode ser realmente útil:

  • Geração de leads: um negócio em atividade requer a geração de leads para encontrar clientes.
  • Inteligência de preços: a decisão de uma empresa de definir preços e comercializar os seus produtos será informada pelos preços dos concorrentes.
  • Aprendizagem automática: para que as soluções baseadas em IA funcionem corretamente, os programadores precisam de fornecer dados de treino.

Descrições detalhadas e casos de utilização adicionais estão disponíveis neste artigo bem escrito que aborda o valor do web scraping.

Apesar de compreender como funciona o web scraping e como pode aumentar a eficácia do seu negócio, criar um scraper não é assim tão simples. Os sites têm muitas formas de identificar e impedir que os bots acedam aos seus dados.

Eis alguns exemplos:

  • Testes de Turing Públicos Completamente Automatizados (CAPTCHAs): estes problemas lógicos são razoavelmente fáceis de resolver para as pessoas, mas um grande obstáculo para os scrapers.
  • Bloqueio de IP: se um site determinar que várias solicitações estão a vir do mesmo endereço IP, pode bloquear o acesso a esse site ou tornar a sua navegação muito lenta.
  • Honeypots: links invisíveis que são visíveis para os bots, mas invisíveis para os humanos; assim que os bots caem na armadilha, o site bloqueia o seu endereço IP.
  • Bloqueio geográfico: o site pode bloquear geograficamente determinados conteúdos. Por exemplo, pode receber informações específicas da sua região quando solicita dados de outra área (por exemplo, preços de bilhetes de avião).

Lidar com todos estes obstáculos não é tarefa fácil. Na verdade, embora não seja muito difícil criar um bot razoável, é extremamente difícil criar um excelente web scraper. Assim, as APIs para web scraping tornaram-se um dos temas mais quentes da última década.

A WebScrapingAPI recolhe o conteúdo HTML de qualquer site e resolve automaticamente os problemas que mencionei anteriormente. Além disso, utilizamos a Amazon Web Services, o que garante velocidade e escalabilidade. Parece algo que lhe possa interessar? Comece a sua avaliação gratuita da WebScrapingAPI e poderá efetuar 5000 chamadas de API durante os primeiros 14 dias.

Compreender a Web

Para compreender a Web, é necessário compreender o Protocolo de Transferência de Hipertexto (HTTP), que explica como um servidor comunica com um cliente. Uma mensagem contém várias informações que descrevem o cliente e a forma como este lida com os dados: método, versão HTTP e cabeçalhos.

Os web scrapers utilizam o método GET para pedidos HTTP, o que significa que recuperam dados do servidor. Algumas opções avançadas incluem também os métodos POST e PUT. Para mais detalhes, pode consultar aqui uma lista detalhada dos métodos HTTP.

Vários detalhes adicionais sobre pedidos e respostas podem ser encontrados nos cabeçalhos HTTP. Pode consultar a lista completa dos mesmos, mas os relevantes para o web scraping são:

  • User-Agent: indica a aplicação, o sistema operativo, o software e a versão; os web scrapers dependem deste cabeçalho para fazer com que as suas solicitações pareçam mais realistas.
  • Host: o nome de domínio do servidor ao qual acedeu.
  • Referrer: contém o site de origem que o utilizador visitou; consequentemente, o conteúdo apresentado pode diferir, pelo que este facto também deve ser tido em conta.
  • Cookie: mantém informações confidenciais sobre uma solicitação e o servidor (como tokens de autenticação).
  • Accept: garante que a resposta do servidor seja de um tipo específico (ex.: text/plain, application/json, etc.).

Compreender o Java

Java, uma linguagem de código aberto e orientada a objetos, o que a torna uma das linguagens de programação mais populares. Já se passaram quase duas décadas desde que conhecemos o Java, e a linguagem de programação tornou-se cada vez mais acessível.

Muitas das alterações no Java tiveram como objetivo diminuir as dependências de implementação do código. Por isso, muitos programadores preferem esta linguagem, mas ela também tem outras vantagens:

  • É de código aberto;
  • Oferece uma variedade de APIs;
  • É multiplataforma, proporcionando maior versatilidade;
  • Possui documentação detalhada e um apoio comunitário fiável.

Criar o seu próprio web scraper

Agora podemos começar a falar sobre a extração de dados. Em primeiro lugar, precisamos de um site que forneça informações valiosas. Para este tutorial, optámos por extrair dados desta página web que partilha receitas italianas.

Passo 1: Configurar o ambiente

Para criar o nosso web scraper em Java, precisamos primeiro de nos certificar de que temos todos os pré-requisitos:

  • Java 8: embora o Java 11 seja a versão mais recente com Suporte de Longo Prazo (LTS), o Java 8 continua a ser o padrão de produção preferido entre os programadores.
  • Gradle: é uma ferramenta flexível de automação de compilação de código aberto com uma vasta gama de funcionalidades, incluindo gestão de dependências (requer Java 8 ou superior);
  • Um IDE Java: neste guia, utilizaremos o IntelliJ IDEA, uma vez que torna a integração com o Gradle bastante simples.
  • HtmlUnit: pode simular eventos do navegador, como clicar e enviar formulários durante a extração de dados, e tem suporte a JavaScript.

Após a instalação, devemos verificar se seguimos corretamente os guias oficiais. Abra um terminal e execute os seguintes comandos:

> java -version
> gradle -v

Estes devem mostrar-lhe as versões do Java e do Gradle que estão instaladas na sua máquina:

Se não aparecer nenhum erro, estamos prontos para começar.

Agora vamos criar um projeto para podermos começar a escrever o código. Felizmente para nós, a JetBrains oferece um tutorial bem escrito sobre como começar a usar o IntelliJ e o Gradle, para que não nos percamos nas configurações.

Certifique-se de que, depois de criar o projeto, deixa o IDE concluir a primeira compilação, pois terás uma árvore de ficheiros gerada automaticamente.

Quando terminar, abra o seu ficheiro “build.gradle” e adicione a seguinte linha no bloco “dependencies”:

implementation('net.sourceforge.htmlunit:htmlunit:2.51.0')

Isto irá instalar o HtmlUnit no nosso projeto. Não se esqueça de clicar no botão «Reload» na caixa de ferramentas do Gradle, à direita, para eliminar todos os avisos «Not found».

Passo 2: Inspecione a página que pretende extrair

Ótimo, vamos continuar! Navegue até à página que pretende extrair e clique com o botão direito do rato em qualquer ponto da mesma, depois selecione “Inspecionar elemento”. A consola do programador irá aparecer, onde deverá ver o HTML do site.

Passo 3: Enviar um pedido HTTP e extrair o HTML

Agora, para obter esse HTML na nossa máquina local, temos de enviar uma solicitação HTTP usando o HtmlUnit, que irá devolver o documento. Vamos voltar ao IDE e transformar essa ideia em código.

Primeiro, escreva as importações necessárias para usar o HtmlUnit:

import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.html.*;
import java.io.IOException;
import java.util.List;

Em seguida, inicializamos um WebClient e enviamos uma solicitação HTTP para o site, que retornará uma HtmlPage. É importante lembrar de fechar a conexão após receber a resposta, pois o processo continuará em execução.

WebClient webClient = new WebClient(BrowserVersion.CHROME);

try {
   HtmlPage page = webClient.getPage("https://foodnetwork.co.uk/italian-family-dinners/");

   webClient.getCurrentWindow().getJobManager().removeAllJobs();
   webClient.close();
   recipesFile.close();

} catch (IOException e) {
   System.out.println("An error occurred: " + e);
}

Vale a pena mencionar que o HtmlUnit irá lançar uma série de mensagens de erro na consola que o farão pensar que o seu PC vai explodir. Bem, não tenha medo, porque pode ignorar com segurança 98% delas.

São causadas principalmente pelo HtmlUnit ao tentar executar o código Javascript a partir do servidor do site. No entanto, algumas delas podem ser erros reais que indicam um problema no seu código, por isso é melhor prestar atenção a elas quando executar o seu programa.

Pode evitar ver uma parte destes erros inúteis configurando algumas opções no seu WebClient:

webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setPrintContentOnFailingStatusCode(false);

Passo 4: Extrair secções específicas

Portanto, temos um documento HTML, mas queremos dados, o que significa que devemos analisar a resposta anterior para obter informações legíveis por humanos.

Começando com pequenos passos, vamos extrair o título do site. Podemos fazer isso com a ajuda do método integrado getTitleText:

String title = page.getTitleText();
System.out.println("Page Title: " + title);

Continuando, vamos extrair todos os links do site. Para isso, temos os métodos integrados getAnchors e getHrefAttribute, que extrairão todas as tags <;a> do HTML e, em seguida, recuperarão o valor do atributo href:

List<HtmlAnchor> links = page.getAnchors();
for (HtmlAnchor link : links) {
   String href = link.getHrefAttribute();
   System.out.println("Link: " + href);
}

Como pode ver, o HtmlUnit fornece muitos métodos integrados e autoexplicativos que poupam horas de leitura de documentação.

Vamos ver um exemplo mais realista. Precisamos de extrair todas as receitas do site, o seu título e, mais precisamente, o seu endereço.

Se inspecionar um dos cartões de receita, poderá ver que toda a informação de que precisamos está nos atributos do link, o que significa que tudo o que precisamos de fazer é procurar os links que têm a classe “card-link” e obter os seus atributos.

List<?> anchors = page.getByXPath("//a[@class='card-link']");
for (int i = 0; i < anchors.size(); i++) {
   HtmlAnchor link = (HtmlAnchor) anchors.get(i);
   String recipeTitle = link.getAttribute("title").replace(',', ';');
   String recipeLink = link.getHrefAttribute();
}

Desta vez, usamos uma expressão XPath para procurar links em qualquer profundidade no documento HTML. Em seguida, percorremos a lista de resultados e extraímos o título e o atributo href de cada um deles.

Passo 5: Exportar os dados para CSV

Este tipo de extração pode ser útil quando os dados devem ser transferidos para outra aplicação, um agregador de receitas no nosso caso. Assim, para o fazer, precisamos de exportar os dados analisados para um ficheiro externo.

Vamos criar um ficheiro CSV, uma vez que este pode ser facilmente lido por outra aplicação e aberto no Excel para processamento posterior. Primeiro, apenas mais uma importação:

import java.io.FileWriter;

Em seguida, inicializamos o nosso FileWriter que irá criar o CSV no modo “append”:

FileWriter recipesFile = new FileWriter("recipes.csv", true);
recipesFile.write("id,name,link\n");

Após a criação, escrevemos também a primeira linha do CSV, que será o cabeçalho da tabela. Agora voltamos ao loop anterior, onde analisámos todos os cartões de receitas, e concluímos com a seguinte linha:

recipesFile.write(i + "," + recipeTitle + "," + recipeLink + "\n");

Terminámos de escrever no ficheiro, por isso agora é hora de o fechar:

recipesFile.close();

Ótimo, é tudo! Agora podemos ver todos os dados analisados de uma forma clara, simples e fácil de partilhar.

Conclusão e alternativas

Isto conclui o nosso tutorial. Espero que este artigo tenha sido informativo e lhe tenha proporcionado uma melhor compreensão do web scraping.

Como pode imaginar, esta tecnologia pode fazer muito mais do que alimentar agregadores de receitas. Cabe-lhe a si encontrar os dados corretos e analisá-los para criar novas oportunidades.

Mas, como disse no início do artigo, há muitos desafios que os web scrapers precisam de enfrentar. Os programadores podem achar emocionante resolver estas questões com o seu próprio web scraper, pois é uma ótima experiência de aprendizagem e muito divertida. Ainda assim, se tiver um projeto para concluir, talvez queira evitar os custos associados a isso (tempo, dinheiro, pessoas).

Será sempre mais fácil resolver estes problemas com uma API dedicada. Apesar de todos os possíveis obstáculos, como renderização em Javascript, proxies, CAPTCHAs, etc., a WebScrapingAPI supera-os todos e oferece uma experiência personalizável. Existe também uma opção de teste gratuito, por isso, se ainda não tem a certeza, porque não experimentar?

Sobre o autor
Raluca Penciuc, Desenvolvedor Full-Stack @ WebScrapingAPI
Raluca PenciucDesenvolvedor Full-Stack

Raluca Penciuc é programadora Full Stack na WebScrapingAPI, onde desenvolve scrapers, aperfeiçoa estratégias de evasão e procura formas fiáveis de reduzir a deteção nos sites-alvo.

Comece a construir

Pronto para expandir a sua recolha de dados?

Junte-se a mais de 2.000 empresas que utilizam a WebScrapingAPI para extrair dados da Web à escala empresarial, sem quaisquer custos de infraestrutura.