
Anh Tuan
Data Science Expert

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.

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:
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.
Cài đặt thư viện RestSharp bằng NuGet Package Manager:
Install-Package RestSharp
Cài đặt thư viện HtmlAgilityPack để giúp phân tích cú pháp nội dung HTML:
Install-Package HtmlAgilityPack
Cài đặt Newtonsoft.Json để xử lý các phản hồi JSON:
Install-Package Newtonsoft.Json
Hãy scraping các câu trích dẫn từ trang web Quotes to Scrape bằng RestSharp và HtmlAgilityPack.
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}");
}
}
}
RestClient với URL đích và tạo một RestRequest cho phương thức GET.text.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.
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:
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ử thách reCAPTCHA v2 bằng Capsolver API và RestSharp.
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);
}
}
}
Phương thức CreateTask:
RestClient và tạo một RestRequest cho điểm cuối createTask với phương thức POST.clientKey, websiteURL, websiteKey, và chỉ định loại nhiệm vụ là ReCaptchaV2TaskProxyLess.taskId.Phương thức GetTaskResult:
RestClient và tạo một RestRequest cho điểm cuối getTaskResult với phương thức POST.status: ready).gRecaptchaResponse, có thể đượ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ử thách reCAPTCHA v3 bằng Capsolver API và RestSharp.
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);
}
}
}
Phương thức CreateTask:
RestClient và RestRequest cho điểm cuối createTask.minScore và pageAction dành riêng cho reCAPTCHA v3.taskId.Phương thức GetTaskResult:
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:
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.User-Agent, vào các yêu cầu HTTP của bạ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ẻ!
Hướng dẫn Captcha cho quy trình dữ liệu được phê duyệt: học về các loại thách thức, xử lý API, tính nhất quán của proxy, lần thử lại và sử dụng có trách nhiệm.

API giải CAPTCHA nhanh chóng dành cho tự động hóa: so sánh quy trình token, các thách thức được hỗ trợ, kiểm tra độ trễ và tích hợp CapSolver có trách nhiệm.
