Создание веб-краулера на C#

Создание веб-краулера на 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# сводится к обходу веб-страниц, извлечению нужных данных и обеспечению стабильной работы. С этим руководством вы будете готовы взяться за любой проект, связанный с веб-данными. Удачи и приятного краулинга!

Похожие записи