
Emma Foster
Machine Learning Engineer

*Hướng dẫn thân thiện của bạn để trích xuất dữ liệu từ trang web, xử lý CAPTCHA và thậm chí chụp ảnh màn hình!*
---
### Tại sao lại trích xuất dữ liệu từ trang web bằng C#?

C# không chỉ dùng để xây dựng ứng dụng Windows hoặc trò chơi—nó cũng là một công cụ mạnh mẽ để trích xuất dữ liệu từ trang web! Với các thư viện như **HtmlAgilityPack**, **Selenium**, và **Puppeteer Sharp**, bạn có thể trích xuất dữ liệu, tự động hóa các tương tác và thậm chí giải quyết CAPTCHA (đúng vậy, thật đấy). Trong hướng dẫn này, chúng ta sẽ sử dụng [https://www.scrapethissite.com/pages/](https://www.scrapethissite.com/pages/) làm sân chơi của chúng ta. Hãy bắt đầu nào!
---
### Bước 1: Thiết lập dự án của bạn

Đầu tiên, tạo một ứng dụng console C# mới. Sau đó, cài đặt các gói NuGet này:
```bash
Install-Package HtmlAgilityPack # Để phân tích cú pháp HTML
Install-Package Selenium.WebDriver # Để tự động hóa trình duyệt
Install-Package PuppeteerSharp # Để chụp ảnh màn hình & trích xuất dữ liệu nâng cao
Install-Package Capsolver.SDK # Để giải quyết CAPTCHA
Hãy trích xuất dữ liệu quốc gia từ https://www.scrapethissite.com/pages/simple/.
using HtmlAgilityPack;
using System.Net;
var url = "https://www.scrapethissite.com/pages/simple/";
var client = new WebClient();
client.Headers.Add("User-Agent", "Mozilla/5.0"); // Hãy lịch sự!
var html = client.DownloadString(url);
var doc = new HtmlDocument();
doc.LoadHtml(html);
var countries = doc.DocumentNode.SelectNodes("//div[@class='country']");
foreach (var country in countries)
{
var name = country.SelectSingleNode(".//h3").InnerText.Trim();
var capital = country.SelectSingleNode(".//span[@class='country-capital']").InnerText.Trim();
Console.WriteLine($"Quốc gia: {name}, Thủ đô: {capital}");
}
Điều này in tất cả các quốc gia và thủ đô của chúng. Đơn giản, phải không?
Một số trang cần một trình duyệt thực sự. Hãy trích xuất dữ liệu trang ví dụ AJAX bằng Selenium:
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
var options = new ChromeOptions();
options.AddArgument("--headless"); // Chạy nền
using var driver = new ChromeDriver(options);
driver.Navigate().GoToUrl("https://www.scrapethissite.com/pages/ajax-javascript/");
var dynamicContent = driver.FindElement(By.CssSelector(".ajax-content")).Text;
Console.WriteLine($"Nội dung AJAX: {dynamicContent}");
Có CAPTCHA chặn đường bạn không? Sử dụng Capsolver để bỏ qua ReCaptchaV2. Đây là cách:
using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.Text;
using System.Text.Json;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System.Threading;
namespace CapSolverSeleniumExample
{
class Program
{
static async Task Main(string[] args)
{
string token = await GetCaptchaToken();
using var driver = new ChromeDriver();
driver.Navigate().GoToUrl("https://www.example.com");
Thread.Sleep(5000);
driver.ExecuteScript("document.getElementById('g-recaptcha-response').innerHTML = arguments[0];", token);
var submitButton = driver.FindElement(By.Id("submit-button"));
submitButton.Click();
Thread.Sleep(5000);
driver.Quit();
}
static async Task<string> GetCaptchaToken()
{
string apiKey = "YOUR_API_KEY";
string siteKey = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_kl-";
string siteUrl = "https://www.example.com";
using var client = new HttpClient();
var payload = new
{
clientKey = apiKey,
task = new
{
type = "ReCaptchaV3TaskProxyLess",
websiteKey = siteKey,
websiteURL = siteUrl,
pageAction = "login"
}
};
var requestContent = new StringContent(JsonSerializer.Serialize(payload), Encoding.UTF8, "application/json");
var createTaskResponse = await client.PostAsync("https://api.capsolver.com/createTask", requestContent);
var createTaskResponseString = await createTaskResponse.Content.ReadAsStringAsync();
using var createTaskJsonDoc = JsonDocument.Parse(createTaskResponseString);
var root = createTaskJsonDoc.RootElement;
if (!root.TryGetProperty("taskId", out var taskIdElement))
{
Console.WriteLine("Không thể tạo tác vụ: " + createTaskResponseString);
return null;
}
int taskId = taskIdElement.GetInt32();
while (true)
{
await Task.Delay(1000);
var resultPayload = new { clientKey = apiKey, taskId = taskId };
var resultContent = new StringContent(JsonSerializer.Serialize(resultPayload), Encoding.UTF8, "application/json");
var getTaskResponse = await client.PostAsync("https://api.capsolver.com/getTaskResult", resultContent);
var getTaskResponseString = await getTaskResponse.Content.ReadAsStringAsync();
using var getTaskJsonDoc = JsonDocument.Parse(getTaskResponseString);
var resultRoot = getTaskJsonDoc.RootElement;
if (resultRoot.TryGetProperty("status", out var statusElement))
{
string status = statusElement.GetString();
if (status == "ready")
{
if (resultRoot.TryGetProperty("solution", out var solutionElement) && solutionElement.TryGetProperty("gRecaptchaResponse", out var tokenElement))
{
return tokenElement.GetString();
}
return null;
}
if (status == "failed" || resultRoot.TryGetProperty("errorId", out _))
{
Console.WriteLine("Giải quyết thất bại! phản hồi: " + getTaskResponseString);
return null;
}
}
}
}
}
}
Hoạt động liền mạch với Selenium để tự động hóa các biểu mẫu có nhiều CAPTCHA!
Bạn muốn bằng chứng trực quan về việc trích xuất dữ liệu của mình? Chụp ảnh màn hình:
using PuppeteerSharp;
await new BrowserFetcher().DownloadAsync();
using var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true });
using var page = await browser.NewPageAsync();
await page.GoToAsync("https://www.scrapethissite.com/pages/javascript/");
await page.ScreenshotAsync("screenshot.png");
Hoàn hảo để gỡ lỗi hoặc lưu trữ các trang.
Thread.Sleep(2000) để tránh làm quá tải máy chủ.try-catch để xử lý sự cố mạng.
Thiết kế dữ liệu kiểm tra lý lịch cho các đại diện xác minh AI với kiểm tra theo mục đích được phép, hồ sơ có nhận thức về tranh chấp, tính mới nhất của nguồn, đánh giá của con người và nhật ký kiểm toán.

Xây dựng dữ liệu hồ sơ tòa án dành cho các đại diện nghiên cứu AI với nguồn gốc nguồn dữ liệu, kiểm tra che dấu, thu thập có nhận thức về phí, khôi phục trình duyệt có giới hạn và đánh giá bởi con người.
