CAPSOLVER
Blog
Cách sử dụng RestSharp (Thư viện C#) để trích xuất dữ liệu từ web

Cách sử dụng RestSharp (Thư viện C#) để trích xuất dữ liệu từ website

Logo of CapSolver

Anh Tuan

Data Science Expert

17-Sep-2024

Web scraping là kỹ thuật quan trọng để trích xuất dữ liệu từ các trang web, nhưng các ứng dụng web hiện đại thường triển khai các biện pháp bảo mật như CAPTCHA để ngăn chặn truy cập tự động. Các thử thách CAPTCHA, như Google reCAPTCHA, được thiết kế để phân biệt giữa người dùng và bot, khiến các kịch bản tự động gặp khó khăn trong việc trích xuất nội dung hiệu quả.

Để vượt qua những trở ngại này, các nhà phát triển có thể tận dụng các công cụ và dịch vụ đơn giản hóa các yêu cầu HTTP và xử lý việc giải quyết CAPTCHA. RestSharp là một thư viện C# mạnh mẽ và dễ sử dụng, giúp đơn giản hóa quá trình thực hiện các yêu cầu HTTP đến API RESTful. Khi kết hợp với trình phân tích cú pháp HTML như HtmlAgilityPack, nó trở thành một giải pháp mạnh mẽ cho các nhiệm vụ web scraping.

RestSharp WebScraping

Tuy nhiên, việc gặp phải CAPTCHA trong quá trình scraping có thể làm gián đoạn quy trình tự động của bạn. Đây là lúc Capsolver phát huy tác dụng. Capsolver cung cấp các giải pháp dựa trên API để giải quyết CAPTCHA theo cách lập trình, cho phép các kịch bản scraping của bạn bỏ qua những thử thách này và truy cập nội dung mong muốn một cách liền mạch.

Trong hướng dẫn toàn diện này, chúng tôi sẽ hướng dẫn bạn cách:

Web Scraping với RestSharp

Trong C#, RestSharp là một thư viện phổ biến để xử lý các yêu cầu HTTP và tương tác với API RESTful. Nó đơn giản hóa nhiều khía cạnh của giao tiếp HTTP so với HttpClient tích hợp sẵn. Bạn có thể kết hợp RestSharp với trình phân tích cú pháp HTML như HtmlAgilityPack để trích xuất dữ liệu từ các trang web.

Điều kiện tiên quyết

  • Cài đặt thư viện RestSharp bằng NuGet Package Manager:

    bash Copy
    Install-Package RestSharp
  • Cài đặt thư viện HtmlAgilityPack để giúp phân tích cú pháp nội dung HTML:

    bash Copy
    Install-Package HtmlAgilityPack
  • Cài đặt Newtonsoft.Json để xử lý các phản hồi JSON:

    bash Copy
    Install-Package Newtonsoft.Json

Ví dụ: Scraping "Quotes to Scrape"

Hãy scraping các câu trích dẫn từ trang web Quotes to Scrape bằng RestSharpHtmlAgilityPack.

csharp Copy
using System;
using System.Threading.Tasks;
using HtmlAgilityPack;
using RestSharp;

class Program
{
    static async Task Main(string[] args)
    {
        string url = "http://quotes.toscrape.com/";

        // Khởi tạo RestSharp client
        var client = new RestClient(url);

        // Tạo yêu cầu GET
        var request = new RestRequest(Method.GET);

        // Thực hiện yêu cầu
        var response = await client.ExecuteAsync(request);

        if (response.IsSuccessful)
        {
            // Phân tích cú pháp nội dung trang bằng HtmlAgilityPack
            HtmlDocument htmlDoc = new HtmlDocument();
            htmlDoc.LoadHtml(response.Content);

            // Tìm tất cả các câu trích dẫn trên trang
            var quotes = htmlDoc.DocumentNode.SelectNodes("//span[@class='text']");

            // In mỗi câu trích dẫn
            foreach (var quote in quotes)
            {
                Console.WriteLine(quote.InnerText);
            }
        }
        else
        {
            Console.WriteLine($"Không thể truy xuất trang. Mã trạng thái: {response.StatusCode}");
        }
    }
}

Giải thích:

  • RestSharp Client và Request: Khởi tạo một RestClient với URL đích và tạo một RestRequest cho phương thức GET.
  • Thực hiện yêu cầu: Gửi yêu cầu một cách bất đồng và kiểm tra xem phản hồi có thành công hay không.
  • HtmlAgilityPack: Phân tích cú pháp nội dung HTML từ phản hồi và trích xuất các câu trích dẫn bằng cách chọn các phần tử có lớp text.

Giải quyết reCAPTCHA v2 & reCAPTCHA v3 với Capsolver bằng RestSharp

Khi một trang web sử dụng reCAPTCHA v2 hoặc v3 cho mục đích bảo mật, bạn có thể giải quyết CAPTCHA bằng Capsolver API. Dưới đây là cách bạn có thể tích hợp Capsolver với RestSharp để giải quyết các thử thách reCAPTCHA.

Điều kiện tiên quyết

  • Newtonsoft.Json được sử dụng để xử lý việc phân tích cú pháp JSON từ các phản hồi của Capsolver:

    bash Copy
    Install-Package Newtonsoft.Json

Ví dụ: Giải quyết reCAPTCHA v2 với Capsolver

Trong phần này, chúng ta sẽ trình bày cách giải quyết các thử thách reCAPTCHA v2 bằng Capsolver APIRestSharp.

csharp Copy
using System;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using RestSharp;

class Program
{
    private static readonly string apiUrl = "https://api.capsolver.com";
    private static readonly string clientKey = "YOUR_API_KEY"; // Thay thế bằng Khóa API Capsolver của bạn

    static async Task Main(string[] args)
    {
        try
        {
            // Bước 1: Tạo nhiệm vụ để giải quyết reCAPTCHA v2
            string taskId = await CreateTask();
            Console.WriteLine("ID nhiệm vụ: " + taskId);

            // Bước 2: Truy xuất kết quả của nhiệm vụ
            string taskResult = await GetTaskResult(taskId);
            Console.WriteLine("Kết quả nhiệm vụ (Mã thông báo CAPTCHA): " + taskResult);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Lỗi: " + ex.Message);
        }
    }

    // Phương thức để tạo một nhiệm vụ giải quyết CAPTCHA mới
    private static async Task<string> CreateTask()
    {
        // Khởi tạo RestSharp client
        var client = new RestClient(apiUrl);

        // Gói dữ liệu yêu cầu
        var requestBody = new
        {
            clientKey = clientKey,
            task = new
            {
                type = "ReCaptchaV2TaskProxyLess", // Loại nhiệm vụ cho reCAPTCHA v2 không sử dụng proxy
                websiteURL = "https://www.example.com", // URL trang web để giải quyết CAPTCHA
                websiteKey = "SITE_KEY_HERE" // Khóa trang web reCAPTCHA
            }
        };

        // Tạo yêu cầu POST
        var request = new RestRequest("createTask", Method.POST);
        request.AddJsonBody(requestBody);

        // Thực hiện yêu cầu
        var response = await client.ExecuteAsync(request);

        if (!response.IsSuccessful)
        {
            throw new Exception("Không thể tạo nhiệm vụ: " + response.Content);
        }

        JObject jsonResponse = JObject.Parse(response.Content);
        if (jsonResponse["errorId"].ToString() != "0")
        {
            throw new Exception("Lỗi tạo nhiệm vụ: " + jsonResponse["errorDescription"]);
        }

        // Trả về ID nhiệm vụ để sử dụng trong bước tiếp theo
        return jsonResponse["taskId"].ToString();
    }

    // Phương thức để truy xuất kết quả của một nhiệm vụ giải quyết CAPTCHA
    private static async Task<string> GetTaskResult(string taskId)
    {
        // Khởi tạo RestSharp client
        var client = new RestClient(apiUrl);

        // Gói dữ liệu yêu cầu
        var requestBody = new
        {
            clientKey = clientKey,
            taskId = taskId
        };

        // Tạo yêu cầu POST
        var request = new RestRequest("getTaskResult", Method.POST);
        request.AddJsonBody(requestBody);

        // Luôn kiểm tra kết quả của nhiệm vụ mỗi 5 giây
        while (true)
        {
            var response = await client.ExecuteAsync(request);

            if (!response.IsSuccessful)
            {
                throw new Exception("Không thể lấy kết quả nhiệm vụ: " + response.Content);
            }

            JObject jsonResponse = JObject.Parse(response.Content);
            if (jsonResponse["errorId"].ToString() != "0")
            {
                throw new Exception("Lỗi lấy kết quả nhiệm vụ: " + jsonResponse["errorDescription"]);
            }

            // Nếu nhiệm vụ đã sẵn sàng, trả về mã thông báo CAPTCHA
            if (jsonResponse["status"].ToString() == "ready")
            {
                return jsonResponse["solution"]["gRecaptchaResponse"].ToString();
            }

            // Chờ 5 giây trước khi kiểm tra lại
            Console.WriteLine("Nhiệm vụ vẫn đang xử lý, chờ 5 giây...");
            await Task.Delay(5000);
        }
    }
}

Giải thích:

  1. Phương thức CreateTask:

    • RestSharp Client và Request: Khởi tạo một RestClient và tạo một RestRequest cho điểm cuối createTask với phương thức POST.
    • Gói dữ liệu yêu cầu: Thiết lập các tham số cần thiết bao gồm clientKey, websiteURL, websiteKey, và chỉ định loại nhiệm vụ là ReCaptchaV2TaskProxyLess.
    • Thực hiện: Gửi yêu cầu và phân tích cú pháp phản hồi để truy xuất taskId.
  2. Phương thức GetTaskResult:

    • RestSharp Client và Request: Khởi tạo một RestClient và tạo một RestRequest cho điểm cuối getTaskResult với phương thức POST.
    • Kiểm tra: Luôn kiểm tra trạng thái của nhiệm vụ mỗi 5 giây cho đến khi hoàn thành (status: ready).
    • Truy xuất kết quả: Khi nhiệm vụ đã sẵn sàng, nó sẽ trích xuất gRecaptchaResponse, có thể được sử dụng để bỏ qua CAPTCHA.

Ví dụ: Giải quyết reCAPTCHA v3 với Capsolver

Trong phần này, chúng ta sẽ trình bày cách giải quyết các thử thách reCAPTCHA v3 bằng Capsolver APIRestSharp.

csharp Copy
using System;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using RestSharp;

class Program
{
    private static readonly string apiUrl = "https://api.capsolver.com";
    private static readonly string clientKey = "YOUR_API_KEY"; // Thay thế bằng Khóa API Capsolver của bạn

    static async Task Main(string[] args)
    {
        try
        {
            // Bước 1: Tạo nhiệm vụ để giải quyết reCAPTCHA v3
            string taskId = await CreateTask();
            Console.WriteLine("ID nhiệm vụ: " + taskId);

            // Bước 2: Truy xuất kết quả của nhiệm vụ
            string taskResult = await GetTaskResult(taskId);
            Console.WriteLine("Kết quả nhiệm vụ (Mã thông báo CAPTCHA): " + taskResult);
        }
        catch (Exception ex)
        {
            Console.WriteLine("Lỗi: " + ex.Message);
        }
    }

    // Phương thức để tạo một nhiệm vụ giải quyết CAPTCHA mới
    private static async Task<string> CreateTask()
    {
        // Khởi tạo RestSharp client
        var client = new RestClient(apiUrl);

        // Gói dữ liệu yêu cầu
        var requestBody = new
        {
            clientKey = clientKey,
            task = new
            {
                type = "ReCaptchaV3TaskProxyLess", // Loại nhiệm vụ cho reCAPTCHA v3 không sử dụng proxy
                websiteURL = "https://www.example.com", // URL trang web để giải quyết CAPTCHA
                websiteKey = "SITE_KEY_HERE", // Khóa trang web reCAPTCHA
                minScore = 0.3, // Điểm tối thiểu mong muốn
                pageAction = "your_action" // Tên hành động được định nghĩa trên trang web
            }
        };

        // Tạo yêu cầu POST
        var request = new RestRequest("createTask", Method.POST);
        request.AddJsonBody(requestBody);

        // Thực hiện yêu cầu
        var response = await client.ExecuteAsync(request);

        if (!response.IsSuccessful)
        {
            throw new Exception("Không thể tạo nhiệm vụ: " + response.Content);
        }

        JObject jsonResponse = JObject.Parse(response.Content);
        if (jsonResponse["errorId"].ToString() != "0")
        {
            throw new Exception("Lỗi tạo nhiệm vụ: " + jsonResponse["errorDescription"]);
        }

        // Trả về ID nhiệm vụ để sử dụng trong bước tiếp theo
        return jsonResponse["taskId"].ToString();
    }

    // Phương thức để truy xuất kết quả của một nhiệm vụ giải quyết CAPTCHA
    private static async Task<string> GetTaskResult(string taskId)
    {
        // Khởi tạo RestSharp client
        var client = new RestClient(apiUrl);

        // Gói dữ liệu yêu cầu
        var requestBody = new
        {
            clientKey = clientKey,
            taskId = taskId
        };

        // Tạo yêu cầu POST
        var request = new RestRequest("getTaskResult", Method.POST);
        request.AddJsonBody(requestBody);

        // Luôn kiểm tra kết quả của nhiệm vụ mỗi 5 giây
        while (true)
        {
            var response = await client.ExecuteAsync(request);

            if (!response.IsSuccessful)
            {
                throw new Exception("Không thể lấy kết quả nhiệm vụ: " + response.Content);
            }

            JObject jsonResponse = JObject.Parse(response.Content);
            if (jsonResponse["errorId"].ToString() != "0")
            {
                throw new Exception("Lỗi lấy kết quả nhiệm vụ: " + jsonResponse["errorDescription"]);
            }

            // Nếu nhiệm vụ đã sẵn sàng, trả về mã thông báo CAPTCHA
            if (jsonResponse["status"].ToString() == "ready")
            {
                return jsonResponse["solution"]["gRecaptchaResponse"].ToString();
            }

            // Chờ 5 giây trước khi kiểm tra lại
            Console.WriteLine("Nhiệm vụ vẫn đang xử lý, chờ 5 giây...");
            await Task.Delay(5000);
        }
    }
}

Giải thích:

  1. Phương thức CreateTask:

    • RestSharp Client và Request: Thiết lập một RestClientRestRequest cho điểm cuối createTask.
    • Gói dữ liệu yêu cầu: Bao gồm các tham số bổ sung như minScorepageAction dành riêng cho reCAPTCHA v3.
    • Thực hiện: Gửi yêu cầu và truy xuất taskId.
  2. Phương thức GetTaskResult:

    • Tương tự như ví dụ v2, nó luôn kiểm tra Capsolver API để tìm kết quả của nhiệm vụ và truy xuất mã thông báo CAPTCHA khi nhiệm vụ đã sẵn sàng.

Các thực hành tốt nhất về Web Scraping trong C#

Khi sử dụng các công cụ web scraping trong C#, luôn tuân theo các thực hành tốt nhất này:

  • Tôn trọng robots.txt: Đảm bảo rằng trang web cho phép web scraping bằng cách kiểm tra tệp robots.txt.
  • Hạn chế tốc độ: Tránh thực hiện quá nhiều yêu cầu trong một khoảng thời gian ngắn để ngăn chặn bị chặn bởi trang web.
  • Luân phiên proxy: Sử dụng proxy để phân phối các yêu cầu qua nhiều IP để tránh bị gắn nhãn là bot.
  • Giả mạo tiêu đề: Mô phỏng các yêu cầu giống như trình duyệt bằng cách thêm tiêu đề tùy chỉnh, chẳng hạn như User-Agent, vào các yêu cầu HTTP của bạn.

Kết luận

Bằng cách sử dụng RestSharp cho web scraping và Capsolver để giải quyết CAPTCHA, bạn có thể tự động hóa hiệu quả các tương tác với các trang web sử dụng CAPTCHA. Luôn đảm bảo rằng các hoạt động web scraping của bạn tuân thủ các điều khoản dịch vụ và yêu cầu pháp lý của trang web đích.

Chúc bạn scraping vui vẻ!


Tuyên bố Tuân thủ: Thông tin được cung cấp trên blog này chỉ mang tính chất tham khảo. CapSolver cam kết tuân thủ tất cả các luật và quy định hiện hành. Việc sử dụng mạng lưới CapSolver cho các hoạt động bất hợp pháp, gian lận hoặc lạm dụng là hoàn toàn bị cấm và sẽ bị điều tra. Các giải pháp giải captcha của chúng tôi nâng cao trải nghiệm người dùng trong khi đảm bảo tuân thủ 100% trong việc giúp giải quyết các khó khăn về captcha trong quá trình thu thập dữ liệu công khai. Chúng tôi khuyến khích việc sử dụng dịch vụ của chúng tôi một cách có trách nhiệm. Để biết thêm thông tin, vui lòng truy cập Điều khoản Dịch vụ và Chính sách Quyền riêng tư.

Thêm

phần mở rộng tốt nhất để giải CAPTCHA 2026
Tiện ích tốt nhất để giải CAPTCHA 2026 là gì?

Trong thế giới an ninh trực tuyến không ngừng phát triển, các thách thức CAPTCHA đã trở thành rào cản phổ biến đối với người dùng internet...

Extension
Logo of CapSolver

Ethan Collins

12-Dec-2025

Đăng nhập Gen
Genlogin: Đổi mới Trải nghiệm Tự động hóa Web

Trong bài viết này, chúng tôi sẽ giới thiệu cho bạn Genlogin là gì và các dịch vụ mà họ cung cấp.

Partners
Logo of CapSolver

Rajinder Singh

12-Dec-2025

ProxysIO
Proxys.io: Proxy riêng lẻ cho bất kỳ nhiệm vụ nào

Trong bài viết này, chúng tôi sẽ giới thiệu cho bạn Proxys.io là gì và các dịch vụ mà họ cung cấp.

Partners
Logo of CapSolver

Lucas Mitchell

12-Dec-2025

Tabproxy
Tabproxy: Dịch vụ proxy nhà ở giá trị tốt cho khu vực nước ngoài

Trong bài viết này, chúng tôi sẽ giới thiệu cho bạn Tabproxy là gì và các dịch vụ mà họ cung cấp.

web scraping
Logo of CapSolver

Anh Tuan

12-Dec-2025

IP2Thế giới
IP2World Proxy Nhà Ở: Giải pháp IP proxy toàn cầu hàng đầu

Trong bài viết này, chúng tôi sẽ giới thiệu cho bạn IP2World là gì và các dịch vụ mà họ cung cấp.

Partners
Logo of CapSolver

Ethan Collins

12-Dec-2025

lỗi trích xuất dữ liệu từ web
Các lỗi 402, 403, 404 và 429 là gì trong việc quét web? Hướng dẫn toàn diện

Nắm vững xử lý lỗi quét web bằng cách hiểu các lỗi 402, 403, 404 và 429. Học cách sửa lỗi 403 Cấm, triển khai giải pháp xử lý lỗi 429 và xử lý mã trạng thái 402 Yêu cầu thanh toán mới xuất hiện.

web scraping
Logo of CapSolver

Lucas Mitchell

12-Dec-2025