
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:
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.
Install-Package HtmlAgilityPack
Install-Package Newtonsoft.Json
Hãy scraping các câu trích dẫn từ trang web Quotes to Scrape bằng HttpClient và HtmlAgilityPack.
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}");
}
}
}
text.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.
Install-Package Newtonsoft.Json
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.
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);
}
}
}
}
Phương thức CreateTask:
/createTask của Capsolver để tạo một nhiệm vụ mới để giải quyết thách thức reCAPTCHA v2.clientKey, websiteURL, websiteKey, và xác định loại nhiệm vụ là ReCaptchaV2TaskProxyLess.taskId, được sử dụng để truy xuất kết quả của nhiệm vụ.Phương thức GetTaskResult:
/getTaskResult để kiểm tra kết quả của nhiệm vụ được tạo trước đó.status: ready).gRecaptchaResponse, được sử dụng để bỏ qua CAPTCHA.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.
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);
}
}
}
}
Phương thức CreateTask:
/createTask của Capsolver để tạo một nhiệm vụ mới để giải quyết thách thức reCAPTCHA v3.clientKey, websiteURL, websiteKey, và xác định loại nhiệm vụ là ReCaptchaV3TaskProxyLess.taskId, được sử dụng để truy xuất kết quả của nhiệm vụ.Phương thức GetTaskResult:
/getTaskResult để kiểm tra kết quả của nhiệm vụ được tạo trước đó.status: ready).gRecaptchaResponse, được sử dụng để bỏ qua CAPTCHA.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:
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.User-Agent, vào các yêu cầu HTTP của bạ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#.
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ế.

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.
