Разработка консольного приложения на языке C# (.NET) для автоматизированного сбора данных из двух источников: через API и путем веб-скрапинга HTML-страниц, с последующим сохранением в реляционную (SQLite) и документоориентированную (MongoDB) базы данных.
- API: GitHub REST API
- Документация: GitHub REST API Documentation - (https://docs.github.com/en/rest)
- Сущности: Пользователи (
GitHubUser) и репозитории (GitHubRepo). - Хранилище: SQLite (через EF Core).
- Функционал: Получение данных профиля, списка репозиториев и подписчиков пользователя (с последующим сохранением в бд как отдельные пользователи).
- Библиотека: AngleSharp.
- Что извлекается:
- Заголовок: тег 'title'
- Заголовки: теги 'h1' и 'h2'
- Ссылки: первые 5 тегов 'a'
- Мета-данные: описание страницы из meta[name='description']
- Контент: первые 500 символов текстового содержимого 'body'
- Списки: первые 3 элемента 'li'
- Хранилище: MongoDB.
- Ошибки: Обработка 404 ошибок, неверных URL и отсутствующих HTML-страниц.
- Установленный .NET 10 SDK.
- Запущенный экземпляр MongoDB по адресу
mongodb://localhost:27017(или другом, настраивается в appsettings.json).
- Склонируйте репозиторий.
- В корне проекта найдите файл
appsettings.example.json, при заполненииappsettings.jsonобращайте внимание на него как на пример,appsettings.jsonсоздайте в папке проекта InternetTechLab1. - Откройте файл
appsettings.json, добавьте нужные вам настройки подключения к базам данных или оставьте существующие.
cd InternetTechLab1
dotnet build
dotnet runЭтот модуль отвечает за высокоуровневую навигацию по приложению и выбор конкретной технологии работы с данными. Он содержит следующие пункты:
- Модуль A — Получение данных из GitHub через API -> сохранение в реляционную БД: Переход к функционалу взаимодействия с GitHub и классическими SQL-базами данных.
- Модуль B — Web Scraping по URL -> сохранение в документоориентированную БД: Переход к функционалу извлечения данных с веб-страниц и работы с NoSQL-хранилищами.
- Выход: Завершение работы программы.
Вложенное меню для работы с API GitHub и реляционной базой данных. Команды включают:
- Получить данные о текущем пользователе: Запрос базовой информации профиля (авторизованного или целевого пользователя).
- Репозитории: Получение списка репозиториев.
- Подписчики пользователя: Выгрузка списка фолловеров.
- Посмотреть базу данных: Вывод сохраненных из API записей, которые уже находятся в реляционной БД.
- Очистить базу данных: Полное удаление записей из таблиц реляционной БД.
- Найти пользователя в базе данных: Поиск по уже сохраненным локально данным без обращения к API.
- Выход: Возврат в главное меню.
Вложенное меню для парсинга веб-ресурсов и работы с документоориентированной (NoSQL) базой данных. Команды включают:
- Web Scraping по URL: Запуск процесса извлечения контента по указанной ссылке.
- Посмотреть результаты Scraping: Отображение документов, сохраненных в базе данных после парсинга.
- Очистить базу данных: Удаление всех документов из коллекции документоориентированной БД.
- Выход: Возврат в главное меню.
Описывает данные профиля пользователя, полученные из API.
- Id (int) — [Key] Первичный ключ. Уникальный внутренний идентификатор записи в базе данных.
- Login (string?) — Уникальный текстовый никнейм пользователя на GitHub (используется в URL).
- AvatarUrl (string?) — Прямая ссылка на изображение профиля (аватар).
- HtmlUrl (string?) — Веб-адрес страницы пользователя в браузере (например,
github.com/username). - Name (string?) — Отображаемое имя пользователя (может быть не заполнено).
- Company (string?) — Информация о месте работы или организации.
- Location (string?) — Указанное пользователем местоположение (город, страна).
- Bio (string?) — Текстовое описание профиля («О себе»).
- PublicRepos (int) — Счетчик всех публичных репозиториев пользователя.
- Followers (int) — Общее количество подписчиков аккаунта.
- Following (int) — Количество аккаунтов, на которые подписан данный пользователь.
- CreatedAt (DateTime?) — Точная дата и время регистрации аккаунта на GitHub.
- Email (string?) — Публичный адрес электронной почты (если доступен).
- Repositories (List GitHubRepoEntity ) — [Navigation Property] Коллекция связанных объектов репозиториев, которыми владеет пользователь.
- FollowersList (List GitHubUserEntity ) — [Self-Referencing] Список объектов того же типа, представляющий конкретных подписчиков, сохраненных в БД.
Описывает данные о конкретных репозиториях.
- Id (int) — [Key] Первичный ключ. Уникальный идентификатор репозитория.
- Name (string?) — Краткое название проекта.
- FullName (string?) — Полное имя репозитория, включающее логин владельца (например,
owner/repo). - Description (string?) — Краткое описание предназначения проекта.
- HtmlUrl (string?) — Ссылка на страницу репозитория на GitHub.
- IsPrivate (bool) — Признак доступности (true — приватный, false — публичный).
- Language (string?) — Основной язык программирования, на котором написан код.
- StargazersCount (int) — Количество «звезд» (лайков), поставленных пользователями.
- ForksCount (int) — Количество созданных ответвлений (форков) проекта.
- CreatedAt (DateTime?) — Дата создания репозитория.
- OwnerId (int?) — [ForeignKey] Внешний ключ, содержащий
Idвладельца из таблицыUsers. - Owner (GitHubUserEntity?) — [Navigation Property] Ссылка на полноценный объект владельца (позволяет обращаться к данным автора через объект проекта).
Хранит неструктурированные или слабоструктурированные данные, полученные путем парсинга сайтов.
- Id (string?) — [BsonId] Уникальный идентификатор документа в формате MongoDB ObjectId.
- Url (string) — Полный веб-адрес страницы, с которой была собрана информация.
- DataType (string) — Метка типа данных. Примеры значений:
Title— заголовок страницы.Link— извлеченная гиперссылка.Meta— данные из мета-тегов.Unknown— неопределенный тип (значение по умолчанию).
- Value (string) — Само текстовое содержимое (текст заголовка, адрес ссылки или контент тега).
-
Связь "Один ко многим" (One-to-Many): Между
UsersиRepos. Один пользователь может иметь неограниченное количество репозиториев. В БД это реализовано через полеOwnerIdв таблице репозиториев, которое «смотрит» наIdв таблице пользователей. -
Рекурсивная связь (Self-Referencing): Рекурсивная связь «один ко многим» внутри таблицы Users позволяет хранить список подписчиков, где каждый элемент коллекции FollowersList является полноценным объектом пользователя того же типа. В БД это реализовано через скрытый внешний ключ внутри таблицы Users, который автоматически связывает Id основного пользователя с записями его подписчиков в этой же таблице.
-
Отсутствие связей: Модель
ScrapedItemEntityв MongoDB является независимой.
- 2 сценария представлены в виде схем в папке docs
Краткое описание сценариев:
- Сценарий
- Пользователь выбирает пункт 2, нажимая на клавиатупе на кнопки 'Стрелка вверх', 'Стрелка вниз' и вводит логин
octocat. - Приложение загружает JSON, мапит его в
GitHubUserEntityи сохраняет вgithub_lab.db.
- Сценарий
- Пользователь выбирает пункт 4 и вводит
https://github.com. - Парсер извлекает заголовок "GitHub: Let’s build from here", список ссылок и параметров, сохраняя их в MongoDB.
- Результаты проверяются через пункты 3 и 5 меню.
- Что извлекается:
- Заголовок: тег 'title'
- Заголовки: теги 'h1' и 'h2'
- Ссылки: первые 5 тегов 'a'
- Мета-данные: описание страницы из meta[name='description']
- Контент: первые 500 символов текстового содержимого 'body'
- Списки: первые 3 элемента 'li'
Приложение ведет асинхронное потокобезопасное логирование действий в файл log.txt.
Путь к файлу логов и параметры доступа настраиваются в appsettings.json.