Асинхронный парсер расписания Тверского государственного университета (ТвГУ), работающий с публичным API сайта расписаний, и нормализирующий информацию в датаклассы.
Проект предназначен для получения, нормализации и экспорта расписаний (с преподавателями и местами проведения) учебных групп по факультетам в формате JSON.
API не имеет официальной документации (по крайней мере я не нашёл), поэтому парсер основан на фактическом анализе ответов сервера и реальных данных.
Выкладываю, чтобы у студентов было больше возможности быстрее создать свои проекты.
Проект не привязан к конкретному интерфейсу и может использоваться как:
- CLI-утилита
- источник данных для ботов
- backend-компонент для сервисов с расписанием
- Получение списка всех учебных групп ТвГУ
- Автоматическая группировка по факультетам
- Загрузка расписаний пар (основное учебное расписание)
- Нормализация данных:
- дни недели
- чётность недели (пара по каждой неделе, минусовой или плюсовой)
- номера пар
- временные интервалы
- тип занятия (лекция, практика, лабораторная работа и т.д.)
- преподаватели
- места проведения
- подгруппы
- Устойчивость к неполным и некорректным данным API
- Асинхронная загрузка с контролем числа соединений
- Экспорт в JSON (с форматированием или без)
- Форматы имён групп и структура данных могут меняться (по возможности буду адаптировать шаблоны)
- Парсинг названий групп основан на накопленной мною практике и может быть доработан со временем
- В парсере намеренно отсутствует жёсткая валидация — приоритет отдан устойчивости
- Python 3.10+
- Зависимости:
aiohttprequests
Установка зависимостей:
pip install aiohttp requestspython -m tvgu_schedule_parserВ этом режиме данные загружаются, но никуда не сохраняются: бесполезно
python -m tvgu_schedule_parser --output schedules.json --prettify --warnings--output schedules.json – Файл для экспорта в JSON формате
--prettify – Форматировать вывод (с отступами и переносом строк)
--warnings – Выводить в консоль предупреждения (например, при невалидных группах).
Используйте функцию get_all_tvgu_schedules() – просто вызывайте её (не забудьте await) и получите через несколько секунд расписание всех групп.
Формат возвращаемого значения: dict[str, dict[Group, tuple[Lesson]]] – Словарь с ключом в виде кода факультета, затем значение со словарём с ключом в виде группы и значением в виде списка пар.
Структурируйте по неделе сами.
Выходной JSON имеет следующую структуру:
{
"Название факультета": {
"КОД-ГРУППА": [
{
"lesson_number": 0,
"week_day": 1,
"week_mark": "every",
"time_start": 540,
"time_end": 615,
"subject_name": "Название дисциплины",
"subject_type": "lecture",
"place": "Аудитория",
"teachers": [
{
"fullname": "Фамилия И.О.",
"role": "должность"
}
],
"subgroup": null
}
]
}
}Время указывается в минутах от начала суток.
Константные значения смотрите в файле consts.py
Может быть и такой вариант:
{
"Название факультета": {
"КОД-ГРУППА": null
}
}В случае, если у группы нет расписания
Свободное использование. Не несу ответственности за изменения в API или структуре данных со стороны ТвГУ.
Если ты используешь парсер или он тебе помог, то прошу лишь поставить звёздочку репозиторию)