Voltar ao blogue
Guias
Sorin-Gabriel MaricaLast updated on Mar 31, 202610 min read

Apiasp.Net Core Web Scraping: O seu guia essencial para 2023

Apiasp.Net Core Web Scraping: O seu guia essencial para 2023

Web scraping no Apiasp.net

O web scraping é uma técnica pré-programada para extrair grandes volumes de dados de sites. A maioria destes dados está desorganizada e em formato HTML. No entanto, é posteriormente transformada em informação estruturada numa base de dados ou folha de cálculo para ser utilizada noutros programas. 

Para extrair dados de sites, o web scraping pode ser realizado através de vários métodos distintos. Estes incluem o uso de serviços online, APIs específicas ou até mesmo a criação do seu próprio código a partir do zero para o web scraping. É possível aceder a dados de forma estruturada em vários sites.

Embora esta seja frequentemente a melhor opção, alguns sites não têm a capacidade de fornecer aos utilizadores grandes volumes de dados de forma ordenada ou não são muito avançados em termos de inovação. Nesse caso, é melhor recorrer ao web scraping para recolher dados do site.

O Python é atualmente a linguagem de programação mais utilizada para web scraping. Para web scraping, o Python disponibiliza várias bibliotecas à sua disposição. O .NET também pode ser utilizado para web crawling em simultâneo. Podemos extrair dados de muitos sites utilizando algumas APIs web de terceiros.

Uma API popular para web scraping no .NET chama-se WebScrapingAPI. Recentemente, foi incluída também a edição .NET Core para web scraping.

Diferença entre Web Scraping e Web Crawl ing

Diferença entre Web Scraping e Web Crawling 

Os navegadores web são utilizados para apresentar metadados em páginas web encontradas na Internet, que alberga uma quantidade substancial de dados. Os utilizadores podem simplesmente navegar entre sites e interpretar dados utilizando páginas de visualização baseadas em navegador. 

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

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

Como e onde é que esse conhecimento pode ser utilizado?

As respostas podem ser encontradas online em quantidades superiores ao número de sites. Esta perceção pode ser uma ferramenta valiosa para a criação de aplicações, e compreender como escrever esse código pode ser aplicado a testes web automatizados.

Neste blogue, discutiremos dois métodos para rastrear e extrair dados da Web utilizando navegadores e pedidos HTTP básicos, além das vantagens e desvantagens de cada um.

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

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

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

Estes comportam-se e são apresentados de forma diferente, modificando a forma como cada atividade é executada e apresentada de modo a ser facilmente legível e utilizada para ter em conta 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 estiver a tentar recuperar texto de uma página web e descarregá-lo como texto simples.

No entanto, como 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údo web é facilitado através da utilização de um navegador.

Análise de CSS e XPath

Análise de CSS e XPath

XPath e CSS são dois métodos de análise de texto frequentemente utilizados. Uma linguagem de marcação de consultas, o XPath, é utilizada 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 escrita de uma consulta. Os seletores CSS são um meio de escolher elementos que utilizam um padrão de cadeia de caracteres e são ligeiramente comparáveis ao XPath, uma vez que os estilos CSS são aplicados sobre a estrutura HTML.

Preparação da demonstração

Preparação da 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. Um site de exemplo (uma aplicação ASP.NET Core MVC) com três páginas também está incluído no repositório:

  • Páginas com uma tabela simples 
  • Páginas com um «link oculto» e 
  • Um botão que só é exibido após um tempo de espera

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

Criação de uma API Web ASP.NET Core utilizando 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. Utilizando o Visual Studio, deve atribuir um nome válido ao projeto e selecionar o modelo de API de aplicação Web ASP.NET Core.

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. Para o projeto, isto resultará em metadados Sass. 

As APIs aqui listadas devem ser instaladas utilizando o 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.

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

Agora está pronto para prosseguir após a instalação do pacote. A tabela HTML obtida pode ser facilmente analisada utilizando este pacote para localizar as tags e os dados que pretende guardar. 

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

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

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

