網絡爬蟲 C#

網頁抓取,也稱為網頁爬行、網頁收集或數據抓取,用於從網站中提取數據。網絡抓取工具使用不同的數據選擇器,如 CSS 選擇器、XPath 或兩者兼而有之,以便從網頁中提取數據。這兩個選擇器都可以有效地從網絡上收集和分析信息。本文介紹瞭如何在 C# 中創建網絡抓取工具,特別是有關 HTML 導航、XPath 查詢和 CSS 選擇器的信息。

C# Web 抓取庫配置

Aspose.HTML for .NET 是一個網絡抓取庫,可以通過從 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 查詢進行 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 選擇器進行 Web 抓取

您可以創建一個搜索模式來匹配基於 CSS 選擇器語法的文檔樹中的元素。下面的代碼片段解釋瞭如何在 C# 中使用 CSS Selector 執行網頁抓取:

// 準備 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# 網絡抓取庫 Aspose.HTML for .NET,其中包括在 C# 中創建網絡抓取器的多種方法。它討論了 HTML 導航、XPath 查詢以及 CSS 選擇器方法來實現您的要求。但是,如果您需要討論您的任何疑慮或問題,請在 論壇 上寫信給我們。

也可以看看