Web Scraping usando C#

Web Scraping es una técnica utilizada para extraer datos de sitios web. Ayuda a automatizar el proceso de extracción de datos de sitios web y archivos HTML. Como desarrollador de C#, podemos inspeccionar, capturar y extraer datos fácilmente, como imágenes, video, audio, etc., de las páginas web. En este artículo, aprenderemos cómo realizar web scraping con análisis HTML usando C#.

En este artículo se tratarán los siguientes temas:

API de raspado web de C#

Para el web scraping de archivos HTML o URL, utilizaremos Aspose.HTML para .NET API. Es una API de procesamiento HTML avanzada que permite generar, modificar, extraer datos, convertir y renderizar documentos HTML sin ningún software externo. Descargue la DLL de la API o instálela usando NuGet.

PM> Install-Package Aspose.Html

Leer y extraer HTML usando C#

Podemos leer y extraer HTML de cualquier documento HTML siguiendo los pasos que se detallan a continuación:

  1. Cargue un documento HTML utilizando la clase HTMLDocument.
  2. Muestre el HTML interno del archivo en la consola.

El siguiente ejemplo de código muestra cómo leer y extraer contenido HTML mediante C#.

// Este ejemplo de código demuestra cómo mostrar el contenido de un documento HTML
// Cargar documento HTML
var document = new HTMLDocument(@"D:\Files\html\input.html");

// Mostrar HTML interno del documento
Console.WriteLine(document.Body.InnerHTML);
Lee y extrae HTML usando C#.

Lee y extrae HTML usando C#.

De manera similar, podemos leer y extraer HTML de sitios web en vivo como se muestra a continuación:

// Este ejemplo de código demuestra cómo mostrar contenido de la URL del sitio web en vivo.
// Inicializar URL
Url url = new Url("https://en.wikipedia.org/wiki/HTML");

// Cargue el archivo HTML usando la instancia de Url
HTMLDocument document = new HTMLDocument(url);

// Mostrar HTML interno del archivo a la consola
Console.WriteLine(document.Body.InnerHTML);

Inspeccionar elementos del documento usando C#

Podemos inspeccionar el documento y sus elementos siguiendo los pasos que se detallan a continuación:

  1. Cargue un documento HTML utilizando la clase HTMLDocument.
  2. Obtenga el elemento HTML del documento.
  3. Obtenga los primeros/últimos elementos del elemento HTML.
  4. Mostrar detalles del elemento como TagName, TextContent.

El siguiente ejemplo de código muestra cómo inspeccionar los elementos del documento mediante C#.

// Este ejemplo de código demuestra cómo inspeccionar elementos HTML.
// Cargar un documento desde un archivo
string documentPath = @"D:\Files\html\input.html";
HTMLDocument document = new HTMLDocument(documentPath);

// Obtener el elemento html del documento
var element = document.DocumentElement;
Console.WriteLine(element.TagName); // HTML

// Obtener el último elemento del elemento html
element = element.LastElementChild;
Console.WriteLine(element.TagName); // BODY

// Obtener el primer elemento del elemento del cuerpo.
element = element.FirstElementChild;
Console.WriteLine(element.TagName); // H1
Console.WriteLine(element.TextContent); // Header 1

Encuentre un elemento específico usando filtros en C#

Podemos usar filtros personalizados para encontrar un elemento específico, como obtener todas las imágenes, enlaces, etc. Para este propósito, la API proporciona la interfaz TreeWalker. Permite navegar por un árbol o subárbol de documentos usando la vista del documento definida por sus banderas y filtros whatToShow (si los hay). Podemos encontrar elementos específicos usando filtros siguiendo los pasos que se detallan a continuación:

  1. Defina filtros usando la clase NodeFilter y anule el método AcceptNode().
  2. Cargue un documento HTML utilizando la clase HTMLDocument.
  3. Llame al método CreateTreeWalker(). Toma el nodo raíz, qué mostrar y NodeFilter como argumentos.

El siguiente ejemplo de código muestra cómo encontrar elementos específicos mediante C#.

// Este ejemplo de código muestra cómo consultar datos mediante filtros.
// Cargar un documento HTML
HTMLDocument document = new HTMLDocument(@"D:\Files\html\input.html");

