如何使用 RestSharp (C# 库) 进行网页抓取

Anh Tuan
Data Science Expert
17-Sep-2024

网页抓取是一种从网站提取数据的基本技术,但现代 Web 应用程序通常会实施安全措施(如 CAPTCHA 挑战)来防止自动化访问。CAPTCHA 挑战(例如 Google reCAPTCHA)旨在区分人类用户和机器人,这使得自动化脚本难以有效地抓取内容。
为了克服这些障碍,开发人员可以利用简化 HTTP 请求并处理 CAPTCHA 解决的工具和服务。RestSharp 是一个功能强大且易于使用的 C# 库,它简化了向 RESTful API 发出 HTTP 请求的过程。当与 HtmlAgilityPack 等 HTML 解析器结合使用时,它成为网页抓取任务的强大解决方案。

但是,在抓取过程中遇到 CAPTCHA 挑战会停止您的自动化过程。这就是 Capsolver 发挥作用的地方。Capsolver 提供基于 API 的解决方案以通过编程方式解决 CAPTCHA,使您的抓取脚本能够绕过这些挑战并无缝访问所需内容。
在本综合指南中,我们将引导您完成以下步骤:
- 使用 RestSharp 和 HtmlAgilityPack 抓取网站。
- 使用 Capsolver API 解决 reCAPTCHA 挑战。
使用 RestSharp 进行网页抓取
在 C# 中,RestSharp 是一个用于处理 HTTP 请求和与 RESTful API 交互的流行库。与内置的 HttpClient 相比,它简化了 HTTP 通信的许多方面。您可以将 RestSharp 与 HtmlAgilityPack 等 HTML 解析器结合使用以从网页中提取数据。
先决条件
-
使用 NuGet 包管理器安装 RestSharp 库:
bashInstall-Package RestSharp -
安装 HtmlAgilityPack 库以帮助解析 HTML 内容:
bashInstall-Package HtmlAgilityPack -
安装 Newtonsoft.Json 以处理 JSON 响应:
bashInstall-Package Newtonsoft.Json
示例:抓取“Quotes to Scrape”
让我们使用 RestSharp 和 HtmlAgilityPack 从 Quotes to Scrape 网站抓取引文。
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/";
// 初始化 RestSharp 客户端
var client = new RestClient(url);
// 创建 GET 请求
var request = new RestRequest(Method.GET);
// 执行请求
var response = await client.ExecuteAsync(request);
if (response.IsSuccessful)
{
// 使用 HtmlAgilityPack 解析页面内容
HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(response.Content);
// 查找页面上的所有引文
var quotes = htmlDoc.DocumentNode.SelectNodes("//span[@class='text']");
// 打印每个引文
foreach (var quote in quotes)
{
Console.WriteLine(quote.InnerText);
}
}
else
{
Console.WriteLine($"无法检索页面。状态代码:{response.StatusCode}");
}
}
}
解释:
- RestSharp 客户端和请求: 使用目标 URL 初始化
RestClient并为 GET 方法创建一个RestRequest。 - 执行请求: 异步发送请求并检查响应是否成功。
- HtmlAgilityPack: 解析来自响应的 HTML 内容并通过选择具有类
text的元素来提取引文。
使用 Capsolver 通过 RestSharp 解决 reCAPTCHA v2 和 reCAPTCHA v3
当网站使用 reCAPTCHA v2 或 v3 进行安全保护时,您可以使用 Capsolver API 解决 CAPTCHA。以下是您可以将 Capsolver 与 RestSharp 集成以解决 reCAPTCHA 挑战的方式。
先决条件
-
Newtonsoft.Json 用于处理来自 Capsolver 响应的 JSON 解析:
bashInstall-Package Newtonsoft.Json
示例:使用 Capsolver 解决 reCAPTCHA v2
在本节中,我们将演示如何使用 Capsolver API 和 RestSharp 解决 reCAPTCHA v2 挑战。
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"; // 用您的 Capsolver API 密钥替换
static async Task Main(string[] args)
{
try
{
// 第 1 步:创建一个用于解决 reCAPTCHA v2 的任务
string taskId = await CreateTask();
Console.WriteLine("任务 ID:" + taskId);
// 第 2 步:检索任务的结果
string taskResult = await GetTaskResult(taskId);
Console.WriteLine("任务结果(CAPTCHA 令牌):" + taskResult);
}
catch (Exception ex)
{
Console.WriteLine("错误:" + ex.Message);
}
}
// 用于创建新 CAPTCHA 解决任务的方法
private static async Task<string> CreateTask()
{
// 初始化 RestSharp 客户端
var client = new RestClient(apiUrl);
// 请求有效负载
var requestBody = new
{
clientKey = clientKey,
task = new
{
type = "ReCaptchaV2TaskProxyLess", // 无代理的 reCAPTCHA v2 任务类型
websiteURL = "https://www.example.com", // 用于解决 CAPTCHA 的网站 URL
websiteKey = "SITE_KEY_HERE" // reCAPTCHA 站点密钥
}
};
// 创建 POST 请求
var request = new RestRequest("createTask", Method.POST);
request.AddJsonBody(requestBody);
// 执行请求
var response = await client.ExecuteAsync(request);
if (!response.IsSuccessful)
{
throw new Exception("无法创建任务:" + response.Content);
}
JObject jsonResponse = JObject.Parse(response.Content);
if (jsonResponse["errorId"].ToString() != "0")
{
throw new Exception("创建任务时出错:" + jsonResponse["errorDescription"]);
}
// 返回将在下一步中使用的任务 ID
return jsonResponse["taskId"].ToString();
}
// 用于检索 CAPTCHA 解决任务结果的方法
private static async Task<string> GetTaskResult(string taskId)
{
// 初始化 RestSharp 客户端
var client = new RestClient(apiUrl);
// 请求有效负载
var requestBody = new
{
clientKey = clientKey,
taskId = taskId
};
// 创建 POST 请求
var request = new RestRequest("getTaskResult", Method.POST);
request.AddJsonBody(requestBody);
// 每 5 秒轮询一次任务结果
while (true)
{
var response = await client.ExecuteAsync(request);
if (!response.IsSuccessful)
{
throw new Exception("无法获取任务结果:" + response.Content);
}
JObject jsonResponse = JObject.Parse(response.Content);
if (jsonResponse["errorId"].ToString() != "0")
{
throw new Exception("获取任务结果时出错:" + jsonResponse["errorDescription"]);
}
// 如果任务已准备就绪,则返回 CAPTCHA 令牌
if (jsonResponse["status"].ToString() == "ready")
{
return jsonResponse["solution"]["gRecaptchaResponse"].ToString();
}
// 等待 5 秒钟再检查一次
Console.WriteLine("任务仍在处理中,等待 5 秒钟...");
await Task.Delay(5000);
}
}
}
解释:
-
CreateTask 方法:
- RestSharp 客户端和请求: 初始化一个
RestClient并为createTask端点创建一个具有 POST 方法的RestRequest。 - 请求有效负载: 设置必要的参数,包括
clientKey、websiteURL、websiteKey,并指定任务类型为ReCaptchaV2TaskProxyLess。 - 执行: 发送请求并解析响应以检索
taskId。
- RestSharp 客户端和请求: 初始化一个
-
GetTaskResult 方法:
- RestSharp 客户端和请求: 初始化一个
RestClient并为getTaskResult端点创建一个具有 POST 方法的RestRequest。 - 轮询: 每 5 秒轮询一次任务状态,直到它完成(
status: ready)。 - 结果检索: 一旦任务准备就绪,它将提取
gRecaptchaResponse,该响应可用于绕过 CAPTCHA。
- RestSharp 客户端和请求: 初始化一个
示例:使用 Capsolver 解决 reCAPTCHA v3
在本节中,我们将演示如何使用 Capsolver API 和 RestSharp 解决 reCAPTCHA v3 挑战。
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"; // 用您的 Capsolver API 密钥替换
static async Task Main(string[] args)
{
try
{
// 第 1 步:创建一个用于解决 reCAPTCHA v3 的任务
string taskId = await CreateTask();
Console.WriteLine("任务 ID:" + taskId);
// 第 2 步:检索任务的结果
string taskResult = await GetTaskResult(taskId);
Console.WriteLine("任务结果(CAPTCHA 令牌):" + taskResult);
}
catch (Exception ex)
{
Console.WriteLine("错误:" + ex.Message);
}
}
// 用于创建新 CAPTCHA 解决任务的方法
private static async Task<string> CreateTask()
{
// 初始化 RestSharp 客户端
var client = new RestClient(apiUrl);
// 请求有效负载
var requestBody = new
{
clientKey = clientKey,
task = new
{
type = "ReCaptchaV3TaskProxyLess", // 无代理的 reCAPTCHA v3 任务类型
websiteURL = "https://www.example.com", // 用于解决 CAPTCHA 的网站 URL
websiteKey = "SITE_KEY_HERE", // reCAPTCHA 站点密钥
minScore = 0.3, // 所需的最低分数
pageAction = "your_action" // 在站点上定义的操作名称
}
};
// 创建 POST 请求
var request = new RestRequest("createTask", Method.POST);
request.AddJsonBody(requestBody);
// 执行请求
var response = await client.ExecuteAsync(request);
if (!response.IsSuccessful)
{
throw new Exception("无法创建任务:" + response.Content);
}
JObject jsonResponse = JObject.Parse(response.Content);
if (jsonResponse["errorId"].ToString() != "0")
{
throw new Exception("创建任务时出错:" + jsonResponse["errorDescription"]);
}
// 返回将在下一步中使用的任务 ID
return jsonResponse["taskId"].ToString();
}
// 用于检索 CAPTCHA 解决任务结果的方法
private static async Task<string> GetTaskResult(string taskId)
{
// 初始化 RestSharp 客户端
var client = new RestClient(apiUrl);
// 请求有效负载
var requestBody = new
{
clientKey = clientKey,
taskId = taskId
};
// 创建 POST 请求
var request = new RestRequest("getTaskResult", Method.POST);
request.AddJsonBody(requestBody);
// 每 5 秒轮询一次任务结果
while (true)
{
var response = await client.ExecuteAsync(request);
if (!response.IsSuccessful)
{
throw new Exception("无法获取任务结果:" + response.Content);
}
JObject jsonResponse = JObject.Parse(response.Content);
if (jsonResponse["errorId"].ToString() != "0")
{
throw new Exception("获取任务结果时出错:" + jsonResponse["errorDescription"]);
}
// 如果任务已准备就绪,则返回 CAPTCHA 令牌
if (jsonResponse["status"].ToString() == "ready")
{
return jsonResponse["solution"]["gRecaptchaResponse"].ToString();
}
// 等待 5 秒钟再检查一次
Console.WriteLine("任务仍在处理中,等待 5 秒钟...");
await Task.Delay(5000);
}
}
}
解释:
-
CreateTask 方法:
- RestSharp 客户端和请求: 为
createTask端点设置一个RestClient和RestRequest。 - 请求有效负载: 包括其他参数(如
minScore和pageAction),它们特定于 reCAPTCHA v3。 - 执行: 发送请求并检索
taskId。
- RestSharp 客户端和请求: 为
-
GetTaskResult 方法:
- 与 v2 示例类似,它轮询 Capsolver API 以获取任务结果,并在任务准备就绪后检索 CAPTCHA 令牌。
C# 中的网页抓取最佳实践
在 C# 中使用网页抓取工具时,始终遵循以下最佳实践:
- 尊重
robots.txt: 通过检查robots.txt文件确保网站允许网页抓取。 - 速率限制: 避免在短时间内发出太多请求,以防止被网站阻止。
- 代理轮换: 使用代理将请求分布在多个 IP 上,以避免被标记为机器人。
- 伪造标头: 通过添加自定义标头(如
User-Agent)到您的 HTTP 请求来模拟类似浏览器的请求。
结论
通过使用 RestSharp 进行网页抓取,并使用 Capsolver 解决 CAPTCHA,您可以有效地自动化与使用 CAPTCHA 挑战的网站的交互。始终确保您的网页抓取活动符合目标网站的服务条款和法律要求。
祝您抓取愉快!
合规声明: 本博客提供的信息仅供参考。CapSolver 致力于遵守所有适用的法律和法规。严禁以非法、欺诈或滥用活动使用 CapSolver 网络,任何此类行为将受到调查。我们的验证码解决方案在确保 100% 合规的同时,帮助解决公共数据爬取过程中的验证码难题。我们鼓励负责任地使用我们的服务。如需更多信息,请访问我们的服务条款和隐私政策。
更多

即时数据抓取工具:无需代码快速提取网页数据的方法
探索2026年最佳的即时数据抓取工具。学习无需编码即可使用顶级扩展和API快速提取网页数据的方法,实现自动化数据提取。

Sora Fujimoto
28-Jan-2026

使用Python进行新闻文章的网络爬虫(2026年指南)
在2026年掌握使用Python进行新闻文章网络爬取的技能。学习使用CapSolver解决reCAPTCHA v2/v3,构建可扩展的数据管道。

Adélia Cruz
28-Jan-2026

浏览器使用与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

2026年最顶尖的9个AI代理框架
探索2026年的顶级9个AI代理框架,包括CrewAI、AutoGen和LangGraph。学习如何为多智能体编排和自主代理开发选择最佳框架,并发现用于现实世界网络交互的关键工具。

Lucas Mitchell
26-Jan-2026

