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

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

Logo of CapSolver

Anh Tuan

Data Science Expert

23-Jan-2025

网络爬取,C#,CapSolver

您友好的网站爬取、处理 CAPTCHA,甚至截取屏幕截图指南!


为什么选择 C# 进行网络爬取?

C# 不仅仅用于构建 Windows 应用程序或游戏——它也是网络爬取的强大工具!借助 HtmlAgilityPackSeleniumPuppeteer 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。方法如下:

  1. 注册 Capsolver,获取您的 API 密钥。
  2. 使用 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 年网络爬取专业技巧

  1. 尊重 robots.txt: 首先检查 https://www.scrapethissite.com/robots.txt
  2. 速率限制: 使用 Thread.Sleep(2000) 添加延迟以避免使服务器不堪重负。
  3. 用户代理轮换: 模拟真实浏览器以避免被检测。
  4. 错误处理: 将代码包装在 try-catch 块中以处理网络问题。

合规声明: 本博客提供的信息仅供参考。CapSolver 致力于遵守所有适用的法律和法规。严禁以非法、欺诈或滥用活动使用 CapSolver 网络,任何此类行为将受到调查。我们的验证码解决方案在确保 100% 合规的同时,帮助解决公共数据爬取过程中的验证码难题。我们鼓励负责任地使用我们的服务。如需更多信息,请访问我们的服务条款和隐私政策。

更多

赋能企业自动化
赋能企业自动化:大模型驱动的验证码识别基础设施,实现无缝业务流程与高效运营

探索如何利用大模型(LLM)驱动的 AI 自动化基础设施,革新验证码识别,提升业务流程效率,减少人工干预。通过先进的验证码解决方案,优化您的自动化运营。

AI
Logo of CapSolver

Lucas Mitchell

27-Mar-2026

扩展数据收集以进行大语言模型训练:大规模解决验证码问题
扩展大语言模型训练的数据收集:大规模解决CAPTCHAs

通过大规模解决验证码来扩展大语言模型训练的数据收集。探索用于AI模型的自动化策略,以构建高质量的数据集。

AI
Logo of CapSolver

Aloísio Vítor

27-Mar-2026

在Vibium中解决CAPTCHA
如何在Vibium中无需扩展程序解决验证码(reCAPTCHA、Turnstile、AWS WAF)

学习如何使用 CapSolver API 在 Vibium 中解决 CAPTCHA。支持使用 JavaScript、Python 和 Java 的完整代码示例,无需浏览器扩展即可解决 reCAPTCHA v2/v3、Cloudflare Turnstile 和 AWS WAF。

AI
Logo of CapSolver

Emma Foster

27-Mar-2026

修复 Cloudflare 错误 1005:网页抓取指南与解决方案
解决Cloudflare错误1005:网页抓取指南与解决方案

学习修复Cloudflare错误1005访问被拒绝的网络爬虫问题。发现解决方案如住宅代理、浏览器指纹识别和CapSolver验证码解决方法。优化您的数据提取。

Cloudflare
Logo of CapSolver

Nikolai Smirnov

27-Mar-2026

使用 CapSolver 打开浏览器
如何在OpenBrowser中使用CapSolver解决CAPTCHA(AI代理自动化指南)

在OpenBrowser中使用CapSolver解决验证码。轻松为AI代理自动化reCAPTCHA、Turnstile等。

AI
Logo of CapSolver

Emma Foster

26-Mar-2026

HyperBrowser 与 CapSolver
如何在HyperBrowser中使用CapSolver解决任何CAPTCHA(完整设置指南)

使用 CapSolver 在 HyperBrowser 中解决任何验证码。轻松自动化处理 reCAPTCHA、Turnstile、AWS WAF 等更多内容。

AI
Logo of CapSolver

Ethan Collins

26-Mar-2026