• 定价
立即开始

© 2026 CapSolver. All rights reserved.

联系我们

Slack: lola@capsolver.com

产品

  • reCAPTCHA v2
  • reCAPTCHA v3
  • Cloudflare Turnstile
  • Cloudflare Challenge
  • AWS WAF
  • 浏览器插件
  • 更多验证码类型

集成

  • Selenium
  • Playwright
  • Puppeteer
  • n8n
  • 合作伙伴
  • 查看所有集成

资源

  • 推荐返佣系统
  • 官方文档
  • API 参考
  • 博客
  • 常见问题 (FAQ)
  • 术语表
  • 系统状态

法律声明

  • 服务条款
  • 隐私政策
  • 退款政策
  • 请勿出售我的信息
博客/All/如何使用 HttpClient (C# 库) 进行网页抓取
Sep16, 2024

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

Anh Tuan

Anh Tuan

Data Science Expert

如何使用 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 Copy
Install-Package HtmlAgilityPack
  • 安装 Newtonsoft.Json 以处理 JSON 响应:
bash Copy
Install-Package Newtonsoft.Json

示例:抓取“Quotes to Scrape”

让我们使用 HttpClient 和 HtmlAgilityPack 从 Quotes to Scrape 网站抓取报价。

csharp Copy
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 Copy
Install-Package Newtonsoft.Json

示例:使用 Capsolver 解决 reCAPTCHA v2

在本节中,我们将演示 如何使用 Capsolver API 和 HttpClient 解决 reCAPTCHA v2 挑战。

csharp Copy
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);
            }
        }
    }
}

解释:

  1. CreateTask 方法:

    • 此方法向 Capsolver 的 /createTask 端点发送 POST 请求以创建一个用于解决 reCAPTCHA v2 挑战的新任务。
    • 该请求包括 clientKey、websiteURL、websiteKey,并指定任务类型为 ReCaptchaV2TaskProxyLess。
    • 此方法返回一个 taskId,该 taskId 将用于检索任务结果。
  2. GetTaskResult 方法:

    • 此方法向 /getTaskResult 端点发送 POST 请求以检查先前创建的任务的结果。
    • 它每 5 秒轮询一次任务状态,直到任务完成 (status: ready)。
    • 一旦任务准备就绪,它将返回 gRecaptchaResponse,该响应可用于绕过 CAPTCHA。

示例:使用 Capsolver 解决 reCAPTCHA v3

在本节中,我们将演示 如何使用 Capsolver API 和 HttpClient 解决 reCAPTCHA v3 挑战。

csharp Copy
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);
            }
        }
    }
}

解释:

  1. CreateTask 方法:

    • 此方法向 Capsolver 的 /createTask 端点发送 POST 请求以创建一个用于解决 reCAPTCHA v3 挑战的新任务。
    • 该请求包括 clientKey、websiteURL、websiteKey,并指定任务类型为 ReCaptchaV3TaskProxyLess。
    • 此方法返回一个 taskId,该 taskId 将用于检索任务结果。
  2. 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。

查看更多

May 08, 2026

ReCAPTCHA在电子商务抓取中的应用:以合规为先的指南

了解如何在电子商务数据抓取中处理reCAPTCHA验证码,通过合规的工作流程、诊断、CapSolver示例和实用的风险控制措施来实现。

Ethan Collins
Ethan Collins
May 08, 2026

AI数据提取如何运作:验证码破解、大语言模型解析与结构化网络数据管道

学习AI驱动的数据提取技术,从网页抓取和验证码破解到HTML清理、大语言模型解析以及结构化JSON生成。探索反机器人绕过策略、如AXE这样的语义提取框架以及可扩展的AI网络爬虫管道。

Ethan Collins
Ethan Collins

目录

May 07, 2026

用于网页自动化和验证码解决的最佳人工智能代理框架

比较2026年最佳AI代理框架在网页自动化、验证码解决、合规性和生产就绪代理工作流程中的表现。

Ethan Collins
Ethan Collins
May 07, 2026

最佳Java网络爬虫库用于可靠的数据提取

比较最佳的Java网络爬虫库,包括jsoup、Selenium、Playwright(用于Java)、HtmlUnit、Apache Nutch和API选项。

Ethan Collins
Ethan Collins