Compreender a raspagem da Web
O que é o web scraping? Muitos sites não disponibilizam os seus dados através de APIs públicas, pelo que os web scrapers extraem os dados diretamente do navegador. É muito semelhante a uma pessoa que copia texto manualmente, mas é feito num piscar de olhos.
Quando se tem em conta que uma melhor análise de negócios implica melhores decisões, este processo revela-se 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.
Talvez esteja a perguntar-se: «O que vou fazer com estes dados?». Bem, vamos ver alguns casos em que a extração de dados da Web pode ser realmente útil:
- Geração de leads: uma empresa em atividade precisa de gerar leads para encontrar clientes.
- Informação sobre preços: a decisão de uma empresa quanto à fixação de preços e à comercialização dos seus produtos será influenciada pelos preços praticados pelos 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 da extração de dados da Web.
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 dispõem de vários meios para 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 relativamente fáceis de resolver para as pessoas, mas representam um grande obstáculo para os programas de extração de dados.
- Bloqueio de IP: se um site detetar que estão a ser enviadas várias solicitações a partir do mesmo endereço IP, pode bloquear o acesso a esse site ou tornar a navegação muito mais 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, poderá receber informações específicas da sua região quando solicitar informações relativas a 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 desenvolver um excelente scraper da Web. Por isso, as APIs para web scraping tornaram-se um dos temas mais em voga na ú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 os Amazon Web Services, o que garante velocidade e escalabilidade. Parece algo que lhe possa interessar? Comece o seu período de teste gratuito da WebScrapingAPI e poderá efetuar 5000 chamadas à 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ários elementos de informação que descrevem o cliente e a forma como este processa os dados: método, versão HTTP e cabeçalhos.
Os web scrapers utilizam o método GET para os 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 informações, pode consultar aqui uma lista detalhada dos métodos HTTP.
É possível encontrar vários detalhes adicionais sobre pedidos e respostas nos cabeçalhos HTTP. Pode consultar a lista completa, mas os que são relevantes para a extração de dados da Web são:
- User-Agent: indica a aplicação, o sistema operativo, o software e a versão; os programas de extração de dados da Web utilizam este cabeçalho para que os seus pedidos 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; por conseguinte, o conteúdo apresentado pode variar, pelo que este facto também deve ser tido em conta.
- Cookie: armazena informações confidenciais sobre um pedido e o servidor (tais como tokens de autenticação).
- Accept: garante que a resposta do servidor seja de um tipo específico (por exemplo: text/plain, application/json, etc.).
Compreender Java
Java, uma linguagem de código aberto e orientada para 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 esta linguagem de programação tornou-se cada vez mais acessível.
Muitas das alterações introduzidas no Java tiveram como objetivo reduzir as dependências na implementação do código. Por isso, muitos programadores preferem esta linguagem, mas ela também apresenta outras vantagens:
- É de código aberto;
- Oferece uma variedade de APIs;
- É multiplataforma, o que proporciona maior versatilidade;
- Possui documentação detalhada e um apoio da comunidade de confiança.
Criar o seu próprio raspador da Web
Agora podemos começar a falar sobre a extração de dados. Antes de mais nada, precisamos de um site que forneça informações úteis. Para este tutorial, decidimos extrair dados desta página web que partilha receitas italianas.
Passo 1: Configurar o ambiente
Para criar o nosso scraper web 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 a longo prazo (LTS), o Java 8 continua a ser o padrão preferido para produção entre os programadores.
- Gradle: é uma ferramenta flexível de código aberto para automatização de compilação, com um vasto leque 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 facilita bastante a integração com o Gradle.
- HtmlUnit: permite simular eventos do navegador, como cliques e o envio de formulários, durante a extração de dados, e suporta 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
Isto deverá mostrar-lhe as versões do Java e do Gradle que estão instaladas no seu computador:


Se não aparecer nenhum erro, então estamos prontos para avançar.
Agora vamos criar um projeto para podermos começar a escrever o código. Felizmente, a JetBrains disponibiliza um tutorial bem elaborado sobre como dar os primeiros passos com 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 assim terá uma árvore de ficheiros gerada automaticamente.
Quando terminar, abra o ficheiro «build.gradle» e adicione a seguinte linha no bloco «dependencies»:
implementação('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 de «Não encontrado».

Etapa 2: Inspecionar a página que pretende extrair
Ótimo, vamos continuar! Aceda à página que pretende extrair e clique com o botão direito do rato em qualquer ponto da página; em seguida, selecione «Inspecionar elemento». A consola do programador irá aparecer, onde poderá ver o código 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 um pedido HTTP utilizando o HtmlUnit, que irá devolver o documento. Voltemos ao IDE e transformemos esta ideia em código.
Primeiro, escreva as importações necessárias para utilizar 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 um pedido HTTP ao site, que irá devolver uma HtmlPage. É importante lembrar-se de fechar a ligação após receber a resposta, uma vez que o processo continuará a ser executado.
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 referir que o HtmlUnit irá apresentar uma série de mensagens de erro na consola que o farão pensar que o seu computador vai explodir. Bem, não se preocupe, porque pode ignorar 98% delas sem qualquer problema.
São causados principalmente pelo HtmlUnit ao tentar executar o código JavaScript a partir do servidor do site. No entanto, alguns deles podem ser erros reais que indicam um problema no seu código, por isso é melhor prestar atenção a eles quando executar o seu programa.
Pode evitar ver 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 em informações legíveis por humanos.
Começando por pequenos passos, vamos extrair o título do site. Podemos fazê-lo com a ajuda do método integrado getTitleText:
String título = página.getTitleText();
System.out.println("Título da página: " + título);
A seguir, vamos extrair todos os links do site. Para isso, dispomos dos métodos integrados `getAnchors ` e `getHrefAttribute`, que extraem todas as tags `<a>` do HTML e, em seguida, recuperam o valordo 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 disponibiliza muitos métodos integrados e intuitivos que lhe poupam horas de leitura de documentação.
Vamos dar um exemplo mais realista. Precisamos de extrair todas as receitas do site, o seu título e o seu endereço, mais precisamente.

Se analisarmos um dos cartões de receita, podemos ver que toda a informação de que precisamos está nos atributos do link, o que significa que basta 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, utilizamos uma expressão XPath para procurar links em qualquer nível de hierarquia do 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 têm de ser transferidos para outra aplicação, no nosso caso, um agregador de receitas. Para tal, precisamos de exportar os dados analisados para um ficheiro externo.
Vamos criar um ficheiro CSV, uma vez que pode ser facilmente lido por outra aplicação e aberto com o Excel para processamento posterior. Primeiro, só mais uma importação:
import java.io.FileWriter;
Em seguida, inicializamos o nosso FileWriter, que irá criar o ficheiro CSV no modo «append»:
FileWriter receitasFile = new FileWriter("receitas.csv", true);
receitasFile.write("id,nome,link\n");
Após a criação, escrevemos também a primeira linha do ficheiro CSV, que constituirá o cabeçalho da tabela. Agora voltamos ao ciclo anterior, onde analisámos todos os cartões de receitas, e concluímos com a seguinte linha:
recipesFile.write(i + "," + recipeTitle + "," + recipeLink + "\n");
Já terminámos de escrever no ficheiro, por isso agora é hora de o fechar:
recipesFile.close();
Fixe, é tudo! Agora podemos ver todos os dados analisados de uma forma limpa, não assustadora e fácil de encaminhar.

Conclusão e alternativas
Com isto, concluímos o nosso tutorial. Espero que este artigo tenha sido informativo e lhe tenha ajudado a compreender melhor o web scraping.
Como pode imaginar, esta tecnologia tem muito mais para oferecer do que apenas alimentar agregadores de receitas. Cabe-lhe a si encontrar os dados certos e analisá-los para criar novas oportunidades.
Mas, como referi no início do artigo, existem muitos desafios que os web scrapers têm de enfrentar. Os programadores podem achar emocionante resolver estes problemas com o seu próprio web scraper, pois é uma excelente experiência de aprendizagem e muito divertida. No entanto, se tiver um projeto para concluir, talvez seja melhor evitar os custos associados a isso (tempo, dinheiro, pessoal).
Será sempre mais fácil resolver estes problemas com uma API dedicada. Apesar de todos os possíveis obstáculos, como a renderização de 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?




