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

Anh Tuan
Data Science Expert
13-Sep-2024
如何使用 HttpClient(C# 库)进行网页抓取

网站通常会使用 CAPTCHA 挑战(例如 Google reCAPTCHA)来阻止机器人并防止自动访问其内容。为了以编程方式绕过这些挑战,您可以使用像 Capsolver 这样的服务,它们提供基于 API 的解决方案来解决这些 CAPTCHA。
在本指南中,我们将向您展示如何:
- 使用 C# HttpClient 和 HtmlAgilityPack 抓取网站。
- 使用 Capsolver API 解决 reCAPTCHA 挑战。
使用 C# HttpClient 进行网页抓取
在 C# 中,HttpClient 类通常用于发送 HTTP 请求并接收来自网站的响应。您可以将其与 HTML 解析器(如 HtmlAgilityPack)结合使用来从网页中提取数据。
先决条件
- 使用 NuGet 包管理器安装 HtmlAgilityPack 库以帮助解析 HTML 内容:
bash
Install-Package HtmlAgilityPack
- 安装 Newtonsoft.Json 以处理 JSON 响应:
bash
Install-Package Newtonsoft.Json
示例:抓取“Quotes to Scrape”
让我们使用 HttpClient 和 HtmlAgilityPack 从 Quotes to Scrape 网站抓取报价。
csharp
using System;
using System.Net.Http;
using System.Threading.Tasks;
using HtmlAgilityPack;
class Program
{
private static readonly HttpClient client = new HttpClient();
static async Task Main(string[] args)
{
string url = "http://quotes.toscrape.com/";
// 向页面发送 GET 请求
HttpResponseMessage response = await client.GetAsync(url);
if (response.IsSuccessStatusCode)
{
// 使用 HtmlAgilityPack 解析页面内容
string pageContent = await response.Content.ReadAsStringAsync();
HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(pageContent);
// 查找页面上的所有报价
var quotes = htmlDoc.DocumentNode.SelectNodes("//span[@class='text']");
// 打印每个报价
foreach (var quote in quotes)
{
Console.WriteLine(quote.InnerText);
}
}
else
{
Console.WriteLine($"无法检索页面。状态码:{response.StatusCode}");
}
}
}
解释:
- HttpClient: 向网站发送 GET 请求。
- HtmlAgilityPack: 解析 HTML 内容并通过选择具有类
text的元素来提取报价。
使用 Capsolver 和 HttpClient 解决 reCAPTCHA v3 和 reCaptcha v2
当网站使用 reCAPTCHA v3 和 reCaptcha v2 进行安全保护时,您可以使用 Capsolver API 来解决 CAPTCHA。以下是将 Capsolver 与 HttpClient 集成以解决 reCAPTCHA 挑战的方法。
先决条件
- Newtonsoft.Json 用于处理来自 Capsolver 响应的 JSON 解析:
bash
Install-Package Newtonsoft.Json
示例:使用 Capsolver 解决 reCAPTCHA v2
在本节中,我们将演示 如何使用 Capsolver API 和 HttpClient 解决 reCAPTCHA v2 挑战。
csharp
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
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()
{
using (HttpClient client = new HttpClient())
{
// 请求有效负载
var requestBody = new
{
clientKey = clientKey,
task = new
{
type = "ReCaptchaV2TaskProxyLess", // 用于无代理 reCAPTCHA v3 的任务类型
websiteURL = "", // 要为其解决 CAPTCHA 的网站 URL
websiteKey = "" // reCAPTCHA 站点密钥
}
};
// 发送创建任务的请求
var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PostAsync($"{apiUrl}/createTask", content);
string responseContent = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
throw new Exception("无法创建任务:" + responseContent);
}
JObject jsonResponse = JObject.Parse(responseContent);
if (jsonResponse["errorId"].ToString() != "0")
{
throw new Exception("创建任务出错:" + jsonResponse["errorDescription"]);
}
// 返回将在下一步中使用的任务 ID
return jsonResponse["taskId"].ToString();
}
}
// 检索 CAPTCHA 解决任务结果的方法
private static async Task<string> GetTaskResult(string taskId)
{
using (HttpClient client = new HttpClient())
{
// 请求有效负载
var requestBody = new
{
clientKey = clientKey,
taskId = taskId
};
var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");
// 每 5 秒轮询一次任务结果
while (true)
{
HttpResponseMessage response = await client.PostAsync($"{apiUrl}/getTaskResult", content);
string responseContent = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
throw new Exception("无法获取任务结果:" + responseContent);
}
JObject jsonResponse = JObject.Parse(responseContent);
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 方法:
- 此方法向 Capsolver 的
/createTask端点发送 POST 请求以创建一个用于解决 reCAPTCHA v2 挑战的新任务。 - 该请求包括
clientKey、websiteURL、websiteKey,并指定任务类型为ReCaptchaV2TaskProxyLess。 - 此方法返回一个
taskId,该taskId将用于检索任务结果。
- 此方法向 Capsolver 的
-
GetTaskResult 方法:
- 此方法向
/getTaskResult端点发送 POST 请求以检查先前创建的任务的结果。 - 它每 5 秒轮询一次任务状态,直到任务完成 (
status: ready)。 - 一旦任务准备就绪,它将返回
gRecaptchaResponse,该响应可用于绕过 CAPTCHA。
- 此方法向
示例:使用 Capsolver 解决 reCAPTCHA v3
在本节中,我们将演示 如何使用 Capsolver API 和 HttpClient 解决 reCAPTCHA v3 挑战。
csharp
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
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()
{
using (HttpClient client = new HttpClient())
{
// 请求有效负载
var requestBody = new
{
clientKey = clientKey,
task = new
{
type = "ReCaptchaV3TaskProxyLess", // 用于无代理 reCAPTCHA v3 的任务类型
websiteURL = "", // 要为其解决 CAPTCHA 的网站 URL
websiteKey = "" // reCAPTCHA 站点密钥
}
};
// 发送创建任务的请求
var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PostAsync($"{apiUrl}/createTask", content);
string responseContent = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
throw new Exception("无法创建任务:" + responseContent);
}
JObject jsonResponse = JObject.Parse(responseContent);
if (jsonResponse["errorId"].ToString() != "0")
{
throw new Exception("创建任务出错:" + jsonResponse["errorDescription"]);
}
// 返回将在下一步中使用的任务 ID
return jsonResponse["taskId"].ToString();
}
}
// 检索 CAPTCHA 解决任务结果的方法
private static async Task<string> GetTaskResult(string taskId)
{
using (HttpClient client = new HttpClient())
{
// 请求有效负载
var requestBody = new
{
clientKey = clientKey,
taskId = taskId
};
var content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");
// 每 5 秒轮询一次任务结果
while (true)
{
HttpResponseMessage response = await client.PostAsync($"{apiUrl}/getTaskResult", content);
string responseContent = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
throw new Exception("无法获取任务结果:" + responseContent);
}
JObject jsonResponse = JObject.Parse(responseContent);
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 方法:
- 此方法向 Capsolver 的
/createTask端点发送 POST 请求以创建一个用于解决 reCAPTCHA v3 挑战的新任务。 - 该请求包括
clientKey、websiteURL、websiteKey,并指定任务类型为ReCaptchaV3TaskProxyLess。 - 此方法返回一个
taskId,该taskId将用于检索任务结果。
- 此方法向 Capsolver 的
-
GetTaskResult 方法:
- 此方法向
/getTaskResult端点发送 POST 请求以检查先前创建的任务的结果。 - 它每 5 秒轮询一次任务状态,直到任务完成 (
status: ready)。 - 一旦任务准备就绪,它将返回
gRecaptchaResponse,该响应可用于绕过 CAPTCHA。
- 此方法向
C# 中的网页抓取最佳实践
在 C# 中使用网页抓取工具时,请始终遵循以下最佳实践:
- 尊重
robots.txt: 通过检查robots.txt文件,确保网站允许网页抓取。 - 速率限制: 避免在短时间内发出太多请求,以防止被网站屏蔽。
- 代理轮换: 使用代理将请求分布到多个 IP 上,以避免被标记为机器人。
- 伪造标头: 通过向您的 HTTP 请求添加自定义标头(例如
User-Agent)来模拟浏览器式请求。
总结
通过使用 HttpClient 进行网页抓取和 Capsolver 解决 CAPTCHA,您可以有效地自动执行与使用 CAPTCHA 挑战的网站的交互。始终确保您的网页抓取活动符合目标网站的服务条款和法律要求。
祝您抓取愉快!
本指南集成了使用 HtmlAgilityPack 的网页抓取,并演示了如何使用 Capsolver 处理 reCAPTCHA 挑战,仅使用 C# 中的 HttpClient。
合规声明: 本博客提供的信息仅供参考。CapSolver 致力于遵守所有适用的法律和法规。严禁以非法、欺诈或滥用活动使用 CapSolver 网络,任何此类行为将受到调查。我们的验证码解决方案在确保 100% 合规的同时,帮助解决公共数据爬取过程中的验证码难题。我们鼓励负责任地使用我们的服务。如需更多信息,请访问我们的服务条款和隐私政策。
更多

如何通过Vercel代理浏览器解决CAPTCHA – 使用CapSolver的分步指南
学习如何将CapSolver与Agent Browser集成,以处理验证码并构建可靠的AI自动化工作流程。

Ethan Collins
18-Mar-2026

如何在 n8n 中使用 CapSolver:解决工作流程中的 CAPTCHA 的完整指南
学习如何将CapSolver与n8n集成,以轻松解决CAPTCHAs并构建可靠的自动化工作流。

Emma Foster
18-Mar-2026

如何使用CapSolver解决n8n中的TLS指纹问题
使用 CapSolver 解决 n8n 中的 TLS 指纹识别问题。让请求看起来像真实的浏览器,并避免被机器人检测拦截。

Emma Foster
18-Mar-2026

如何在n8n中使用CapSolver解决视觉谜题
使用 CapSolver Vision Engine 在 n8n 中解决视觉验证码。立即处理滑块、旋转、对象选择和 GIF 文字识别。

Emma Foster
18-Mar-2026

将 CapSolver 与 Web MCP 集成:面向自主代理的指南
增强您的AI代理的网页自动化能力。本指南详细介绍了如何在Web MCP框架内集成CapSolver以实现高效的验证码破解,确保操作的可靠性和合规性。

Aloísio Vítor
17-Mar-2026

如何在AI工作流中使用Playwright隐身模式处理Cloudflare Turnstile
了解如何通过使用Playwright隐身技术以及CapSolver实现可靠的验证码解决,从而有效处理AI工作流中的Cloudflare Turnstile。学习实用的集成策略和最佳实践,以实现无缝自动化。

Nikolai Smirnov
17-Mar-2026

