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

Giải CAPTCHA bằng Vercel Agent Browser
Cách giải CAPTCHA với Trình duyệt Agent Vercel – Hướng dẫn từng bước sử dụng CapSolver

Học cách tích hợp CapSolver với Agent Browser để xử lý CAPTCHA và xây dựng quy trình tự động hóa AI đáng tin cậy.

AI
Logo of CapSolver

Anh Tuan

18-Mar-2026

Tích hợp sCapSolver và n8n để giải quyết CAPTCHA và tự động hóa quy trình làm việc
Cách sử dụng CapSolver trong n8n: Hướng dẫn toàn diện để giải CAPTCHA trong các quy trình làm việc của bạn

Học cách tích hợp CapSolver với n8n để giải CAPTCHAs và xây dựng các quy trình tự động đáng tin cậy một cách dễ dàng.

n8n
Logo of CapSolver

Anh Tuan

18-Mar-2026

Giải các câu đố thị giác trong n8n với CapSolver
Làm thế nào để giải các câu đố thị giác trong n8n với CapSolver

Giải các CAPTCHA trực quan bằng Công cụ Vision Engine của CapSolver trong n8n. Xử lý các thanh trượt, xoay, lựa chọn đối tượng và OCR GIF ngay lập tức.

n8n
Logo of CapSolver

Anh Tuan

18-Mar-2026

Giải quyết Nhận dạng TLS trong n8n với CapSolver
Cách giải quyết tính năng nhận dạng TLS trong n8n với CapSolver

Giải quyết vấn đề nhận dạng TLS trong n8n bằng CapSolver. Làm cho các yêu cầu trông giống như trình duyệt thực tế và tránh các khối phát hiện bot.

n8n
Logo of CapSolver

Anh Tuan

18-Mar-2026

Tích hợp CapSolver với Web MCP: Hướng dẫn cho Các Đại diện Tự động
Tích hợp CapSolver với Web MCP: Hướng dẫn cho các tác nhân tự động

Nâng cao khả năng tự động hóa web của trợ lý AI của bạn. Hướng dẫn này chi tiết cách tích hợp CapSolver để giải Captcha hiệu quả trong khung Web MCP, đảm bảo các hoạt động đáng tin cậy và tuân thủ.

AI
Logo of CapSolver

Nikolai Smirnov

17-Mar-2026

Cách vượt qua Cloudflare Turnstile bằng Playwright Stealth trong quy trình AI
Làm thế nào để điều hướng Cloudflare Turnstile với Playwright Stealth trong luồng công việc AI

Khám phá cách xử lý hiệu quả Cloudflare Turnstile trong các quy trình AI bằng các kỹ thuật che giấu của Playwright và CapSolver để giải captcha đáng tin cậy. Học các chiến lược tích hợp thực tế và các phương pháp tốt nhất để tự động hóa không gián đoạn.

Cloudflare
Logo of CapSolver

Anh Tuan

17-Mar-2026