Quét web bằng C#

Web Scraping là một kỹ thuật được sử dụng để trích xuất dữ liệu từ các trang web. Nó giúp tự động hóa quá trình trích xuất dữ liệu từ các trang web và tệp HTML. Là nhà phát triển C#, chúng tôi có thể dễ dàng kiểm tra, thu thập và trích xuất dữ liệu, chẳng hạn như hình ảnh, video, âm thanh, v.v. từ các trang web. Trong bài viết này, chúng ta sẽ tìm hiểu cách thực hiện quét web bằng phân tích cú pháp HTML bằng C#.

Các chủ đề sau đây sẽ được đề cập trong bài viết này:

API quét web C#

Để thu thập dữ liệu web từ tệp HTML hoặc URL, Chúng tôi sẽ sử dụng API Aspose.HTML for .NET. Đây là API xử lý HTML nâng cao cho phép tạo, sửa đổi, trích xuất dữ liệu, chuyển đổi và hiển thị tài liệu HTML mà không cần bất kỳ phần mềm bên ngoài nào. Vui lòng tải xuống DLL của API hoặc cài đặt nó bằng NuGet.

PM> Install-Package Aspose.Html

Đọc và trích xuất HTML bằng C#

Chúng tôi có thể đọc và trích xuất HTML từ bất kỳ tài liệu HTML nào bằng cách thực hiện theo các bước dưới đây:

  1. Tải tài liệu HTML bằng lớp HTMLDocument.
  2. Hiển thị HTML bên trong của tệp lên bảng điều khiển.

Mẫu mã sau đây cho biết cách đọc và trích xuất nội dung HTML bằng C#.

// Ví dụ mã này trình bày cách hiển thị nội dung của tài liệu HTML
// Tải tài liệu HTML
var document = new HTMLDocument(@"D:\Files\html\input.html");

// Hiển thị HTML bên trong của tài liệu
Console.WriteLine(document.Body.InnerHTML);
Đọc và trích xuất HTML bằng C#.

Đọc và trích xuất HTML bằng C#.

Tương tự, chúng ta có thể đọc và trích xuất HTML từ các trang web trực tiếp như dưới đây:

// Ví dụ về mã này trình bày cách hiển thị nội dung từ URL trang web trực tiếp.
// Khởi tạo Url
Url url = new Url("https://en.wikipedia.org/wiki/HTML");

// Tải tệp HTML bằng phiên bản Url
HTMLDocument document = new HTMLDocument(url);

// Hiển thị HTML bên trong của tệp lên bảng điều khiển
Console.WriteLine(document.Body.InnerHTML);

Kiểm tra các thành phần tài liệu bằng C#

Chúng ta có thể kiểm tra tài liệu và các thành phần của nó bằng cách thực hiện theo các bước dưới đây:

  1. Tải tài liệu HTML bằng lớp HTMLDocument.
  2. Lấy phần tử HTML của tài liệu.
  3. Lấy phần tử đầu tiên/cuối cùng của phần tử HTML.
  4. Hiển thị chi tiết thành phần như TagName, TextContent.

Mẫu mã sau đây cho biết cách kiểm tra các thành phần tài liệu bằng C#.

// Ví dụ mã này trình bày cách kiểm tra các phần tử HTML.
// Tải tài liệu từ một tập tin
string documentPath = @"D:\Files\html\input.html";
HTMLDocument document = new HTMLDocument(documentPath);

// Lấy phần tử html của tài liệu
var element = document.DocumentElement;
Console.WriteLine(element.TagName); // HTML

// Lấy phần tử cuối cùng của phần tử html
element = element.LastElementChild;
Console.WriteLine(element.TagName); // BODY

// Lấy phần tử đầu tiên của phần tử cơ thể
element = element.FirstElementChild;
Console.WriteLine(element.TagName); // H1
Console.WriteLine(element.TextContent); // Header 1

Tìm phần tử cụ thể bằng bộ lọc trong C#

Chúng tôi có thể sử dụng các bộ lọc tùy chỉnh để tìm một thành phần cụ thể, chẳng hạn như lấy tất cả hình ảnh, liên kết, v.v. Với mục đích này, API cung cấp giao diện TreeWalker. Nó cho phép điều hướng cây tài liệu hoặc cây con bằng cách sử dụng chế độ xem tài liệu được xác định bởi cờ và bộ lọc whatToShow của chúng (nếu có). Chúng ta có thể tìm thấy các phần tử cụ thể bằng cách sử dụng các bộ lọc bằng cách thực hiện theo các bước dưới đây:

  1. Xác định bộ lọc bằng lớp NodeFilter và ghi đè phương thức AcceptNode().
  2. Tải tài liệu HTML bằng lớp HTMLDocument.
  3. Gọi phương thức CreateTreeWalker(). Nó lấy nút gốc, nội dung cần hiển thị và NodeFilter làm đối số.

Mẫu mã sau đây cho biết cách tìm các phần tử cụ thể bằng C#.

// Ví dụ mã này trình bày cách truy vấn dữ liệu bằng bộ lọc.
// Tải một tài liệu HTML
HTMLDocument document = new HTMLDocument(@"D:\Files\html\input.html");

