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
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
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
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 rer">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.
- HtmlAgilityPack
- Microsoft.EntityFrameworkCore.SqlServer
- Microsoft.EntityFrameworkCore.Tools
Para páginas estáticas
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
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
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
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
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
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
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.




