Створення вебкраулера на 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 and CsvHelper.

Крок 1: Налаштування середовища

Почніть зі створення нової консольної програми:

mkdir web-crawler
cd web-crawler
dotnet new console - framework net8.0

Installing Dependencies

Додайте такі бібліотеки за допомогою NuGet:

  • Html Agility Pack: Для парсингу HTML.
dotnet add package HtmlAgilityPack
  • Html Agility Pack CSS-селектори: Спрощує вибір елементів за допомогою CSS-селекторів.
dotnet add package HtmlAgilityPack.CssSelectors
  • CsvHelper: Для експорту даних у CSV-файли.
dotnet add пакет CsvHelper

Крок 2: Написання базового краулера

Завантаження вебсторінки

Налаштуйте програму для отримання й аналізу вебсторінки:

using HtmlAgilityPack;

class Program
{
    static void Main(string[] args)
    {
        var web = new 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 in links)
{
    var url = link.GetAttributeValue("href", string.Empty);
    Console.WriteLine($"Знайдено URL: {url}");
}

Крок 3: Керування процесом краулінгу

Щоб системно обходити кілька сторінок, ведіть чергу URL-адрес для відвідування та список виявлених URL-адрес, щоб уникнути дублювання.

Implementing URL Queueing

Використайте Queue для URL-адрес, які потрібно відвідати, та HashSet щоб відстежувати відвідані URL-адреси:

var urlsToVisit = new Queue<string>();
var visitedUrls = new HashSet<string>();

urlsToVisit.Enqueue("https://example.com");

while (urlsToVisit.Count > 0)
{
    var currentUrl = urlsToVisit.Dequeue();
    if (visitedUrls.Contains(currentUrl)) continue;

    visitedUrls.Add(currentUrl);
    Console.WriteLine($"Обхід: {currentUrl}");

    var currentDocument = web.Load(currentUrl);
    var links = currentDocument.DocumentNode.SelectNodes("//a[@href]");
    if (links == null) continue;

    foreach (var link in links)
    {
        var url = link.GetAttributeValue("href", string.Empty);
        if (!visitedUrls.Contains(url))
        {
            urlsToVisit.Enqueue(url);
        }
    }
}

Крок 4: Витягування даних зі сторінок

Structuring Data

Визначте Product class to store the scraped data:

public class Product
{
    public string Name { get; set; }
    public string Price { get; set; }
    public string ImageUrl { get; set; }
}

Scraping Products

Оновіть краулер, щоб знаходити й обробляти елементи товарів на кожній сторінці:

var products = new List<Product>();
foreach (var productNode in 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(new 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 = new StreamWriter("products.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
    csv.WriteRecords(products);
}

Запустіть застосунок, щоб згенерувати products.csv файл з усіма зібраними даними.

Крок 6: Оптимізація краулера

  • Parallel Crawling: Паралельно обходьте кілька сторінок, використовуючи Task.Run.
  • Handling Dynamic Content: Використовуйте PuppeteerSharp для сторінок, що рендеряться JavaScript.
  • Avoiding Blocks: Чергуйте user agents, дотримуйтеся robots.txt, і додавайте затримки.

Conclusion

Створення веб-краулера на C# — це насамперед про дослідження вебсторінок, витягування потрібних даних і забезпечення стабільної роботи. З цим посібником ви будете готові взятися за будь-який проєкт із вебданими. Удачі й приємного вебскрапінгу!

Схожі записи