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

Anh Tuan
Data Science Expert
17-Sep-2024

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:
- Scraping các trang web bằng RestSharp và HtmlAgilityPack.
- Giải quyết các thử thách reCAPTCHA bằng Capsolver API.
Web Scraping với RestSharp
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.
Điều kiện tiên quyết
-
Cài đặt thư viện RestSharp bằng NuGet Package Manager:
bashInstall-Package RestSharp -
Cài đặt thư viện HtmlAgilityPack để giúp phân tích cú pháp nội dung HTML:
bashInstall-Package HtmlAgilityPack -
Cài đặt Newtonsoft.Json để xử lý các phản hồi JSON:
bashInstall-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 RestSharp và HtmlAgilityPack.
csharp
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}");
}
}
}
Giải thích:
- RestSharp Client và Request: Khởi tạo một
RestClientvới URL đích và tạo mộtRestRequestcho phương thức GET. - Thực hiện yêu cầu: Gửi yêu cầu một cách bất đồng và kiểm tra xem phản hồi có thành công hay không.
- HtmlAgilityPack: Phân tích cú pháp nội dung HTML từ phản hồi 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 v2 & reCAPTCHA v3 với Capsolver bằng RestSharp
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.
Điều kiện tiên quyết
-
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:
bashInstall-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ử thách reCAPTCHA v2 bằng Capsolver API và RestSharp.
csharp
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);
}
}
}
Giải thích:
-
Phương thức CreateTask:
- RestSharp Client và Request: Khởi tạo một
RestClientvà tạo mộtRestRequestcho điểm cuốicreateTaskvới phương thức POST. - Gói dữ liệu yêu cầu: Thiết lập các tham số cần thiết bao gồm
clientKey,websiteURL,websiteKey, và chỉ định loại nhiệm vụ làReCaptchaV2TaskProxyLess. - Thực hiện: Gửi yêu cầu và phân tích cú pháp phản hồi để truy xuất
taskId.
- RestSharp Client và Request: Khởi tạo một
-
Phương thức GetTaskResult:
- RestSharp Client và Request: Khởi tạo một
RestClientvà tạo mộtRestRequestcho điểm cuốigetTaskResultvới phương thức POST. - Kiểm tra: Luôn kiểm tra trạng thái của nhiệm vụ mỗi 5 giây cho đến khi hoàn thành (
status: ready). - Truy xuất kết quả: Khi nhiệm vụ đã sẵn sàng, nó sẽ trích xuất
gRecaptchaResponse, có thể được sử dụng để bỏ qua CAPTCHA.
- RestSharp Client và Request: Khởi tạo một
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ử thách reCAPTCHA v3 bằng Capsolver API và RestSharp.
csharp
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);
}
}
}
Giải thích:
-
Phương thức CreateTask:
- RestSharp Client và Request: Thiết lập một
RestClientvàRestRequestcho điểm cuốicreateTask. - Gói dữ liệu yêu cầu: Bao gồm các tham số bổ sung như
minScorevàpageActiondành riêng cho reCAPTCHA v3. - Thực hiện: Gửi yêu cầu và truy xuất
taskId.
- RestSharp Client và Request: Thiết lập một
-
Phương thức GetTaskResult:
- Tương tự như ví dụ v2, nó luôn kiểm tra Capsolver API để tìm kết quả của nhiệm vụ và truy xuất mã thông báo CAPTCHA khi nhiệm vụ đã sẵn sàng.
Các thực hành tốt nhất về Web Scraping trong C#
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:
- Tôn trọng
robots.txt: Đảm bảo rằng trang web cho phép web scraping bằng cách kiểm tra tệprobots.txt. - Hạn chế tốc độ: Tránh thực hiện quá nhiều yêu cầu trong một khoảng thời gian ngắn để ngăn chặn 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 qua nhiều IP để tránh bị gắn nhãn 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 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ẻ!
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

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

Ethan Collins
12-Dec-2025

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.

Rajinder Singh
12-Dec-2025

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.

Lucas Mitchell
12-Dec-2025

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.

Anh Tuan
12-Dec-2025

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.

Ethan Collins
12-Dec-2025

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.

Lucas Mitchell
12-Dec-2025