Considere um projeto de exemplo no qual é necessário vasculhar a Wikipédia em busca de detalhes 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, pode encontrar-se uma lista de programadores com hiperligações para a página da Wikipédia de cada pessoa. Para utilização posterior, 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 online é localizar um site que contenha os dados necessários, usar C# para extrair as informações e guardá-las para uso posterior. Este é apenas um exemplo simples do que pode ser feito com a extração de dados da Web.

Os hiperligações numa página de categoria superior podem ser usados 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 seguintes.

Obter HTML com .HttpClient APIs Web do .NET Core

Obter HTML com .HttpClient 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 plugins independentes de terceiros, porque o domínio Net.HTTP faz tudo. Além disso, inclui suporte nativo para chamadas atrasadas.

O exemplo seguinte mostra como é fácil obter o conteúdo de qualquer URL de forma assíncrona e não bloqueante, utilizando GetStringAsync()

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

{

HttpClient client = new HttpClient();

var response = await client.GetStringAsync(full URL);

return response;

}

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

public IActionResult Index(){

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

var response = CallUrl(url).Result;

return View();}

Aqui, especificamos a URL da Wikipédia no URL, chamamo-la com callUrl() e guardamos o resultado nas variáveis dependentes.

Muito bem, o código necessário para enviar o pedido HTTP está concluído. Embora ainda não o tenhamos processado, é uma excelente ideia executar o código imediatamente para garantir que o HTML da Wikipédia é recebido, em vez de ocorrerem erros.

Para tal, vamos primeiro colocar um ponto de paragem em return View() no método Index(). Isto irá garantir que consegue ver os resultados utilizando a interface do depurador do Visual Studio.

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

Passar o cursor sobre a variável revela que o servidor devolveu uma página HTML válida, indicando que estamos prontos para avançar. Se selecionar «HTML Visualizer» no menu de contexto, 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 analisadores muito popular chamado HTML Agility Pack pode ser facilmente integrado com o 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 desenvolvimento do seu navegador voltarão a ser úteis nesta situação, pois permitem-lhe examinar minuciosamente a árvore DOM.

Veremos na nossa página da Wikipédia que os links no nosso Índice são abundantes, pelo que não precisaremos deles. 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, vemos que cada link que nos interessa está contido dentro de um elemento pai li>. Agora sabemos que os li>s são utilizados tanto para a tabela de conteúdo na página quanto para os nossos componentes de link reais, com base na árvore DOM.

Como não queremos realmente a tabela de conteúdo, é necessário garantir que esses li>s sejam filtrados. Felizmente, eles têm classes HTML separadas, pelo que podemos facilmente omitir quaisquer elementos li> com classes de secção no código.

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

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

  • Recebemos todos os descendentes li> a partir de Descendants ()
  • Para filtrar os itens que utilizam as classes HTML acima mencionadas, utilizamos o LINQ (Where()).
  • Nas nossas listas de strings wikiLink, percorremos (for each) os nossos links e guardamos os seus URLs (relativos) como URLs relativos.

Devolvemos a lista de strings ao nosso chamador.

XPath

XPath

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

Aplicar uma consulta XPath será consideravelmente mais prático em programas do mundo real. Isso permitiria que todo o nosso processo de seleção coubesse numa única frase.

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

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

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

O texto da tabela HTML foi descarregado da Wikipédia, analisado/processado 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. 

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

Conclusão

Conclusão

Com ferramentas como a WebScrapingAPI, é muito simples construir um projeto de crawler 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 permitir que implemente o seu próprio scraper de dados.

Os vários métodos para evitar ser bloqueado ou ter a sua taxa reduzida pelo servidor são um tópico que apenas abordámos brevemente. Normalmente, mais do que quaisquer restrições técnicas, é isso que se interpõe no caminho do web scraping.

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

Sobre o autor
Sorin-Gabriel Marica, Desenvolvedor Full-Stack @ WebScrapingAPI
Sorin-Gabriel MaricaDesenvolvedor Full-Stack

Sorin Marica é engenheiro Full Stack e DevOps na WebScrapingAPI, onde desenvolve funcionalidades do produto e mantém a infraestrutura que garante o bom funcionamento da plataforma.

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.