// Để bắt đầu điều hướng HTML, chúng ta cần tạo một phiên bản TreeWalker.
// Các tham số được chỉ định có nghĩa là nó bắt đầu đi từ thư mục gốc của tài liệu,
// lặp lại tất cả các nút và sử dụng triển khai bộ lọc tùy chỉnh của chúng tôi
using (var iterator = document.CreateTreeWalker(document, Dom.Traversal.Filters.NodeFilter.SHOW_ALL, new OnlyImageFilter()))
{
    while (iterator.NextNode() != null)
    {
        // Vì chúng tôi đang sử dụng bộ lọc của riêng mình nên nút hiện tại sẽ luôn là một phiên bản của HTMLImageElement.
        // Vì vậy, chúng tôi không cần xác nhận bổ sung ở đây.
        var image = (HTMLImageElement)iterator.CurrentNode;

        System.Console.WriteLine(image.Src);
        // đầu ra: image1.png
        // đầu ra: image2.png
    }
}
// Ví dụ mã này trình bày cách xác định bộ lọc Nút.
class OnlyImageFilter : Aspose.Html.Dom.Traversal.Filters.NodeFilter
{
    public override short AcceptNode(Aspose.Html.Dom.Node n)
    {
        // Bộ lọc hiện tại bỏ qua tất cả các phần tử, ngoại trừ phần tử IMG.
        return string.Equals("img", n.LocalName)
            ? FILTER_ACCEPT
            : FILTER_SKIP;
    }
}

Truy vấn dữ liệu từ HTML bằng C#

Chúng ta cũng có thể sử dụng XPath Query để truy vấn dữ liệu từ tài liệu HTML bằng cách thực hiện theo các bước dưới đây:

  1. Tải tài liệu HTML bằng lớp HTMLDocument.
  2. Gọi phương thức Đánh giá(). Nó lấy chuỗi biểu thức XPath, tài liệu và loại làm đối số.
  3. Cuối cùng, lặp qua các nút kết quả và hiển thị văn bản

Mẫu mã sau đây cho biết cách truy vấn dữ liệu bằng truy vấn XPath bằng C#.

// Ví dụ mã này trình bày cách truy vấn dữ liệu bằng truy vấn XPath.
// Chuẩn bị một mã HTML
var code = @"
    <div class='happy'>
        <div>
            <span>Hello!</span>
        </div>
    </div>
    <p class='happy'>
        <span>World</span>
    </p>
";

// Khởi tạo một tài liệu dựa trên mã đã chuẩn bị
HTMLDocument document = new HTMLDocument(code, ".");

// Ở đây chúng tôi đánh giá biểu thức XPath trong đó chúng tôi chọn tất cả các phần tử SPAN con 
// từ các phần tử có thuộc tính 'class' bằng 'hạnh phúc':
var result = document.Evaluate("//*[@class='happy']//span",
    document,
    null,
    Aspose.Html.Dom.XPath.XPathResultType.Any,
    null);

// Lặp lại các nút kết quả
for (Aspose.Html.Dom.Node node; (node = result.IterateNext()) != null;)
{
    System.Console.WriteLine(node.TextContent);
    // đầu ra: Xin chào
    // đầu ra: Thế giới!
}

Trích xuất bằng CSS Selector trong C#

Chúng tôi cũng có thể trích xuất nội dung HTML bằng bộ chọn CSS. Với mục đích này, API cung cấp phương thức QuerySelectorAll() cho phép điều hướng qua tài liệu HTML và tìm kiếm các phần tử cần thiết. Nó lấy bộ chọn truy vấn làm tham số và trả về một NodeList phù hợp của tất cả các phần tử. Chúng ta có thể truy vấn bằng cách sử dụng bộ chọn CSS bằng cách thực hiện theo các bước dưới đây:

  1. Tải tài liệu HTML bằng lớp HTMLDocument.
  2. Gọi phương thức QuerySelectorAll(). Nó lấy bộ chọn truy vấn làm đối số.
  3. Cuối cùng, lặp qua danh sách các phần tử kết quả.

Mẫu mã sau đây cho biết cách trích xuất nội dung HTML bằng bộ chọn CSS trong C#.

// Khởi tạo một tài liệu dựa trên mã đã chuẩn bị
HTMLDocument document = new HTMLDocument(@"D:\Files\html\input.html");

// Ở đây chúng tôi tạo Bộ chọn CSS để trích xuất tất cả các phần tử div
var elements = document.QuerySelectorAll("div");

// Lặp lại danh sách các phần tử được kết quả
foreach (Aspose.Html.HTMLElement element in elements)
{
    System.Console.WriteLine(element.InnerHTML);
}

Nhận giấy phép miễn phí

Vui lòng dùng thử API không có giới hạn đánh giá bằng cách yêu cầu giấy phép tạm thời miễn phí.

Phần kết luận

Trong bài viết này, chúng ta đã học được cách:

  • đọc và trích xuất nội dung của tài liệu HTML bằng C#;
  • kiểm tra Thành phần Tài liệu và tìm thành phần cụ thể từ HTML;
  • dữ liệu dành riêng cho truy vấn và trích xuất dữ liệu bằng CSS Selector.

Ngoài ra, bạn có thể tìm hiểu thêm về Aspose.HTML for .NET API bằng tài liệu. Trong trường hợp có bất kỳ sự mơ hồ nào, vui lòng liên hệ với chúng tôi trên diễn đàn.

Xem thêm