网络爬虫 C#

Web Scraping,也称为网络爬虫、网络收获或数据抓取,用于从网站中提取数据。网络爬虫使用不同的数据选择器,如 CSS 选择器、XPath 或两者兼而有之,以便从网页中提取数据。这两种选择器对于收集和分析来自网络的信息都很有效。本文介绍如何使用 C# 创建 Web 抓取工具,特别是有关 HTML 导航、XPath 查询和 CSS 选择器的信息。

C# Web 抓取库配置

Aspose.HTML for .NET 是一个 Web 抓取库,可以通过从 New Releases 部分下载参考 DLL 文件或运行以下 NuGet 安装命令轻松配置:

PM> Install-Package Aspose.Html

在 C# 中使用 HTML 导航进行网页抓取

您可以使用 Node 类的不同属性来导航 HTML 文档。下面的代码片段解释了如何在 C# 中导航 HTML 网页:

// 准备 HTML 代码
var html_code = "<span>Hello</span> <span>World!</span>";

// 从准备好的代码初始化一个文档
using (var document = new Aspose.Html.HTMLDocument(html_code, "."))
{
    // 获取对 BODY 的第一个孩子(第一个 SPAN)的引用
    var element = document.Body.FirstChild;
    Console.WriteLine(element.TextContent); // output: Hello

    // 获取对html元素之间空白的引用
    element = element.NextSibling;
    Console.WriteLine(element.TextContent); // output: ' '

    // 获取对第二个 SPAN 元素的引用
    element = element.NextSibling;
    Console.WriteLine(element.TextContent); // output: World!
}

检查 HTML 文档及其元素

该 API 还提供了元素遍历功能的通用用法。以下代码片段演示了如何对 API 的不同元素进行详细检查。

//从文件加载文档
string documentPath = System.IO.Path.Combine(DataDir, "html_file.html");

// 在本地文件系统中指定源 HTML 文件的路径
using (var document = new Aspose.Html.HTMLDocument(documentPath))
{
    // 获取文档的html元素
    var element = document.DocumentElement;                
    Console.WriteLine(element.TagName); // HTML
    
    // 获取html元素的最后一个元素
    element = element.LastElementChild;
    Console.WriteLine(element.TagName); // BODY
    
    // 获取body元素的第一个元素
    element = element.FirstElementChild;
    Console.WriteLine(element.TagName); // H1
    Console.WriteLine(element.TextContent); // Header 1     
}

C# 中 Web Scraper 的自定义过滤器用法

您可以使用 ITreeWalkerINodeIterator 接口对象以及自定义过滤器实现来实现自定义过滤器。以下代码片段说明了如何遵循该过程:

class OnlyImageFilter : Aspose.Html.Dom.Traversal.Filters.NodeFilter
{
    public override short AcceptNode(Aspose.Html.Dom.Node n)
    {
        // 当前过滤器会跳过除 IMG 元素之外的所有元素。
        return string.Equals("img", n.LocalName)
            ? FILTER_ACCEPT
            : FILTER_SKIP;
    }
}

实现自定义过滤器后,您可以使用以下代码快速导航网页:

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

// 根据准备好的代码初始化一个文档
using (var document = new Aspose.Html.HTMLDocument(code, "."))
{
    // 要启动 HTML 导航,我们需要创建一个 TreeWalker 实例。
    // 指定的参数意味着它从文档的根开始遍历,遍历所有节点并使用我们自定义的过滤器实现
    using (var iterator = document.CreateTreeWalker(document, Aspose.Html.Dom.Traversal.Filters.NodeFilter.SHOW_ALL, new OnlyImageFilter()))
    {         
        while (iterator.NextNode() != null)
        {
            // 由于我们使用的是我们自己的过滤器,因此当前节点将始终是 HTMLImageElement 的一个实例。
            // 所以,我们在这里不需要额外的验证。
            var image = (Aspose.Html.HTMLImageElement)iterator.CurrentNode;

            System.Console.WriteLine(image.Src);
            // 输出:image1.png
            // 输出:image2.png
        }
    }
}

在 C# 中使用 XPath 查询进行 Web 抓取

XPath 可用于从 HTML 文档中提取数据。以下代码片段详细说明了如何在 C# 中使用 XPath Query 进行 Web 抓取:

// 准备 HTML 代码
var code = @"
    <div class='happy'>
        <div>
            <span>Hello!</span>
        </div>
    </div>
    <p class='happy'>
        <span>World</span>
    </p>
";

// 根据准备好的代码初始化一个文档
using (var document = new Aspose.Html.HTMLDocument(code, "."))
{
    // 在这里,我们评估 XPath 表达式,我们从“class”属性等于“happy”的元素中选择所有子 SPAN 元素:
    var result = document.Evaluate("//*[@class='happy']//span",
        document,
        null,
        Aspose.Html.Dom.XPath.XPathResultType.Any,
        null);

    // 迭代结果节点
   for (Aspose.Html.Dom.Node node; (node = result.IterateNext()) != null;)
    {
        System.Console.WriteLine(node.TextContent);
        // 输出:你好
        // 输出:世界!
    }
}

在 C# 中使用 CSS 选择器进行网页抓取

您可以根据 CSS 选择器语法创建搜索模式来匹配文档树中的元素。下面的代码片段解释了如何在 C# 中使用 CSS 选择器执行网页抓取:

// 准备 HTML 代码
var code = @"
    <div class='happy'>
        <div>
            <span>Hello</span>
        </div>
    </div>
    <p class='happy'>
        <span>World!</span>
    </p>
";

// 根据准备好的代码初始化一个文档
using (var document = new Aspose.Html.HTMLDocument(code, "."))
{
    // 在这里,我们创建了一个 CSS 选择器,用于提取所有 'class' 属性等于 'happy' 的元素及其子 SPAN 元素
    var elements = document.QuerySelectorAll(".happy span");

    // 迭代结果的元素列表
    foreach (Aspose.Html.HTMLElement element in elements)
    {
        System.Console.WriteLine(element.InnerHTML);
        // 输出:你好
        // 输出:世界!
    }
}

获得免费许可证

您可以申请 免费临时许可证 来评估 API 的全部功能。

结论

在本文中,您了解了 C# Web 抓取库 Aspose.HTML for .NET,其中包括几种在 C# 中创建 Web 抓取器的方法。它讨论了 HTML 导航、XPath 查询以及 CSS 选择器方法来实现您的要求。但是,如果您需要讨论您的任何疑虑或问题,请在 论坛 上给我们写信。

也可以看看