C#网页抓取:2025年分步教程

Anh Tuan
Data Science Expert
23-Jan-2025

您友好的网站爬取、处理 CAPTCHA,甚至截取屏幕截图指南!
为什么选择 C# 进行网络爬取?

C# 不仅仅用于构建 Windows 应用程序或游戏——它也是网络爬取的强大工具!借助 HtmlAgilityPack、Selenium 和 Puppeteer Sharp 等库,您可以提取数据、自动化交互,甚至解决 CAPTCHA(是的,真的)。在本教程中,我们将使用 https://www.scrapethissite.com/pages/ 作为我们的练习场。让我们开始吧!
步骤 1:设置您的项目

首先,创建一个新的 C# 控制台应用程序。然后,安装以下 NuGet 包:
bash
Install-Package HtmlAgilityPack # 用于 HTML 解析
Install-Package Selenium.WebDriver # 用于浏览器自动化
Install-Package PuppeteerSharp # 用于屏幕截图和高级爬取
Install-Package Capsolver.SDK # 用于 CAPTCHA 解决
示例 1:基本的页面爬取
让我们从 https://www.scrapethissite.com/pages/simple/ 爬取国家数据。
csharp
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"); // 保持礼貌!
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($"国家:{name},首都:{capital}");
}
这将打印所有国家及其首都。很简单,对吧?
示例 2:使用 Selenium 处理 JavaScript
某些页面需要一个真正的浏览器。让我们使用 Selenium 爬取 AJAX 示例页面:
csharp
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
var options = new ChromeOptions();
options.AddArgument("--headless"); // 在后台运行
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($"AJAX 内容:{dynamicContent}");
示例 3:使用 Capsolver 解决 CAPTCHA
CAPTCHA 挡住了你的路?使用 Capsolver 来绕过 ReCaptchaV2。方法如下:
- 注册 Capsolver,获取您的 API 密钥。
- 使用 API 来解决 CAPTCHA:
csharp
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("创建任务失败:" + 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("解决失败!响应:" + getTaskResponseString);
return null;
}
}
}
}
}
}
与 Selenium 无缝协作,以自动化 CAPTCHA 密集表单!
示例 4:使用 Puppeteer Sharp 截取屏幕截图
想要您爬取的视觉证明?捕获屏幕截图:
csharp
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");
非常适合调试或存档页面。
2025 年网络爬取专业技巧
- 尊重 robots.txt: 首先检查 https://www.scrapethissite.com/robots.txt。
- 速率限制: 使用
Thread.Sleep(2000)添加延迟以避免使服务器不堪重负。 - 用户代理轮换: 模拟真实浏览器以避免被检测。
- 错误处理: 将代码包装在
try-catch块中以处理网络问题。
合规声明: 本博客提供的信息仅供参考。CapSolver 致力于遵守所有适用的法律和法规。严禁以非法、欺诈或滥用活动使用 CapSolver 网络,任何此类行为将受到调查。我们的验证码解决方案在确保 100% 合规的同时,帮助解决公共数据爬取过程中的验证码难题。我们鼓励负责任地使用我们的服务。如需更多信息,请访问我们的服务条款和隐私政策。
更多

浏览器使用与Browserbase:哪种浏览器自动化工具更适合AI代理?
比较Browser Use与Browserbase在AI代理自动化中的应用。了解功能、价格以及如何通过CapSolver解决CAPTCHAs以实现无缝工作流程。

Aloísio Vítor
27-Jan-2026

2026年十大无代码爬虫工具
2026年最佳无代码网络爬虫工具精选列表。比较AI驱动的爬虫、可视化点击平台、定价、优缺点及实际应用案例。

Emma Foster
27-Jan-2026

IP封禁在2026年:它们的工作原理和实用方法
通过我们的全面指南,了解如何在2026年绕过IP封禁。探索现代IP封禁技术及实用解决方案,如住宅代理和CAPTCHA解决工具。

Ethan Collins
26-Jan-2026

最好的API搜索公司首页:一份强大的指南,助力更智能的数据发现
通过我们的专家指南评估最佳API搜索公司的主页。学习如何评估技术透明度、开发者体验和核心功能,以实现更智能的数据发现和可靠的API集成。

Lucas Mitchell
23-Jan-2026

如何在 Maxun 中使用 CapSolver 集成解决验证码
将CapSolver与Maxun集成以进行实际网络爬虫的实用指南。学习如何通过预认证和机器人工作流程处理reCAPTCHA、Cloudflare Turnstile和CAPTCHA保护的网站。

Emma Foster
21-Jan-2026

如何在浏览器4中通过CapSolver集成解决验证码
高吞吐量Browser4自动化结合CapSolver用于处理大规模网络数据提取中的CAPTCHA挑战。

Lucas Mitchell
21-Jan-2026

