Web Scraper C#

Web Scraping, também conhecido como web crawling, web harvesting ou data scraping, é usado para extrair dados de sites. Um web scraper usa diferentes seletores de dados, como seletores CSS, XPath ou ambos, para extrair dados das páginas da web. Ambos os seletores são eficientes para coletar e analisar informações da web. Este artigo aborda como criar um web scraper em C#, especificamente as informações sobre navegação HTML, XPath Query e CSS Selector.

Configuração da biblioteca de raspagem da Web C#

Aspose.HTML for .NET é uma biblioteca de web scraping que pode ser facilmente configurada baixando os arquivos DLL de referência da seção New Releases ou executando o seguinte comando de instalação NuGet :

PM> Install-Package Aspose.Html

Web Scraping com navegação HTML em C#

Você pode usar diferentes propriedades da classe Node para navegar nos documentos HTML. O snippet de código abaixo explica como navegar em uma página HTML em C#:

// Preparar código HTML
var html_code = "<span>Hello</span> <span>World!</span>";

// Inicializar um documento a partir do código preparado
using (var document = new Aspose.Html.HTMLDocument(html_code, "."))
{
    // Obter a referência ao primeiro filho (primeiro SPAN) do BODY
    var element = document.Body.FirstChild;
    Console.WriteLine(element.TextContent); // output: Hello

    // Obtenha a referência ao espaço em branco entre os elementos html
    element = element.NextSibling;
    Console.WriteLine(element.TextContent); // output: ' '

    // Obtenha a referência ao segundo elemento SPAN
    element = element.NextSibling;
    Console.WriteLine(element.TextContent); // output: World!
}

Inspeção do documento HTML e seus elementos

A API também fornece o uso generalizado de recursos de travessia de elementos. O snippet de código a seguir demonstra como realizar uma inspeção detalhada de diferentes elementos da API.

//Carregar um documento de um arquivo
string documentPath = System.IO.Path.Combine(DataDir, "html_file.html");

// Especifique o caminho para o arquivo HTML de origem em seu sistema de arquivos local
using (var document = new Aspose.Html.HTMLDocument(documentPath))
{
    // Obter o elemento html do documento
    var element = document.DocumentElement;                
    Console.WriteLine(element.TagName); // HTML
    
    // Obter o último elemento do elemento html
    element = element.LastElementChild;
    Console.WriteLine(element.TagName); // BODY
    
    // Obter o primeiro elemento do elemento body
    element = element.FirstElementChild;
    Console.WriteLine(element.TagName); // H1
    Console.WriteLine(element.TextContent); // Header 1     
}

Uso de filtro personalizado para Web Scraper em C#

Você pode implementar um filtro personalizado usando um objeto de interface ITreeWalker ou INodeIterator junto com uma implementação de filtro personalizado. O snippet de código a seguir explica como seguir o processo:

class OnlyImageFilter : Aspose.Html.Dom.Traversal.Filters.NodeFilter
{
    public override short AcceptNode(Aspose.Html.Dom.Node n)
    {
        // O filtro atual ignora todos os elementos, exceto os elementos IMG.
        return string.Equals("img", n.LocalName)
            ? FILTER_ACCEPT
            : FILTER_SKIP;
    }
}

Depois de implementar um filtro personalizado, você pode navegar rapidamente em uma página da Web com o seguinte código:

var code = @"
    <p>Hello</p>
    <img src='image1.png'>
    <img src='image2.png'>
    <p>World!</p>";

// Inicializar um documento com base no código preparado
using (var document = new Aspose.Html.HTMLDocument(code, "."))
{
    // Para iniciar a navegação HTML, precisamos criar uma instância do TreeWalker.
    // Os parâmetros especificados significam que ele começa a andar da raiz do documento, iterando todos os nós e usando nossa implementação personalizada do filtro
    using (var iterator = document.CreateTreeWalker(document, Aspose.Html.Dom.Traversal.Filters.NodeFilter.SHOW_ALL, new OnlyImageFilter()))
    {         
        while (iterator.NextNode() != null)
        {
            // Como estamos usando nosso próprio filtro, o nó atual sempre será uma instância do HTMLImageElement.
            // Portanto, não precisamos das validações adicionais aqui.
            var image = (Aspose.Html.HTMLImageElement)iterator.CurrentNode;

            System.Console.WriteLine(image.Src);
            // saída: imagem1.png
            // saída: image2.png
        }
    }
}

Web Scraping usando XPath Query em C#

XPath pode ser usado para extrair dados de documentos HTML. O trecho de código a seguir explica como usar XPath Query para Web scraping em C#:

// Preparar código HTML
var code = @"
    <div class='happy'>
        <div>
            <span>Hello!</span>
        </div>
    </div>
    <p class='happy'>
        <span>World</span>
    </p>
";

// Inicializar um documento com base no código preparado
using (var document = new Aspose.Html.HTMLDocument(code, "."))
{
    // Aqui avaliamos a expressão XPath onde selecionamos todos os elementos SPAN filhos de elementos cujo atributo 'class' é igual a 'happy':
    var result = document.Evaluate("//*[@class='happy']//span",
        document,
        null,
        Aspose.Html.Dom.XPath.XPathResultType.Any,
        null);

    // Iterar sobre os nós resultantes
    for (Aspose.Html.Dom.Node node; (node = result.IterateNext()) != null;)
    {
        System.Console.WriteLine(node.TextContent);
        // saída: Olá
        // saída: Mundo!
    }
}

Web Scraping com CSS Selector em C#

Você pode criar um padrão de pesquisa para corresponder elementos em uma árvore de documentos com base na sintaxe de seletores CSS. O snippet de código abaixo explica como fazer web scraping com CSS Selector em C#:

// Preparar código HTML
var code = @"
    <div class='happy'>
        <div>
            <span>Hello</span>
        </div>
    </div>
    <p class='happy'>
        <span>World!</span>
    </p>
";

// Inicializar um documento com base no código preparado
using (var document = new Aspose.Html.HTMLDocument(code, "."))
{
    // Aqui criamos um seletor CSS que extrai todos os elementos cujo atributo 'class' é igual a 'happy' e seus elementos filhos SPAN
    var elements = document.QuerySelectorAll(".happy span");

    // Iterar sobre a lista de elementos resultante
    foreach (Aspose.Html.HTMLElement element in elements)
    {
        System.Console.WriteLine(element.InnerHTML);
        // saída: Olá
        // saída: Mundo!
    }
}

Obtenha Licença Gratuita

Você pode solicitar uma licença temporária gratuita para avaliar a API em sua capacidade total.

Conclusão

Neste artigo, você aprendeu sobre a biblioteca de web scraping em C#, Aspose.HTML para .NET, que inclui vários métodos para criar um web scraper em C#. Ele discute a Navegação HTML, a Consulta XPath, bem como o método seletor de CSS para atender às suas necessidades. No entanto, caso você precise discutir alguma de suas preocupações ou perguntas, escreva para nós no fórum.

Veja também