Ключевые особенности
| Язык | C# |
| Фреймворк | .NET 9 |
| Тип проекта | Библиотека |
| Статус | Концепт |
| Лицензия | MIT |
| Nuget | |
| Загрузки | |
| Github | Laraue.Crawling |
Что такое краулер
Краулер - это программа, которая переходит по ссылкам, загружает контент из них и приводит полученные данные к структурированному виду. Извлеченные данные можно анализировать, хранить или использовать для различных целей, таких как исследование рынка или сравнение цен.
Первоначальное видение библиотеки
Было две идеи о том, что из себя может представлять ПО для краулинга.
Реализация в виде приложения
Это удобный для пользователя способ, позволяющий работать с программой людям, не имеющим навыков программирования. Предложению необходим интерфейс, в котором пользователи смогут создавать последовательность операций, необходимых для сбора данных.
Плюсы
- Удобство для пользователя: легко начать работу пользователям без знаний программирования
- Легче продвигать: когда интерфейс готов, легко создать GIF-анимации и видео, делать обучающие материалы и т.д.
Минусы
- Сложная реализация: создание интерфейса означает не только разработку фронтенда (что само по себе сложно), но и создание дополнительного слоя, которая будет преобразовывать понятный человеку вид в программный код. Любые правки в бэкенде могут потребовать правок на этом уровне и во фронтенде. Кажется, эту часть можно добавить в будущем, когда бэкенд станет стабильным.
- Ограничения: не все, что можно описать на полноценном языке программирования, можно описать с помощью интерфейса. Поскольку целью было создать что-то, что может собирать данные в любой ситуации, ограничения звучали плохо.
Реализация в виде библиотеки
Ориентированный на программистов способ работы с программой. Она будет написана на конкретном языке, и только пользователи, использующие этот язык, смогут с ней работать.
Плюсы
- Гибкость: когда библиотека следует принципам разработки ПО, она может позволить пользователям делать практически все, что они захотят.
- Меньше времени на разработку: продукт может быть создан на чистом C#.
- Дешевле поддержка: нет необходимости арендовать сервер БД.
- Использовать может кто угодно: лицензия MIT позволяет использовать библиотеку для любых целей.
Минусы
- Ограниченная аудитория: резко сокращает круг возможных пользователей до C# программистов.
- Сложнее начать: требуется скачать репозиторий и написать некоторый объем кода, чтобы получить рабочий пример.
Основные проблемы, которые призвана решить эта библиотека
- Уменьшить объем рутинной работы: написание типичного краулера несложно, но отнимает много времени у инженера.
- Упростить поддержку: иногда запрашиваемые ресурсы меняют свою структуру, и это приводит к переписыванию кода. Быстро разработанные краулеры часто имеют плохую архитектуру, и их легче полностью переписать, чем внести изменения.
- Улучшить тестируемость: строго типизированная библиотека должна показывать ошибки типов как можно раньше, а заданные свойства моделей можно тестировать как обычные C# классы.
Как использовать библиотеку
- Пользователи должны выбрать тип схемы краулинга. Выбранный класс определяет, какие действия будут доступны при работе краулера. Встроенные схемы сделаны для парсинга Статического html, Динамического html или даже Статического xml. Фактически, можно добавить реализацию практически для любой древовидной структуры; пользователю нужно реализовать класс парсера, например такой, для требуемого типа узла и набор связанных классов для определения методов узла.
- Затем пользователь строит схему, как показано в этих примерах для статического html и динамического html.
- Схему можно запустить через класс парсера для указанной схемы: статический html или динамический html. Или мини-пример:
public record OnePage(string Title) : ICrawlingModel;
var schema = new AngleSharpSchemaBuilder<OnePage>()
.HasProperty(x => x.Title, ".title")
.Build();
var parser = new AngleSharpParser(new NullLoggerFactory());
var model = await parser.RunAsync(schema, "<html><p class='title'>Hi</html>");
Assert.Equal("Hi", model.Title);Сложности
Основные решенные проблемы будут описаны в отдельных статьях
- Как библиотека может быть строго типизированной для клиента, несмотря на то, что внутренний слой использует нетипизированные делегаты и работает с
object. - Как создать общий API для синхронных и асинхронных случаев без увеличения объема кода.
- Как сделать API достаточно гибким, чтобы позволить заказчику делать даже то, что не предусмотрел разработчик.
Хронология
Июнь 2022 Базовая версия с поддержкой динамического и статического HTML парсинга. Окт 2022 Рефакторинг, разделяющий общую логику краулинга и детали, специфичные для конкретного режима. Апр 2023 Создан базовый класс для задачи краулера - хост ASP NET, который запускает краулинг по расписанию. Май 2024 Рефакторинг, позволивший добавлять новые краулеры для древовидных структур за один-два часа.
Реальные примеры использования
Библиотека широко используется в проекте SPB Real Estate. Краулеры основных сайтов с объявлениями, Avito и Cian, созданы с помощью библиотеки и запускаются как задачи.