// Para iniciar la navegación HTML necesitamos crear una instancia de TreeWalker.
// Los parámetros especificados significan que comienza a caminar desde la raíz del documento,
// iterando todos los nodos y usando nuestra implementación personalizada del filtro
using (var iterator = document.CreateTreeWalker(document, Dom.Traversal.Filters.NodeFilter.SHOW_ALL, new OnlyImageFilter()))
{
    while (iterator.NextNode() != null)
    {
        // Como estamos usando nuestro propio filtro, el nodo actual siempre será una instancia de HTMLImageElement.
        // Por lo tanto, no necesitamos las validaciones adicionales aquí.
        var image = (HTMLImageElement)iterator.CurrentNode;

        System.Console.WriteLine(image.Src);
        // salida: imagen1.png
        // salida: imagen2.png
    }
}
// Este ejemplo de código muestra cómo definir el filtro Node.
class OnlyImageFilter : Aspose.Html.Dom.Traversal.Filters.NodeFilter
{
    public override short AcceptNode(Aspose.Html.Dom.Node n)
    {
        // El filtro actual omite todos los elementos, excepto los elementos IMG.
        return string.Equals("img", n.LocalName)
            ? FILTER_ACCEPT
            : FILTER_SKIP;
    }
}

Consultar datos de HTML usando C#

También podemos usar XPath Query para consultar datos de un documento HTML siguiendo los pasos que se detallan a continuación:

  1. Cargue un documento HTML utilizando la clase HTMLDocument.
  2. Llame al método Evaluate(). Toma la cadena de expresión XPath, el documento y el tipo como argumentos.
  3. Finalmente, recorra los nodos resultantes y muestre el texto

El siguiente ejemplo de código muestra cómo consultar datos con consultas XPath mediante C#.

// Este ejemplo de código muestra cómo consultar datos mediante la consulta XPath.
// Preparar un código HTML
var code = @"
    <div class='happy'>
        <div>
            <span>Hello!</span>
        </div>
    </div>
    <p class='happy'>
        <span>World</span>
    </p>
";

// Inicializar un documento basado en el código preparado
HTMLDocument document = new HTMLDocument(code, ".");

// Aquí evaluamos la expresión XPath donde seleccionamos todos los elementos secundarios SPAN 
// de elementos cuyo atributo 'clase' es igual a 'feliz':
var result = document.Evaluate("//*[@class='happy']//span",
    document,
    null,
    Aspose.Html.Dom.XPath.XPathResultType.Any,
    null);

// Iterar sobre los nodos resultantes
for (Aspose.Html.Dom.Node node; (node = result.IterateNext()) != null;)
{
    System.Console.WriteLine(node.TextContent);
    // salida: hola
    // salida: ¡Mundo!
}

Extraer usando CSS Selector en C#

También podemos extraer contenido HTML usando selectores CSS. Para ello, la API proporciona el método QuerySelectorAll() que permite navegar por un documento HTML y buscar los elementos necesarios. Toma el selector de consultas como parámetro y devuelve una lista de nodos coincidente de todos los elementos. Podemos consultar usando selectores de CSS siguiendo los pasos que se detallan a continuación:

  1. Cargue un documento HTML utilizando la clase HTMLDocument.
  2. Llame al método QuerySelectorAll(). Toma el selector de consultas como argumento.
  3. Finalmente, recorra la lista de elementos resultante.

El siguiente ejemplo de código muestra cómo extraer contenido HTML mediante selectores de CSS en C#.

// Inicializar un documento basado en el código preparado
HTMLDocument document = new HTMLDocument(@"D:\Files\html\input.html");

// Aquí creamos un Selector CSS que extrae todos los elementos div
var elements = document.QuerySelectorAll("div");

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

Obtenga una licencia gratis

Pruebe la API sin limitaciones de evaluación solicitando una licencia temporal gratuita.

Conclusión

En este artículo, hemos aprendido a:

  • leer y extraer el contenido de un documento HTML usando C#;
  • inspeccionar los elementos del documento y encontrar un elemento específico de HTML;
  • consulta datos específicos y extrae datos usando CSS Selector.

Además, puede obtener más información sobre Aspose.HTML para .NET API utilizando la documentación. En caso de cualquier ambigüedad, no dude en contactarnos en el foro.

Ver también