Raspagem da Web usando C#

Web Scraping é uma técnica usada para extrair dados de sites. Ajuda a automatizar o processo de extração de dados de sites e arquivos HTML. Como desenvolvedor C#, podemos facilmente inspecionar, capturar e extrair dados, como imagens, vídeo, áudio, etc., das páginas da web. Neste artigo, aprenderemos como fazer web scraping com análise de HTML usando C#.

Os seguintes tópicos serão abordados neste artigo:

API C# Web Scraping

Para web scraping de arquivos HTML ou URLs, usaremos a API Aspose.HTML for .NET. É uma API avançada de processamento de HTML que permite gerar, modificar, extrair dados, converter e renderizar documentos HTML sem nenhum software externo. Por favor, baixe a DLL da API ou instale-a usando NuGet.

PM> Install-Package Aspose.Html

Ler e extrair HTML usando C#

Podemos ler e extrair HTML de qualquer documento HTML seguindo os passos abaixo:

  1. Carregue um documento HTML usando a classe HTMLDocument.
  2. Exiba o HTML interno do arquivo no console.

O exemplo de código a seguir mostra como ler e extrair conteúdo HTML usando C#.

// Este exemplo de código demonstra como mostrar o conteúdo do documento HTML
// Carregar documento HTML
var document = new HTMLDocument(@"D:\Files\html\input.html");

// Mostrar HTML interno do documento
Console.WriteLine(document.Body.InnerHTML);
Leia e extraia HTML usando C#.

Leia e extraia HTML usando C#.

Da mesma forma, podemos ler e extrair HTML de sites ativos, conforme mostrado abaixo:

// Este exemplo de código demonstra como mostrar o conteúdo do URL do site ativo.
// Inicializar URL
Url url = new Url("https://en.wikipedia.org/wiki/HTML");

// Carregar arquivo HTML usando a instância de URL
HTMLDocument document = new HTMLDocument(url);

// Mostrar HTML interno do arquivo para console
Console.WriteLine(document.Body.InnerHTML);

Inspecionar elementos do documento usando C#

Podemos inspecionar o documento e seus elementos seguindo as etapas abaixo:

  1. Carregue um documento HTML usando a classe HTMLDocument.
  2. Obtenha o elemento HTML do documento.
  3. Obtenha os primeiros/últimos elementos do elemento HTML.
  4. Exiba detalhes do elemento, como TagName, TextContent.

O exemplo de código a seguir mostra como inspecionar os elementos do documento usando C#.

// Este exemplo de código demonstra como inspecionar elementos HTML.
// Carregar um documento de um arquivo
string documentPath = @"D:\Files\html\input.html";
HTMLDocument document = new 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

Localizar elemento específico usando filtros em C#

Podemos usar filtros personalizados para encontrar um elemento específico, como obter todas as imagens, links, etc. Para isso, a API fornece a interface TreeWalker. Permite navegar em uma árvore ou subárvore de documento usando a visualização do documento definida por seus sinalizadores whatToShow e filtro (se houver). Podemos encontrar elementos específicos usando filtros seguindo as etapas abaixo:

  1. Defina filtros usando a classe NodeFilter e substitua o método AcceptNode().
  2. Carregue um documento HTML usando a classe HTMLDocument.
  3. Chame o método CreateTreeWalker(). Leva o nó raiz, o que mostrar e o NodeFilter como argumentos.

O exemplo de código a seguir mostra como localizar elementos específicos usando C#.

// Este exemplo de código demonstra como consultar dados usando filtros.
// Carregar um documento HTML
HTMLDocument document = new HTMLDocument(@"D:\Files\html\input.html");

// Para iniciar a navegação HTML, precisamos criar uma instância do TreeWalker.
// Os parâmetros especificados significam que ele começa a andar a partir da raiz do documento,
// iterar todos os nós e usar nossa implementação personalizada do filtro
using (var iterator = document.CreateTreeWalker(document, 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 = (HTMLImageElement)iterator.CurrentNode;

        System.Console.WriteLine(image.Src);
        // saída: imagem1.png
        // saída: image2.png
    }
}
// Este exemplo de código demonstra como definir o filtro Node.
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;
    }
}

Consultar dados de HTML usando C#

Também podemos usar XPath Query para consultar dados de um documento HTML seguindo as etapas abaixo:

  1. Carregue um documento HTML usando a classe HTMLDocument.
  2. Chame o método Avaliar(). Ele recebe string de expressão XPath, documento e tipo como argumentos.
  3. Por fim, percorra os nós resultantes e exiba o texto

O exemplo de código a seguir mostra como consultar dados com consultas XPath usando C#.

// Este exemplo de código demonstra como consultar dados usando a consulta XPath.
// Preparar um 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
HTMLDocument document = new 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!
}

Extrair usando o seletor CSS em C

Também podemos extrair conteúdo HTML usando seletores CSS. Para isso, a API disponibiliza o método QuerySelectorAll() que permite navegar por um documento HTML e pesquisar os elementos necessários. Ele usa o seletor de consulta como parâmetro e retorna uma NodeList correspondente de todos os elementos. Podemos consultar usando seletores CSS seguindo as etapas abaixo:

  1. Carregue um documento HTML usando a classe HTMLDocument.
  2. Chame o método QuerySelectorAll(). Ele usa o seletor de consulta como um argumento.
  3. Por fim, percorra a lista de elementos resultante.

O exemplo de código a seguir mostra como extrair conteúdo HTML usando seletores CSS em C#.

// Inicializar um documento com base no código preparado
HTMLDocument document = new HTMLDocument(@"D:\Files\html\input.html");

// Aqui criamos um seletor CSS que extrai todos os elementos div
var elements = document.QuerySelectorAll("div");

// Iterar sobre a lista de elementos resultante
foreach (Aspose.Html.HTMLElement element in elements)
{
    System.Console.WriteLine(element.InnerHTML);
}

Obtenha uma licença gratuita

Experimente a API sem limitações de avaliação solicitando uma licença temporária gratuita.

Conclusão

Neste artigo, aprendemos como:

  • leia e extraia o conteúdo de um documento HTML usando C#;
  • inspecionar os elementos do documento e encontrar um elemento específico do HTML;
  • dados específicos de consulta e extraia dados usando o CSS Selector.

Além disso, você pode aprender mais sobre Aspose.HTML para .NET API usando a documentação. Em caso de qualquer ambiguidade, não hesite em contactar-nos no fórum.

Veja também