Создание веб-краулера на C#: пошаговое руководство
В этой статье я покажу, как создать веб-краулер на C#. Мы начнем с нуля, шаг за шагом. К концу у вас будет эффективный масштабируемый краулер, готовый к сбору необходимых данных.
Let’s get started!
Что такое веб-краулер?
Веб-краулер, паук или бот — это автоматизированная программа, которая систематически обходит веб-страницы, находит ссылки и собирает данные. В отличие от веб-скрапинга, который нацелен на извлечение конкретных данных, веб-краулинг сосредоточен на навигации по сайтам и построении структурной карты их содержимого. Краулеры также могут включать функции скрапинга, чтобы извлекать релевантные данные по мере перехода по ссылкам.
Сравните веб-краулинг и веб-скрейпин�� здесь.
Альтернатива созданию веб-краулера
Если создание и поддержка веб-краулера кажутся слишком сложными, Bright Data предлагает мощные альтернативы, которые упростят ваш рабочий процесс. Используйте Web Scraper API для беспроблемного структурированного извлечения данных или доступа к ним готовые к использованию наборы данных адаптированные под ваши потребности. Эти решения экономят время, легко масштабируются и включают такие функции, как решение CAPTCHA, ротация IP-адресов и соблюдение законов о конфиденциальности, позволяя вам сосредоточиться на анализе данных, а не на их сборе.
Я не связан с Bright Data, это всего лишь рекомендация.
Что нужно для создания веб-краулера на C#
Перед началом убедитесь, что у вас есть следующие инструменты и библиотеки:
- .NET SDK (версия 8 или новее): Скачайте и установите последнюю версию с официального сайта веб-сайт Microsoft .NET.
- IDE: Используйте Visual Studio 2022 или Visual Studio Code с расширением C#.
- NuGet Package Manager: Входит в состав Visual Studio и используется для установки зависимостей, таких как Html Agility Pack и CsvHelper.
Шаг 1: Настройка окружения
Начните с создания нового консольного приложения:
mkdir web-crawler
cd web-crawler dotnet new console - framework net8.0
Installing Dependencies
Добавьте следующие библиотеки через NuGet:
- Html Agility Pack: Для разбора HTML.
dotnet add пакет HtmlAgilityPack
- CSS-селекторы Html Agility Pack: Упрощает выбор элементов с помощью CSS-селекторов.
dotnet add package HtmlAgilityPack.CssSelectors
- CsvHelper: Для экспорта данных в CSV-файлы.
dotnet add пакет CsvHelper
Шаг 2: Написание базового краулера
Загрузка веб-страницы
Настройте программу для загрузки и разбора веб-страницы:
using HtmlAgilityPack;
класс Program
{
static void Main(string[] args)
{
var web = новый HtmlWeb();
var document = web.Load("https://example.com");
Console.WriteLine("Страница успешно загружена!");
}
}
Запустите приложение с помощью:
dotnet run
Discovering Links
Расширьте код, чтобы находить ссылки на странице. Используйте HtmlAgilityPack чтобы найти все <a> элементы и извлекать их href attributes:
var links = document.DocumentNode.SelectNodes("//a[@href]");
foreach (var link в links)
{
var url = link.GetAttributeValue("href", string.Empty);
Console.WriteLine($"Найден URL: {url}");
}
Шаг 3: Управление процессом обхода
Чтобы систематически обходить несколько страниц, ведите очередь URL-адресов для посещения и список уже обнаруженных URL-адресов, чтобы избежать дублирования.
Implementing URL Queueing
Используйте Queue для URL-адресов, которые нужно посетить, и HashSet для отслеживания посещённых URL-адресов:
var urlsToVisit = новый Queue<string>();
var visitedUrls = новый HashSet<string>();
urlsToVisit.Enqueue("https://example.com");
в то время как (urlsToVisit.Count > 0)
{
var currentUrl = urlsToVisit.Dequeue();
если (visitedUrls.Contains(currentUrl)) продолжить;
visitedUrls.Add(currentUrl);
Console.WriteLine($"Обход: {currentUrl}");
var currentDocument = web.Load(currentUrl);
var links = currentDocument.DocumentNode.SelectNodes("//a[@href]");
если (links == null) продолжить;
foreach (var link в links)
{
var url = link.GetAttributeValue("href", string.Empty);
если (!visitedUrls.Contains(url))
{
urlsToVisit.Enqueue(url);
}
}
}
Шаг 4: Извлечение данных со страниц
Structuring Data
Определите Product class to store the scraped data:
public класс Product
{
public string Name { получить; set; }
public string Price { получить; set; }
public string ImageUrl { получить; set; }
}
Scraping Products
Обновите краулер, чтобы находить и обрабатывать элементы товаров на каждой странице:
var products = новый List<Product>();
foreach (var productNode в currentDocument.DocumentNode.SelectNodes("//li[@class='product']"))
{
var name = productNode.SelectSingleNode(".//h2").InnerText.Trim();
var price = productNode.SelectSingleNode(".//span[@class='price']").InnerText.Trim();
var imageUrl = productNode.SelectSingleNode(".//img").GetAttributeValue("src", string.Empty);
products.Add(новый Product { Name = name, Price = price, ImageUrl = imageUrl });
Console.WriteLine($"Found product: {name}");
}
Шаг 5: Сохранение данных в CSV-файл
Use CsvHelper чтобы экспортир��вать собранные данные о товарах в CSV-файл:
using CsvHelper;
using System.Globalization;
using System.IO;
using (var writer = новый StreamWriter("products.csv"))
using (var csv = новый CsvWriter(writer, CultureInfo.InvariantCulture))
{
csv.WriteRecords(products);
}
Запустите приложение, чтобы сгенерировать products.csv файл со всеми собранными данными.
Шаг 6: Оптимизация краулера
- Parallel Crawling: Параллельно обходите несколько страниц, используя
Task.Run. - Handling Dynamic Content: Используйте
PuppeteerSharpдля страниц, отрисованных с помощью JavaScript. - Avoiding Blocks: Ротируйте user-agent'ы, соблюдайте
robots.txt, и добавляйте паузы.
Заключение
Создание веб-краулера на C# сводится к обходу веб-страниц, извлечению нужных данных и обеспечению стабильной работы. С этим руководством вы будете готовы взяться за любой проект, связанный с веб-данными. Удачи и приятного краулинга!

