CAPSOLVER
Блог
Веб-скрейпинг на C#: пошаговое руководство в 2025 году

Веб-скрейпинг на C#: пошаговое руководство в 2025 году

Logo of CapSolver

Sora Fujimoto

AI Solutions Architect

23-Jan-2025

Веб-скрейпинг, C#, Capsolver

Ваше дружелюбное руководство по извлечению данных с веб-сайтов, обработке CAPTCHA и даже созданию скриншотов!


Зачем использовать веб-скрейпинг в C#?

C# — это не только инструмент для создания Windows-приложений или игр, но и мощный инструмент для веб-скрейпинга! С помощью таких библиотек, как HtmlAgilityPack, Selenium и Puppeteer Sharp, вы можете извлекать данные, автоматизировать взаимодействия и даже решать CAPTCHA (да, правда). В этом руководстве мы будем использовать https://www.scrapethissite.com/pages/ в качестве нашей песочницы. Погрузимся!


Шаг 1: Настройка проекта

Сначала создайте новое консольное приложение C#. Затем установите эти пакеты NuGet:

bash Copy
Install-Package HtmlAgilityPack        # Для анализа HTML
Install-Package Selenium.WebDriver     # Для автоматизации браузера
Install-Package PuppeteerSharp         # Для скриншотов и расширенного скрейпинга
Install-Package Capsolver.SDK          # Для решения CAPTCHA

Пример 1: Базовый веб-скрейпинг

Давайте извлечем данные о странах с https://www.scrapethissite.com/pages/simple/.

csharp Copy
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: Обработка JavaScript с помощью Selenium

Некоторые страницы требуют настоящего браузера. Давайте извлечем данные со страницы примера AJAX используя Selenium:

csharp Copy
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: Решение CAPTCHA с помощью Capsolver

CAPTCHA блокирует ваш путь? Используйте Capsolver, чтобы обойти ReCaptchaV2. Вот как:

  1. Зарегистрируйтесь на Capsolver, получите свой API ключ.
  2. Используйте API для решения CAPTCHA:
csharp Copy
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 Copy
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. Вращение User-Agent: Имитируйте реальные браузеры, чтобы избежать обнаружения.
  4. Обработка ошибок: Оберните код в блоки try-catch для обработки сетевых проблем.

Дисклеймер о соблюдении: Информация, представленная в этом блоге, предназначена только для справочных целей. CapSolver обязуется соблюдать все применимые законы и нормы. Использование сети CapSolver для незаконной, мошеннической или злоупотребляющей деятельности строго запрещено и будет расследовано. Наши решения для распознавания капчи улучшают пользовательский опыт, обеспечивая 100% соблюдение при помощи в решении трудностей с капчей в процессе сбора общедоступных данных. Мы призываем к ответственному использованию наших услуг. Для получения дополнительной информации, пожалуйста, посетите наши Условия обслуживания и Политику конфиденциальности.

Ещеe

Лучшие User Agent'ы для веб-скрапинга и как их использовать
Лучшие User Agent'ы для веб-скрапинга и как их использовать

Руководство по лучшим user agent'ам для веб-скрапинга и их эффективному использованию для предотвращения обнаружения. Изучите важность user agent'ов, их типов и способы их реализации для бесшовного и незаметного веб-скрапинга.

Logo of CapSolver

Nikolai Smirnov

07-Mar-2025

Как обойти защиту Cloudflare JS при веб-скрейпинге и автоматизации
Как обойти защиту Cloudflare JS при веб-скрапинге и автоматизации

Научитесь решать JavaScript-вызов Cloudflare для бесшовного веб-скрапинга и автоматизации. Откройте для себя эффективные стратегии, включая использование headless-браузеров, ротацию прокси и использование расширенных возможностей решения CAPTCHA от CapSolver.

Cloudflare
Logo of CapSolver

Nikolai Smirnov

05-Mar-2025

Отпечатки TLS в Cloudflare: что это такое и как их решить
Отпечатки TLS Cloudflare: что это и как это решить

Узнайте о применении Cloudflare TLS-фингерпринтинга в целях безопасности, как он обнаруживает и блокирует ботов, и изучите эффективные методы решения этой проблемы для веб-скрейпинга и автоматизированного просмотра.

Cloudflare
Logo of CapSolver

Nikolai Smirnov

28-Feb-2025

Почему меня постоянно просят подтвердить, что я не робот?
Почему меня постоянно просят подтвердить, что я не робот?

Узнайте, почему Google запрашивает подтверждение того, что вы не робот, и изучите решения, такие как использование API CapSolver для эффективного решения задач CAPTCHA.

Logo of CapSolver

Nikolai Smirnov

27-Feb-2025

Как извлечь данные с сайта, защищенного Cloudflare
Как извлечь данные с сайта, защищенного Cloudflare

В этом руководстве мы рассмотрим этичные и эффективные методы извлечения данных с веб-сайтов, защищенных Cloudflare.

Cloudflare
Logo of CapSolver

Ethan Collins

20-Feb-2025

Почему сайты считают меня ботом? И как это исправить
Почему сайты считают меня ботом? И как это исправить

Поймите, почему веб-сайты помечают вас как бота, и как избежать обнаружения. Ключевыми триггерами являются задачи CAPTCHA, подозрительные IP-адреса и необычное поведение браузера.

Logo of CapSolver

Nikolai Smirnov

20-Feb-2025