C# Веб-скрейпинг: Как собирать общедоступные веб-данные
TL;DR
Веб-скрейпинг на C# обычно сочетает HttpClient для получения данных с парсером, таким как AngleSharp, для извлечения HTML.
Используйте браузерную автоматизацию, когда требуемый контент появляется только после выполнения JavaScript или одобренного взаимодействия.
Повторное использование HTTP-соединений, установка пределов по времени и ответам, а также отклонение неожидаемого контента перед парсингом бизнес-полей.
Валидируйте идентичность записи, количество полей, числовые форматы и отсутствующие значения отдельно от успешного HTTP.
Управляемый API для получения может обеспечить .NET конвейер без необходимости в нативном C# SDK.
Nstdata Crawl предоставляет выходы страниц, готовых для LLM, ограниченное открытие, рендеринг и встроенную маршрутизацию; ваш .NET сервис по-прежнему отвечает за прием бизнеса.
Как работает веб-скрейпинг на C#?
Веб-скрейпинг на C# осуществляется путем получения одобренной страницы, парсинга ее содержимого, выбора требуемых элементов и валидации полученных записей. Нормальная отправная точка — это HttpClient плюс HTML-парсер. Если начальный HTML не содержит фактов, может потребоваться браузер или управляемая служба рендеринга. Руководство по веб-скрейпингу на C# должно делать это различие перед добавлением зависимостей автоматизации.
C# полезен, когда собирающий инструмент должен находиться рядом с существующими API .NET, фоновыми службами, типизированными доменными моделями и операционными инструментами. Статические типы помогают выразить контракт, но правильно типизированная величина все еще может принадлежать неправильному продукту. Проверьте идентичность источника и бизнес-значение перед записью записи ниже по течению.
Nstdata Crawl — это один из вариантов, когда вашей команде .NET необходимо потреблять полученный контент, а не управлять браузером и прокси-слоем. Держите сбор и валидацию домена раздельно, чтобы можно было заменить любую реализацию, не переопределяя, что составляет принятую запись.
Что вам нужно перед тем, как начать?
Подготовьте поддерживаемый SDK .NET, каталог проекта, одобренный тестовый источник и явную схему записи. Метод статической страницы ниже был выполнен с .NET SDK 10.0.404 и AngleSharp 1.10.2 против публичной страницы тестовой HTML таблицы. Рассматривайте это как протестированные версии, а не утверждение о том, что будущие установки разрешают те же пакеты.
Попробуйте Nstproxy Crawl - Начните Бесплатно Уже Сегодня
Контракт таблицы прост: одно незаполненное имя и одна десятичная сумма на строку, с уникальными именами в этом демонстрационном проекте. Установите SDK из поддерживаемого дистрибутива Microsoft. Создайте консольный проект с помощью команды dotnet new console -n TableCollector, перейдите в этот каталог и добавьте протестированный парсер с помощью команды dotnet add package AngleSharp --version 1.10.2.
Для браузерной автоматизации пакет Playwright и его двоичные файлы браузера являются отдельными требованиями. Для управляемого метода вам также нужна учетная запись Nstdata, API-ключ, Python 3.10 или новее для демонстрируемого рабочего, и одобрение для целевого URL. Никакие реальные учетные данные не должны размещаться в исходном файле, журнале приложения или репозитории.
Как выбрать между тремя методами?
Выбирайте прямой HTTP для полезного начального HTML, браузер для наблюдаемого контента, зависящего от JavaScript, и управляемое получение, когда управление этой инфраструктурой является ограничением.
Метод
Полезно, когда
Вы управляете
Основная проверка приема
HttpClient + AngleSharp
Требуемые поля есть в возвращенном HTML
Получение, парсер, планирование
Корректная семантика таблицы и полей
Playwright .NET
Контент требует рендеринга или взаимодействия
Жизненный цикл браузера и извлечение
Значимое условие готовности
Рабочий Nstdata Crawl
Вам нужна граница API-получения
Парсинг домена и последующий поток работы
Успех задачи и используемый исходный контент
Сравнение C# и Python охватывает торговые-offs экосистем. Ни смена языков, ни добавление браузера не исправляют неправильное определение записи.
Как собрать данные с HTML-страницы?
Соберите статический HTML с помощью ограниченного запроса HttpClient и извлеките поля с помощью DOM-парсера. Не парсите произвольный HTML с помощью регулярного выражения и не рассматривайте пустой результат как успешное обновление.
Метод 1: HttpClient и AngleSharp
Шаг 1: Добавьте программу извлечения
Замените Program.cs проекта следующим кодом. Он запрашивает одну публичную демонстрационную страницу, ограничивает буферизованный ответ, проверяет HTML и извлекает известную таблицу. Руководство по парсеру AngleSharp документирует парсер и модель выбора DOM.
usingSystem.Globalization;usingSystem.Text.Json;usingAngleSharp.Html.Parser;conststring url ="https://testpages.eviltester.com/pages/basics/html-tag-table/";usingvar handler =newHttpClientHandler{ AllowAutoRedirect =false};usingvar client =newHttpClient(handler){ Timeout = TimeSpan.FromSeconds(30), MaxResponseContentBufferSize =1_048_576};usingvar response =await client.GetAsync(url);response.EnsureSuccessStatusCode();if(response.Content.Headers.ContentType?.MediaType !="text/html")thrownewInvalidOperationException("Ожидался HTML");var html =await response.Content.ReadAsStringAsync();var document =awaitnewHtmlParser().ParseDocumentAsync(html);var table = document.QuerySelector("table#mytable")??thrownewInvalidOperationException("Ожидаемая таблица отсутствует");var records =newList<object>();var seen =newHashSet<string>();foreach(var row in table.QuerySelectorAll("tr")){var cells = row.QuerySelectorAll("td");if(cells.Length ==0)continue;if(cells.Length !=2)thrownewInvalidOperationException("Неожиданная ширина строки");var name = cells[0].TextContent.Trim();var amount =decimal.Parse(cells[1].TextContent.Trim(), CultureInfo.InvariantCulture);if(name.Length ==0||!seen.Add(name))thrownewInvalidOperationException("Пустая или дублирующаяся идентичность"); records.Add(new{ name, amount });}if(records.Count ==0)thrownewInvalidOperationException("Нет записей");Console.WriteLine(JsonSerializer.Serialize(records));
Шаг 2: Запустите сборщик
Запустите dotnet run из каталога проекта. Проверяемая страница вернула четыре строки с именами Алан, Боб, Алистер и Дуглас и суммами 12, 23, 33.3 и 42. JSON содержит числовые суммы, потому что этот пример сериализует значения C# decimal.
Шаг 3: Проверьте исходный контракт
Сравните эти значения с исходной таблицей, прежде чем изменять селектор для другой страницы. Для вашего собственного источника определите фактический идентификатор, числовую локализацию, единицы измерения и политику отсутствующих значений. Символ валюты, разделитель тысяч или локализованный десятичный разделитель требуют целенаправленного парсинга, а не безусловного вызова decimal.Parse.
Демонстрация создает и уничтожает одного клиента для одного короткого запуска. Долгосрочная служба должна следовать рекомендациям по срокам службы HttpClient, включая надлежащее повторное использование соединений и поведение DNS. Избегайте создания нового пула соединений для каждого URL в крупной задаче.
Как вы обрабатываете контент, который появляется после выполнения JavaScript?
Обрабатывайте контент, зависимый от JavaScript, ожидая конкретного состояния, которое доказывает, что необходимые данные готовы. Запуск браузера и навигация по страницам сами по себе не доказывают, что бизнес-поля были загружены.
Метод 2: Playwright .NET
Шаг 1: Установите зависимость браузера
Создайте отдельный консольный проект .NET 10 с помощью dotnet new console -n RenderCheck, перейдите в его каталог и выполните dotnet add package Microsoft.Playwright --version 1.64.1. Руководство по установке Playwright .NET объясняет, почему пакет и бинарные файлы браузера являются отдельными зависимостями.
Используйте эту программу, чтобы доказать, что установленный вами браузер может выполнять отложенный скрипт и удовлетворять значимому утверждению. Это контролируемый HTML-образец, а не утверждение о доступе к внешнему динамическому веб-сайту. Сохраните программу как Program.cs, выполните dotnet run -- --install, чтобы вызвать установщик браузера пакета, а затем выполните dotnet run, чтобы выполнить проверку.
Шаг 3: Адаптируйте ожидание к утвержденному источнику
Для реального источника перейдите по утвержденному URL с помощью page.GotoAsync, затем замените утверждение образца на локатор, специфичный для источника, и ожидаемое состояние. Подтвердите идентичность или обязательное поле, а не просто наличие общего элемента body. Освобождайте контексты, когда работа завершена, и ограничьте количество одновременно активных страниц.
Если вывод пустой, проверьте, является ли страница запросом на вход, страницей согласия, страницей ошибки или незавершенным состоянием приложения. Практическое руководство по Playwright предоставляет более полную последовательность действий в браузере. Большее время ожидания не может решить отказ в разрешении или селектор, ориентированный на неправильный документ.
Как Nstdata Crawl может обеспечить рабочий процесс данных .NET?
Nstdata Crawl может обеспечить рабочий процесс .NET через сборщика, который возвращает проверенные артефакты страниц. Nstdata Crawl — это API веб-кравлинга для данных, готовых к LLM, которое может превратить одобренные разделы веб-сайтов в многоразовые входные данные. Обнаружение сайтов и рекурсивный кравлинг поддерживают ограниченный инвентарь источников. Рендеринг JavaScript может захватывать динамический контент до конверсии. Ваше приложение .NET может использовать артефакты и сохранять право собственности на типизированные записи, разрешение идентичности и бизнес-валидацию.
Форматы для отдельных потребителей: Markdown поддерживает RAG и агентов, HTML поддерживает парсинг DOM, ссылки поддерживают обнаружение, а PDF или скриншоты поддерживают инспекцию. Ответы, ориентированные на JSON, представляют собой структуры интеграции, а не доказательство того, что схема домена корректна.
Встроенный доступ к прокси: Стандартные управляемые вызовы наследуют маршрутизацию Nstdata без дополнительной конфигурации прокси Host, Port, Username, Password или Protocol. Просмотрите трафик прокси отдельно от использования URL в модели выставления счетов за Crawl.
Осведомленное получение задач: Проверьте завершение, успех, отсутствие вывода и частичный контент перед передачей файла или партии записей в службу .NET. Сохраните идентичность задачи для асинхронной работы, а не отправляйте снова после неопределенного ответа.
Метод 3: Используйте управляемого сборщика
Шаг 1: Настройте учетные данные сборщика
Получите свой API-ключ через Dashboard → Crawl Playground, установите nstdata-ai-crawl с Python 3.10 или новее и задайте NSTDATA_API_TOKEN плюс APPROVED_PAGE_URL. Установите EXPECTED_TEXT, когда требуемая исходная фраза может предоставить полезную первую проверку на приемлемость.
Шаг 2: Выполните сборщика
Сохраните следующее как nstdata_worker.py. Этот зависимый от учетных данных вызов требует вашего собственного ключа и одобренной цели; учебное пособие не утверждает об аутентифицированном производственном извлечении или встроенном C# SDK.
[Скриншот: Nstdata Crawl Playground с одобренной целью и запрашиваемым форматом; держите API-ключ в секрете.]
import os
from pathlib import Path
from nstdata_ai_crawl import NstDataClient, ScrapeRequestDto
with NstDataClient(os.environ["NSTDATA_API_TOKEN"], max_response_bytes=1_048_576)as client: result = client.submit_scrape_task_sync(ScrapeRequestDto( url=os.environ["APPROVED_PAGE_URL"], formats=["markdown"], onlyMainContent=True, timeout=60000,))if result.success isnotTrueor result.status !="completed":raise RuntimeError("Сбор данных не завершился успешно")if result.data isNoneor result.data.truncated isTrue:raise RuntimeError("Отсутствует или частичный контент требует проверки") text = result.data.get_markdown()ifnot text ornot text.strip():raise RuntimeError("Не возвращен usable Markdown") expected = os.environ.get("EXPECTED_TEXT")if expected and expected notin text:raise RuntimeError("Отсутствует требуемый исходный текст") Path("accepted-page.md").write_text(text, encoding="utf-8")print("Сохранен accepted-page.md; проверьте факты перед загрузкой")
Шаг 3: Передайте принятый контент в .NET
Поручите вашему исполнителю работы передать accepted-page.md и его исходные метаданные потребителю .NET после успешной работы сборщика. Файл достаточно для небольшой локальной демонстрации; повторяющиеся сервисы должны использовать явную очередь или контракт хранения. Если потребитель downstream требует полей таблицы, запросите подходящее HTML-представление и примените протестированный парсер домена, а не обрабатывайте Markdown как готовую таблицу.
Держите отклоненные выводы вне активного набора данных. Руководство по пакетному сбору объясняет, почему у отправленных страниц и одобренных страниц должны быть отдельные счета.
Какие ошибки должен обрабатывать производственный C# скрапер?
Производственный C# скрапер должен различать сбои передачи, контента, извлечения и принятия. Запишите ненастрашенный ID запроса или задачи, одобренный URL, номер попытки, стадию и причину, чтобы оператор мог определить неудачную границу.
Симптом
Вероятная причина
Ответ
HTTP успешный, без таблицы
Измененная разметка или тип страницы
Проверьте сохраненный HTML и отклоните обновление
Исключение разбора десятичных
Локаль, единицы или загрязнение поля
Нормализуйте в соответствии с контрактом источника
Тайм-аут браузера
Неправильное условие готовности или недоступные данные
Захватите артефакт проверки и проверьте состояние
Повторяющиеся дублирующиеся строки
Ошибка пагинации или идентификатора
Согласуйте идентификаторы перед сохранением
Управляемая задача остается незавершенной
Медленная или неудачная удаленная работа
Запрашивайте сохраненный идентификатор задачи в рамках ограниченной политики опроса
Повторяйте временные сбои с ограниченной политикой и сохраняйте последний принятый набор данных. Не повторяйте намеренное отказ вечно. Для нового источника начните с одной страницы и проверьте поведение, прежде чем добавлять планирование, параллелизм или рекурсивное открытие.
Что следует построить в первую очередь в .NET?
Постройте один конвейер с проверяемой записью с прямым HTTP, прежде чем добавлять браузеры или управляемое получение. Измерьте, какой этап фактически ограничивает правильность и обслуживание, затем выберите дополнительную инфраструктуру, которая решает эту проблему. Альтернативные HTML и визуальные выводы Nstdata могут помочь исследовать неудачное получение без изменения вашего контрактного домена .NET.
Q: Нужно ли C# использовать Selenium для каждого веб-скрейпера?
Нет. HttpClient и HTML парсер достаточно, если необходимый контент присутствует в начальном ответе.
Q: Автоматически ли AngleSharp рендерит произвольное JavaScript приложение?
Используемый здесь HTML парсер не воспроизводит полноценное браузерное приложение. Используйте подход рендеринга, когда необходимые факты зависят от JavaScript.
Q: Почему используете десятичные числа для образцов?
Десятичное число избегает округления двоичных чисел с плавающей точкой для этого простого числового контракта, но парсинг все равно требует правильной исходной локали и единиц.
Нет. Он проверяет выполнение установленного браузера и ожидание готовности на контролируемой конструкции, прежде чем вы адаптируете его к утвержденному источнику.
Q: Требует ли управляемый метод C# SDK?
Нет. Демонстрируемый работник использует проверенный Python SDK и передает принятые артефакты потребителю .NET через явную границу рабочего процесса.
Ivy Lin
Nov. 12th 2026
Сканируйте целые сайты одним API-запросом
Успешность 99,8% с рендерингом JavaScript
Получайте чистые данные для LLM в разных форматах
Преобразуйте любой сайт в Markdown, HTML, JSON, ссылки, PDF и другие форматы без управления инфраструктурой сканирования.