Skip to content

mariasulgina/Collecting-data-from-REST-API

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

30 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

InternetTechLab1 — Сбор данных из Интернета

1. Цель работы

Разработка консольного приложения на языке C# (.NET) для автоматизированного сбора данных из двух источников: через API и путем веб-скрапинга HTML-страниц, с последующим сохранением в реляционную (SQLite) и документоориентированную (MongoDB) базы данных.


2. Модули системы

Модуль A: GitHub API (RDBMS)

  • API: GitHub REST API
  • Документация: GitHub REST API Documentation - (https://docs.github.com/en/rest)
  • Сущности: Пользователи (GitHubUser) и репозитории (GitHubRepo).
  • Хранилище: SQLite (через EF Core).
  • Функционал: Получение данных профиля, списка репозиториев и подписчиков пользователя (с последующим сохранением в бд как отдельные пользователи).

Модуль B: Web Scraping (DocDB)

  • Библиотека: AngleSharp.
  • Что извлекается:
    1. Заголовок: тег 'title'
    2. Заголовки: теги 'h1' и 'h2'
    3. Ссылки: первые 5 тегов 'a'
    4. Мета-данные: описание страницы из meta[name='description']
    5. Контент: первые 500 символов текстового содержимого 'body'
    6. Списки: первые 3 элемента 'li'
  • Хранилище: MongoDB.
  • Ошибки: Обработка 404 ошибок, неверных URL и отсутствующих HTML-страниц.

3. Инструкция по запуску

Предварительные требования

  1. Установленный .NET 10 SDK.
  2. Запущенный экземпляр MongoDB по адресу mongodb://localhost:27017 (или другом, настраивается в appsettings.json).

Настройка

  1. Склонируйте репозиторий.
  2. В корне проекта найдите файл appsettings.example.json, при заполнении appsettings.json обращайте внимание на него как на пример, appsettings.json создайте в папке проекта InternetTechLab1.
  3. Откройте файл appsettings.json, добавьте нужные вам настройки подключения к базам данных или оставьте существующие.

Запуск

cd InternetTechLab1
dotnet build
dotnet run

4. Описание меню команд

1. Главное меню (Main Menu)

Этот модуль отвечает за высокоуровневую навигацию по приложению и выбор конкретной технологии работы с данными. Он содержит следующие пункты:

  • Модуль A — Получение данных из GitHub через API -> сохранение в реляционную БД: Переход к функционалу взаимодействия с GitHub и классическими SQL-базами данных.
  • Модуль B — Web Scraping по URL -> сохранение в документоориентированную БД: Переход к функционалу извлечения данных с веб-страниц и работы с NoSQL-хранилищами.
  • Выход: Завершение работы программы.

2. Модуль А: Получение данных из GitHub

Вложенное меню для работы с API GitHub и реляционной базой данных. Команды включают:

  • Получить данные о текущем пользователе: Запрос базовой информации профиля (авторизованного или целевого пользователя).
  • Репозитории: Получение списка репозиториев.
  • Подписчики пользователя: Выгрузка списка фолловеров.
  • Посмотреть базу данных: Вывод сохраненных из API записей, которые уже находятся в реляционной БД.
  • Очистить базу данных: Полное удаление записей из таблиц реляционной БД.
  • Найти пользователя в базе данных: Поиск по уже сохраненным локально данным без обращения к API.
  • Выход: Возврат в главное меню.

3. Модуль B: Web Scraping по URL

Вложенное меню для парсинга веб-ресурсов и работы с документоориентированной (NoSQL) базой данных. Команды включают:

  • Web Scraping по URL: Запуск процесса извлечения контента по указанной ссылке.
  • Посмотреть результаты Scraping: Отображение документов, сохраненных в базе данных после парсинга.
  • Очистить базу данных: Удаление всех документов из коллекции документоориентированной БД.
  • Выход: Возврат в главное меню.

5. Схема данных

5.1. Реляционная БД (SQLite / Entity Framework)

Таблица: Users (Модель GitHubUserEntity)

Описывает данные профиля пользователя, полученные из API.

  1. Id (int)[Key] Первичный ключ. Уникальный внутренний идентификатор записи в базе данных.
  2. Login (string?) — Уникальный текстовый никнейм пользователя на GitHub (используется в URL).
  3. AvatarUrl (string?) — Прямая ссылка на изображение профиля (аватар).
  4. HtmlUrl (string?) — Веб-адрес страницы пользователя в браузере (например, github.com/username).
  5. Name (string?) — Отображаемое имя пользователя (может быть не заполнено).
  6. Company (string?) — Информация о месте работы или организации.
  7. Location (string?) — Указанное пользователем местоположение (город, страна).
  8. Bio (string?) — Текстовое описание профиля («О себе»).
  9. PublicRepos (int) — Счетчик всех публичных репозиториев пользователя.
  10. Followers (int) — Общее количество подписчиков аккаунта.
  11. Following (int) — Количество аккаунтов, на которые подписан данный пользователь.
  12. CreatedAt (DateTime?) — Точная дата и время регистрации аккаунта на GitHub.
  13. Email (string?) — Публичный адрес электронной почты (если доступен).
  14. Repositories (List GitHubRepoEntity )[Navigation Property] Коллекция связанных объектов репозиториев, которыми владеет пользователь.
  15. FollowersList (List GitHubUserEntity )[Self-Referencing] Список объектов того же типа, представляющий конкретных подписчиков, сохраненных в БД.

Таблица: Repos (Модель GitHubRepoEntity)

Описывает данные о конкретных репозиториях.

  1. Id (int)[Key] Первичный ключ. Уникальный идентификатор репозитория.
  2. Name (string?) — Краткое название проекта.
  3. FullName (string?) — Полное имя репозитория, включающее логин владельца (например, owner/repo).
  4. Description (string?) — Краткое описание предназначения проекта.
  5. HtmlUrl (string?) — Ссылка на страницу репозитория на GitHub.
  6. IsPrivate (bool) — Признак доступности (true — приватный, false — публичный).
  7. Language (string?) — Основной язык программирования, на котором написан код.
  8. StargazersCount (int) — Количество «звезд» (лайков), поставленных пользователями.
  9. ForksCount (int) — Количество созданных ответвлений (форков) проекта.
  10. CreatedAt (DateTime?) — Дата создания репозитория.
  11. OwnerId (int?)[ForeignKey] Внешний ключ, содержащий Id владельца из таблицы Users.
  12. Owner (GitHubUserEntity?)[Navigation Property] Ссылка на полноценный объект владельца (позволяет обращаться к данным автора через объект проекта).

5.2. Документоориентированная БД (MongoDB)

Коллекция: ScrapedItems (Модель ScrapedItemEntity)

Хранит неструктурированные или слабоструктурированные данные, полученные путем парсинга сайтов.

  1. Id (string?)[BsonId] Уникальный идентификатор документа в формате MongoDB ObjectId.
  2. Url (string) — Полный веб-адрес страницы, с которой была собрана информация.
  3. DataType (string) — Метка типа данных. Примеры значений:
    • Title — заголовок страницы.
    • Link — извлеченная гиперссылка.
    • Meta — данные из мета-тегов.
    • Unknown — неопределенный тип (значение по умолчанию).
  4. Value (string) — Само текстовое содержимое (текст заголовка, адрес ссылки или контент тега).

5.3. Описание связей

  • Связь "Один ко многим" (One-to-Many): Между Users и Repos. Один пользователь может иметь неограниченное количество репозиториев. В БД это реализовано через поле OwnerId в таблице репозиториев, которое «смотрит» на Id в таблице пользователей.

  • Рекурсивная связь (Self-Referencing): Рекурсивная связь «один ко многим» внутри таблицы Users позволяет хранить список подписчиков, где каждый элемент коллекции FollowersList является полноценным объектом пользователя того же типа. В БД это реализовано через скрытый внешний ключ внутри таблицы Users, который автоматически связывает Id основного пользователя с записями его подписчиков в этой же таблице.

  • Отсутствие связей: Модель ScrapedItemEntity в MongoDB является независимой.


6. Примеры пользовательских сценариев

  • 2 сценария представлены в виде схем в папке docs

Краткое описание сценариев:

  1. Сценарий
  1. Пользователь выбирает пункт 2, нажимая на клавиатупе на кнопки 'Стрелка вверх', 'Стрелка вниз' и вводит логин octocat.
  2. Приложение загружает JSON, мапит его в GitHubUserEntity и сохраняет в github_lab.db.
  1. Сценарий
  1. Пользователь выбирает пункт 4 и вводит https://github.com.
  2. Парсер извлекает заголовок "GitHub: Let’s build from here", список ссылок и параметров, сохраняя их в MongoDB.
  3. Результаты проверяются через пункты 3 и 5 меню.

7. Что именно скрапится и по каким селекторам

  • Что извлекается:
    1. Заголовок: тег 'title'
    2. Заголовки: теги 'h1' и 'h2'
    3. Ссылки: первые 5 тегов 'a'
    4. Мета-данные: описание страницы из meta[name='description']
    5. Контент: первые 500 символов текстового содержимого 'body'
    6. Списки: первые 3 элемента 'li'

Логирование

Приложение ведет асинхронное потокобезопасное логирование действий в файл log.txt. Путь к файлу логов и параметры доступа настраиваются в appsettings.json.


About

Сбор данных из интернета. Модуль A — Получение данных через API и сохранение в реляционную БД. Модуль B — Web Scraping по URL и сохранение в документоориентированную БД.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages