Voltar ao blogue
Guias
Suciu Dan15 de novembro de 202210 min de leitura

Apiasp.Net Core Web Scraping: Seu guia para 2023

Apiasp.Net Core Web Scraping: Seu guia para 2023

Diferença entre web scraping e web crawling 

Diferença entre web scraping e web crawling 

Os navegadores da Web são utilizados para apresentar metadados nas páginas da Web encontradas na Internet, que alberga uma quantidade substancial de dados. Os utilizadores podem facilmente navegar entre sites e interpretar os dados através de páginas apresentadas pelo navegador. 

«Web crawling» e «web scraping» são termos utilizados para descrever o processo de extração de código de visualização. O «web scraping» é o processo de analisar uma página web e obter informações a partir dela. A pesquisa de links na web e a obtenção iterativa do seu conteúdo é designada por «web crawling». 

Ambas as operações são realizadas por uma aplicação, uma vez que a descoberta de novas ligações requer a extração de dados de páginas web. Ambas as expressões, que por vezes são utilizadas como sinónimos, referem-se ao processo de obtenção de informações. No entanto, servem diversos propósitos. 

Como e onde é que esses conhecimentos podem ser aplicados?

É possível encontrar respostas online em maior quantidade do que o próprio número de sites. Esta constatação pode ser uma ferramenta valiosa para a criação de aplicações, e compreender como escrever esse tipo de código pode ser aplicado aos testes automatizados na Web.

Neste blogue, iremos abordar dois métodos para rastrear e extrair dados da Web utilizando navegadores e pedidos HTTP básicos, bem como as vantagens e desvantagens de cada um.

Utilização de consultas HTTP e navegadores da Web para descarregar conteúdos da Web

Utilização de consultas HTTP e navegadores da Web para descarregar conteúdos da Web

Dado que hoje em dia quase tudo está online, é possível, sem dúvida, encontrar um módulo para enviar pedidos HTTP em qualquer linguagem de programação. Os pedidos HTTP simples são processados rapidamente. Demora mais tempo a utilizar navegadores como o Firefox e o Google Chrome como alternativa. 

Comportam-se e são apresentados de forma diferente, alterando a forma como cada atividade é executada e exibida, de modo a facilitar a leitura e a utilização, tendo em conta os estilos de apresentação e a execução de scripts nas páginas web. Os navegadores web desperdiçam, por vezes, recursos. Por exemplo, uma simples solicitação HTTP pode ser suficiente se pretender recuperar texto de uma página web e descarregá-lo como texto simples.

No entanto, dado que o JavaScript é tão amplamente utilizado, alguns conteúdos em muitos sites não podem ser apresentados se não forem executados. Neste caso, o download de conteúdos da Web é facilitado através da utilização de um navegador.

Análise de CSS e XPath

Análise de CSS e XPath

O XPath e o CSS são dois métodos de análise de texto frequentemente utilizados. O XPath, uma linguagem de marcação de consultas, é utilizado para identificar elementos específicos em ficheiros XML e HTML. 

Cada um contém uma estrutura específica, e esse padrão pode ser seguido na elaboração de uma consulta. Os seletores CSS são uma forma de selecionar elementos com base num padrão de cadeia de caracteres e são, de certa forma, comparáveis ao XPath, uma vez que os estilos CSS são aplicados sobre a estrutura HTML.

Preparar a demonstração

Preparar a demonstração

Estas demonstrações utilizam os ambientes C# e .NET Core 3.1. Estas APIs devem funcionar no .NET 4x, uma vez que não sofreram grandes alterações recentemente. Está também incluído no repositório um site de exemplo (uma aplicação ASP.NET Core MVC) com três páginas:

  • Páginas com uma tabela simples 
  • Páginas com um «link oculto» e 
  • Um botão que só aparece após um período de espera

Criação de uma API Web ASP.NET Core utilizando o Visual Studio 2022

Produção ASP.NET API Web Core com o Visual Studio 2022

Com o .NET 6.0, o Visual Studio 2022 pode ser utilizado para desenvolver uma API de aplicação Web ASP.NET Core. Ao utilizar o Visual Studio, deve atribuir um nome adequado ao projeto e selecionar o modelo de API de aplicação Web ASP.NET Core.

Página do C# Corner com uma lista de artigos e exemplos sobre projetos ASP.NET Core Web API

Tem à sua disposição o framework Net Core Web API 6.0 como opção. Além disso, pode selecionar o suporte padrão à Open API. No que diz respeito ao projeto, isto resultará na geração de metadados Sass. 

As APIs aqui listadas devem ser instaladas através do gestor de pacotes NuGet.

Para páginas estáticas

Para páginas estáticas

Configuração

Configuração

Se utiliza C#, é provável que já trabalhe com o Visual Studio. Neste artigo, é utilizado um projeto específico de aplicação web.NET Core baseado em MVC (Model View Controller). 

Utilize o gestor de pacotes NuGet para incorporar as bibliotecas necessárias utilizadas ao longo deste guia, após criar um projeto totalmente novo.

Janela do Visual Studio Code com o menu «Ferramentas» aberto nas opções do gestor de pacotes NuGet

Para descarregar os pacotes no NuGet, selecione a opção «Procurar» e, em seguida, introduza «HTML Agility Pack».

Janela do gestor de pacotes NuGet do Visual Studio a mostrar os pacotes instalados num projeto ASP.NET

Agora que já instalou o pacote, está pronto para continuar. A tabela HTML obtida pode ser facilmente analisada com este pacote para localizar as etiquetas e os dados que pretende guardar. 

Página de detalhes do pacote Html Agility Pack com informações sobre a versão e o projeto

As seguintes APIs devem ser incluídas no código antes de começar a programar o scraper através do Visual Studio:

Utilizar C# para enviar um pedido HTTP a uma página Web

Utilizar C# para enviar um pedido HTTP a uma página Web

Imagina um projeto de exemplo em que tenhas de vasculhar a Wikipédia à procura de informações sobre programadores de computador famosos. Se não houvesse um artigo sobre isso, a Wikipédia não seria a Wikipédia, certo?

 https://en.wikipedia.org/wiki/list-of-programmers 

Nesse artigo, é possível encontrar uma lista de programadores com hiperligações para a página da Wikipédia de cada um. Para utilização futura, pode extrair a lista e guardar os dados num formato CSV (que, por exemplo, o Excel consegue processar facilmente).

A ideia principal por trás da extração de dados da Web consiste em localizar um site que contenha os dados necessários, utilizar C# para extrair essas informações e guardá-las para utilização posterior. Este é apenas um exemplo simples do que se pode conseguir com a extração de dados da Web.

As hiperligações numa página de categoria principal podem ser utilizadas para rastrear páginas web em projetos mais complexos. No entanto, vamos concentrar-nos nessa página específica da Wikipédia para os exemplos que se seguem.

Obter HTML com o .HttpClient e as APIs Web do .NET Core

Obter HTML com o .HttpClient e as APIs Web do .NET Core

Um cliente HTTP integrado para .NET chama-se HttpClient e está disponível por predefinição. Não são necessárias bibliotecas ou plug-ins independentes de terceiros, uma vez que o domínio Net.HTTP trata de tudo. Além disso, inclui suporte nativo para chamadas diferidas.

O exemplo seguinte mostra como é fácil obter o conteúdo de qualquer URL de forma assíncrona e sem bloqueios, utilizando o método GetStringAsync()

private static async Task<string> CallUrl(string full URL)

{

HttpClient client = new HttpClient();

var resposta = await client.GetStringAsync(URL completa);

retornar resposta;

}

Basta criar um novo objeto HttpClient, chamar GetStringAsync(), «esperar» que termine e, em seguida, devolver o resultado ao chamador. Agora que essa funcionalidade foi adicionada à classe do controlador, pode chamar CallUrl() a partir do método Index() sem necessidade de mais ações. Vamos pôr isso em prática.

public IActionResult Index(){

string url = "https://en.wikipedia.org/wiki/List_of_programmers";

var resposta = CallUrl(url).Result;

return View();}

Aqui, especificamos o URL da Wikipédia no campo «URL», chamamos a função com callUrl() e guardamos o resultado nas variáveis dependentes.

Muito bem, o código necessário para enviar o pedido HTTP já está pronto. Embora ainda não o tenhamos processado, é uma excelente ideia executar o código imediatamente para garantir que o código HTML da Wikipédia é recebido corretamente, sem erros.

Para tal, vamos primeiro inserir uma instrução «halt» na função View() do método Index(). Isto irá garantir que consegue visualizar os resultados através da interface do depurador do Visual Studio.

Ao selecionar a opção «Executar» na barra de ferramentas do Visual Studio, pode testar o código acima referido: no ponto de interrupção, o Visual Studio irá parar, permitindo-lhe ver o estado atual da aplicação.

Ao passar o cursor sobre a variável, verifica-se que o servidor devolveu uma página HTML válida, o que indica que estamos prontos para avançar. Se selecionar «Visualizador HTML» no menu de contexto, poderá ver uma pré-visualização da página HTML.

Análise de HTML

Análise de HTML

Chegou a hora de analisar a tabela HTML que foi recuperada. Um conjunto de ferramentas de análise muito popular chamado HTML Agility Pack pode ser facilmente integrado ao LINQ, por exemplo.

É necessário compreender a estrutura da página antes de analisar a tabela HTML, para que possa identificar com precisão quais os elementos a recuperar. As ferramentas de programador do seu navegador voltarão a ser úteis nesta situação, pois permitem-lhe examinar minuciosamente a árvore DOM.

Como podemos ver na nossa página da Wikipédia, os links no nosso Índice são abundantes, pelo que não precisaremos desses. Existem também outros links adicionais, alguns dos quais não são absolutamente necessários para a nossa recolha de dados (como os links de edição). 

Quando analisamos mais a fundo, percebemos que cada link que nos interessa está contido dentro de um elemento pai . Sabemos agora que os elementos são utilizados tanto para a tabela de conteúdo da página como para os nossos componentes de link reais, com base na árvore DOM.

Como, na verdade, não queremos a tabela de conteúdos, é necessário garantir que esses elementos sejam excluídos. Felizmente, eles têm classes HTML distintas, pelo que podemos facilmente omitir quaisquer elementos com essas classes no código.

Hora de programar! Vamos começar por incluir o método ParseHtml na nossa classe de controlador ().

Aqui, começamos por criar uma instância de HtmlDocument e, em seguida, carregamos a página HTML que descarregámos anteriormente através do método CallUrl(). Agora que dispomos de uma representação DOM válida da nossa página, podemos começar a extrair os dados.

  • Recebemos todos os descendentes de Descendants ()
  • Para filtrar os elementos que utilizam as classes HTML acima mencionadas, recorremos ao LINQ (Where()).
  • Nas nossas listas de cadeias wikiLink, percorremos (para cada um) os nossos links e mantemos os seus URLs (relativos) como URLs relativos.

Devolvemos a lista de cadeias de caracteres ao nosso chamador.

XPath

XPath

Não teríamos sido obrigados a escolher os elementos individualmente, e é importante ter isso em conta. Só o fizemos para dar um bom exemplo.

A aplicação de uma consulta XPath será consideravelmente mais prática em programas reais. Isso permitiria que todo o nosso processo de seleção coubesse numa única frase.

À semelhança do nosso procedimento convencional, isto irá selecionar qualquer elemento `li>` que não possua a classe especificada (not(contains())).

Criar um ficheiro para exportação de dados extraídos

Criar um ficheiro para exportação de dados extraídos

O texto da tabela HTML foi descarregado da Wikipédia, analisado e transformado numa árvore DOM, e todas as ligações necessárias foram extraídas com sucesso. Como resultado, dispomos agora de uma lista geral de hiperligações da página.

Os links devem agora ser exportados para um ficheiro no formato CSV. Para gravar as informações da lista geral num ficheiro, vamos criar um novo método chamado WriteToCsv(). O procedimento completo é apresentado no código que se segue. 

Cria um ficheiro no disco rígido local chamado «links.csv» e guarda nele as hiperligações extraídas. Assim, grava dados num ficheiro num disco local utilizando as APIs nativas do .NET Framework. 

Conclusão

Conclusão

Com ferramentas como a WebScrapingAPI, é muito simples criar um projeto de rastreamento e recolher rapidamente as informações necessárias. O C# e o .NET, em geral, contêm todos os recursos e bibliotecas necessários para que possa implementar o seu próprio programa de extração de dados.

Página de documentação da WebScrapingAPI ao lado de uma ilustração circular com bandeiras de países e ícones de navegadores

Os vários métodos para evitar ser bloqueado ou ter a velocidade reduzida pelo servidor são um tema que apenas abordámos superficialmente. Normalmente, mais do que quaisquer restrições técnicas, é isso que constitui o principal obstáculo à extração de dados da Web.

Se preferir concentrar-se nos seus dados em vez de lidar com agentes de utilizador, restrições de taxa, proxies e dificuldades com JavaScript, dê uma vista de olhos às funcionalidades de ponta da WebScrapingAPI. 

Sobre o autor
Suciu Dan, cofundador da WebScrapingAPI
Suciu DanCo-fundador

Suciu Dan é cofundador da WebScrapingAPI e escreve guias práticos, voltados para programadores, sobre web scraping em Python, web scraping em Ruby e infraestruturas de proxy.

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.