• Giá cả
Bắt đầu ngay

© 2026 CapSolver. All rights reserved.

Liên hệ chúng tôi

Slack: lola@capsolver.com

Sản phẩm

  • reCAPTCHA v2
  • reCAPTCHA v3
  • Cloudflare Turnstile
  • Cloudflare Challenge
  • AWS WAF
  • Tiện ích trình duyệt
  • Thêm nhiều loại CAPTCHA

Tích hợp

  • Selenium
  • Playwright
  • Puppeteer
  • n8n
  • Đối tác
  • Xem tất cả tích hợp

Tài nguyên

  • Chương trình giới thiệu
  • Tài liệu
  • Tham chiếu API
  • Blog
  • Câu hỏi thường gặp
  • Thuật ngữ
  • Trạng thái

Pháp lý

  • Điều khoản dịch vụ
  • Chính sách bảo mật
  • Chính sách hoàn tiền
  • Không bán thông tin cá nhân của tôi
Blog/All/Cách sử dụng HttpClient (Thư viện C#) để trích xuất dữ liệu từ website
Sep16, 2024

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

Anh Tuan

Anh Tuan

Data Science Expert

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:

  • Scraping các trang web bằng C# HttpClient và HtmlAgilityPack.
  • Giải quyết các thách thức reCAPTCHA bằng Capsolver API.

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 HttpClient và HtmlAgilityPack.

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 API và HttpClient.

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 API và HttpClient.

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#.

Xem thêm

May 08, 2026

ReCAPTCHA trong Trích xuất Dữ liệu Thương mại Điện tử: Hướng dẫn Tuân thủ Đầu tiên

Học cách xử lý recaptcha trong quét dữ liệu thương mại điện tử với quy trình tuân thủ, phân tích chẩn đoán, ví dụ từ CapSolver và các biện pháp kiểm soát rủi ro thực tế.

Anh Tuan
Anh Tuan
May 08, 2026

Cách AI trích xuất dữ liệu hoạt động: Giải CAPTCHA, Xử lý LLM và Quy trình dữ liệu web có cấu trúc

Học cách hoạt động của việc trích xuất dữ liệu được hỗ trợ bởi AI từ việc quét web và giải CAPTCHA đến dọn dẹp HTML, phân tích LLM và tạo JSON có cấu trúc. Khám phá các chiến lược tránh bot, các khung khai thác ngữ nghĩa như AXE, và các luồng trích xuất web AI có thể mở rộng.

Anh Tuan

Nội dung

Anh Tuan
May 07, 2026

Các khung công cụ AI tốt nhất dành cho tự động hóa web và giải CAPTCHA

So sánh các khung phần mềm đại diện AI tốt nhất cho tự động hóa web, giải CAPTCHA, tuân thủ và quy trình làm việc của đại diện sẵn sàng sản xuất vào năm 2026.

Anh Tuan
Anh Tuan
May 07, 2026

Những thư viện Java tốt nhất để trích xuất dữ liệu web đáng tin cậy

So sánh các thư viện quét trang web Java tốt nhất, bao gồm jsoup, Selenium, Playwright cho Java, HtmlUnit, Apache Nutch và các tùy chọn API.

Anh Tuan
Anh Tuan