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

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

Logo of CapSolver

Anh Tuan

Data Science Expert

13-Sep-2024

Thách thức CAPTCHA, chẳng hạn như Google reCAPTCHA, thường được sử dụng bởi các trang web để chặn bot và ngăn chặn quyền truy cập tự động vào nội dung của họ. Để bỏ qua các thách thức đó theo cách lập trình, bạn có thể sử dụng các dịch vụ như Capsolver, dịch vụ cung cấp các giải pháp dựa trên API để giải quyết những CAPTCHA này.

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

Web Scraping với C# HttpClient

Trong C#, lớp HttpClient thường được sử dụng để gửi yêu cầu HTTP và nhận phản hồi từ các trang web. Bạn có thể kết hợp điều này 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 HtmlAgilityPack bằng NuGet Package Manager để trợ 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ý 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 HttpClientHtmlAgilityPack.

csharp Copy
using System;
using System.Net.Http;
using System.Threading.Tasks;
using HtmlAgilityPack;

class Program
{
    private static readonly HttpClient client = new HttpClient();

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

        // Gửi yêu cầu GET đến trang
        HttpResponseMessage response = await client.GetAsync(url);

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

            // 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 ra 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:

  • HttpClient: Gửi yêu cầu GET đến trang web.
  • HtmlAgilityPack: Phân tích cú pháp nội dung HTML 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 v3 & reCaptcha v2 với Capsolver bằng HttpClient

Khi một trang web sử dụng reCAPTCHA v3 & reCaptcha v2 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 HttpClient để giải quyết các thách thức reCAPTCHA.

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

  • Newtonsoft.Json được sử dụng để xử lý phân tích cú pháp JSON từ phản hồi 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ách thức reCAPTCHA v2 bằng Capsolver APIHttpClient.

csharp Copy
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;

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 một 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()
    {
        using (HttpClient client = new HttpClient())
        {
            // Tải trọng yêu cầu
            var requestBody = new
            {
                clientKey = clientKey,
                task = new
                {
                    type = "ReCaptchaV2TaskProxyLess", // Loại nhiệm vụ cho reCAPTCHA v3 mà không cần proxy
                    websiteURL = "", // URL của trang web để giải quyết CAPTCHA cho
                    websiteKey = "" // Khóa trang web reCAPTCHA
                }
            };

            // Gửi yêu cầu để tạo nhiệm vụ
            var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");
            HttpResponseMessage response = await client.PostAsync($"{apiUrl}/createTask", content);
            string responseContent = await response.Content.ReadAsStringAsync();

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

            JObject jsonResponse = JObject.Parse(responseContent);
            if (jsonResponse["errorId"].ToString() != "0")
            {
                throw new Exception("Lỗi khi 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)
    {
        using (HttpClient client = new HttpClient())
        {
            // Tải trọng yêu cầu
            var requestBody = new
            {
                clientKey = clientKey,
                taskId = taskId
            };

            var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");

            // Kiểm tra kết quả của nhiệm vụ cứ sau 5 giây
            while (true)
            {
                HttpResponseMessage response = await client.PostAsync($"{apiUrl}/getTaskResult", content);
                string responseContent = await response.Content.ReadAsStringAsync();

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

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

                // Nếu nhiệm vụ đã sẵn sàng, hãy 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:

    • Phương thức này gửi yêu cầu POST đến điểm cuối /createTask của Capsolver để tạo một nhiệm vụ mới để giải quyết thách thức reCAPTCHA v2.
    • Yêu cầu bao gồm clientKey, websiteURL, websiteKey, và xác định loại nhiệm vụ là ReCaptchaV2TaskProxyLess.
    • Phương thức trả về một taskId, được sử dụng để truy xuất kết quả của nhiệm vụ.
  2. Phương thức GetTaskResult:

    • Phương thức này gửi yêu cầu POST đến điểm cuối /getTaskResult để kiểm tra kết quả của nhiệm vụ được tạo trước đó.
    • Nó liên tục kiểm tra trạng thái của nhiệm vụ cứ sau 5 giây cho đến khi nhiệm vụ hoàn thành (status: ready).
    • Khi nhiệm vụ đã sẵn sàng, nó trả về gRecaptchaResponse, đượ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ách thức reCAPTCHA v3 bằng Capsolver APIHttpClient.

csharp Copy
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;

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 một 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()
    {
        using (HttpClient client = new HttpClient())
        {
            // Tải trọng yêu cầu
            var requestBody = new
            {
                clientKey = clientKey,
                task = new
                {
                    type = "ReCaptchaV3TaskProxyLess", // Loại nhiệm vụ cho reCAPTCHA v3 mà không cần proxy
                    websiteURL = "", // URL của trang web để giải quyết CAPTCHA cho
                    websiteKey = "" // Khóa trang web reCAPTCHA
                }
            };

            // Gửi yêu cầu để tạo nhiệm vụ
            var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");
            HttpResponseMessage response = await client.PostAsync($"{apiUrl}/createTask", content);
            string responseContent = await response.Content.ReadAsStringAsync();

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

            JObject jsonResponse = JObject.Parse(responseContent);
            if (jsonResponse["errorId"].ToString() != "0")
            {
                throw new Exception("Lỗi khi 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)
    {
        using (HttpClient client = new HttpClient())
        {
            // Tải trọng yêu cầu
            var requestBody = new
            {
                clientKey = clientKey,
                taskId = taskId
            };

            var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");

            // Kiểm tra kết quả của nhiệm vụ cứ sau 5 giây
            while (true)
            {
                HttpResponseMessage response = await client.PostAsync($"{apiUrl}/getTaskResult", content);
                string responseContent = await response.Content.ReadAsStringAsync();

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

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

                // Nếu nhiệm vụ đã sẵn sàng, hãy 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:

    • Phương thức này gửi yêu cầu POST đến điểm cuối /createTask của Capsolver để tạo một nhiệm vụ mới để giải quyết thách thức reCAPTCHA v3.
    • Yêu cầu bao gồm clientKey, websiteURL, websiteKey, và xác định loại nhiệm vụ là ReCaptchaV3TaskProxyLess.
    • Phương thức trả về một taskId, được sử dụng để truy xuất kết quả của nhiệm vụ.
  2. Phương thức GetTaskResult:

    • Phương thức này gửi yêu cầu POST đến điểm cuối /getTaskResult để kiểm tra kết quả của nhiệm vụ được tạo trước đó.
    • Nó liên tục kiểm tra trạng thái của nhiệm vụ cứ sau 5 giây cho đến khi nhiệm vụ hoàn thành (status: ready).
    • Khi nhiệm vụ đã sẵn sàng, nó trả về gRecaptchaResponse, được sử dụng để bỏ qua CAPTCHA.

Luyện tập tốt nhất về Web Scraping trong C#

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

  • Tôn trọng robots.txt: Đảm bảo rằng trang web cho phép scraping web bằng cách kiểm tra tệp robots.txt.
  • Hạn chế tỷ lệ: Tránh thực hiện quá nhiều yêu cầu trong một khoảng thời gian ngắn để tránh 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 trên nhiều IP để tránh bị đánh dấu 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 HttpClient để scraping web 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 thách thức CAPTCHA. Luôn đảm bảo rằng các hoạt động scraping web 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 mục tiêu.

Chúc bạn scraping vui vẻ!


Hướng dẫn này tích hợp scraping web bằng HtmlAgilityPack và trình bày cách xử lý các thách thức reCAPTCHA với Capsolver, chỉ sử dụng HttpClient trong C#.

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