
Anh Tuan
Data Science Expert

Panduan ramah Anda untuk scraping situs web, menangani CAPTCHA, dan bahkan mengambil tangkapan layar!

C# bukan hanya untuk membangun aplikasi Windows atau game—ini juga merupakan kekuatan untuk web scraping! Dengan library seperti HtmlAgilityPack, Selenium, dan Puppeteer Sharp, Anda dapat mengekstrak data, mengotomatiskan interaksi, dan bahkan menyelesaikan CAPTCHA (ya, benar). Dalam tutorial ini, kita akan menggunakan https://www.scrapethissite.com/pages/ sebagai tempat bermain kita. Mari selami!

Pertama, buat aplikasi konsol C# baru. Kemudian, instal paket NuGet ini:
Install-Package HtmlAgilityPack # Untuk parsing HTML
Install-Package Selenium.WebDriver # Untuk otomatisasi browser
Install-Package PuppeteerSharp # Untuk tangkapan layar & scraping tingkat lanjut
Install-Package Capsolver.SDK # Untuk pemecahan CAPTCHA
Mari kita scraping data negara dari 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"); // Bersikap sopan!
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($"Negara: {name}, Ibu Kota: {capital}");
}
Ini mencetak semua negara dan ibu kotanya. Sederhana, kan?
Beberapa halaman membutuhkan browser nyata. Mari kita scraping halaman contoh AJAX menggunakan Selenium:
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
var options = new ChromeOptions();
options.AddArgument("--headless"); // Jalankan di latar belakang
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($"Konten AJAX: {dynamicContent}");
Mendapat CAPTCHA yang menghalangi jalan Anda? Gunakan Capsolver untuk melewati ReCaptchaV2. Begini caranya:
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("Gagal membuat tugas: " + 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("Pemecahan gagal! respon: " + getTaskResponseString);
return null;
}
}
}
}
}
}
Berjalan mulus dengan Selenium untuk mengotomatiskan formulir yang sarat CAPTCHA!
Ingin bukti visual dari scraping Anda? Ambil tangkapan layar:
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");
Sempurna untuk debugging atau pengarsipan halaman.
Thread.Sleep(2000) untuk menghindari server yang kewalahan.try-catch untuk masalah jaringan.Panduan captcha pengambilan data web untuk alur kerja data yang disetujui: pelajari jenis tantangan, pengelolaan API, konsistensi proxy, pengulangan, dan penggunaan yang bertanggung jawab.

API penyelesaian CAPTCHA cepat untuk otomatisasi: bandingkan alur kerja token, tantangan yang didukung, pemeriksaan latensi, dan integrasi CapSolver yang bertanggung jawab.
