Помогите с парсом сайта

Итак, суть такова, что мне нужно парсить расписание для бота ВК

из библиотек для бота я использую vkbottle

сайт: "https://rgsu.net/for-students/timetable/timetable/?filial=ВУЗ?mode=day&group=ЖУР-Б-0-Д-2020-1&date=2024-02-06&week=05"

Была такая попытка реализовать код парсера расписания, но он выводит, что расписания нет. Как я понимаю, что сайт как-то понимает, что это парсер и не выдаёт полный код страницы. Решения.. к сожалению я не нашёл, буду рад помощи:

import aiohttp
from bs4 import BeautifulSoup as BS 
from fake_useragent import UserAgent

BASE_URL = "https://rgsu.net/for-students/timetable/timetable/?filial=ВУЗ?mode=day&group=ЖУР-Б-0-Д-2020-1&date=2024-02-06&week=05" 
HEADERS = {"User-Agent": UserAgent().random}

bl = BotLabeler()

@bl.private_message(text="/расписание")
async def handle_timetable(message: Message):
    async with aiohttp.ClientSession() as session: 
        async with session.get(BASE_URL, headers=HEADERS) as response:
            r = await response.text() 
            soup = BS(r, "html.parser")
            
            timetable_items = soup.find_all("div", class_="n-timetable-day__item")
    
            if len(timetable_items) == 0:
                await message.answer("Расписание не найдено")
            else:
                for item in timetable_items:
                    time = item.find("div", class_="n-timetable-day__time")
                    time_from = time.find("span", class_="n-timetable-day__from").text
                    time_to = time.find("span", class_="n-timetable-day__to").text
                    
                    title = item.find("h3", class_="n-timetable-card__title")
                    subject = title.text
                    
                    category = item.find("div", class_="n-timetable-card__category")
                    category_text = category.text
                    
                    teacher = item.find("div", class_="n-timetable-card__affiliation")
                    teacher_text = teacher.text.strip()
                    
                    location = item.find("div", class_="n-timetable-card__address")
                    location_text = location.text.strip()
                    
                    auditorium = item.find("div", class_="n-timetable-card__auditorium")
                    auditorium_text = auditorium.text.strip()
                    
                    message_text = f"Время: {time_from} - {time_to}\n" \
                                f"Предмет: {subject}\n" \
                                f"Категория: {category_text}\n" \
                                f"Преподаватель: {teacher_text}\n" \
                                f"Место проведения: {location_text}\n" \
                                f"Аудитория: {auditorium_text}\n\n"```

Ответы (1 шт):

Автор решения: ByteBlunder

Для получения расписания, сайт отправляет POST запрос на этот адрес:
https://rgsu.net/for-students/timetable/timetable/novyy-format-den-json.html?filial=ВУЗ

Вы может посмотреть, какие заголовки передаются в него, через мониторинг HTTP-запросов в инструменте разработчика (F12).


Пример кода:

import requests
from bs4 import BeautifulSoup

url = "https://rgsu.net/for-students/timetable/timetable/novyy-format-den-json.html?filial=ВУЗ"
data = {
    "place": "first",
    "group": "ЖУР-Б-0-Д-2020-1",
    "mode": "day",
    "date": "2024-02-06",
    "week": "05",
    "month": "2",
    "year": "2024",
}
response = requests.post(url, data=data)

soup = BeautifulSoup(response.json()["html"], "html.parser")

for item in soup.select(".n-timetable-day__item"):
    time_from = item.select_one(".n-timetable-day__from").get_text(strip=True)
    time_to = item.select_one(".n-timetable-day__from").get_text(strip=True)
    subject = item.select_one(".n-timetable-card__title").get_text(strip=True)
    category = item.select_one(".n-timetable-card__category").get_text(strip=True)
    teacher = item.select_one(".n-timetable-card__affiliation").get_text(strip=True)
    location = item.select_one(".n-timetable-card__address").get_text(strip=True)
    auditorium = item.select_one(".n-timetable-card__auditorium").get_text(strip=True)
    print(
        f"Время: {time_from} - {time_to}\n"
        f"Предмет: {subject}\n"
        f"Категория: {category}\n"
        f"Преподаватель: {teacher}\n"
        f"Место проведения: {location}\n"
        f"Аудитория: {auditorium}\n\n"
    )

Вывод:

Время: 8:30 - 8:30
Предмет: Инновационные медиатехнологии в коммуникации
Категория: лекция
Преподователь: Полунина Ольга Сергеевна
Место проведения: ул. В Пика д.4
Аудитория: ауд. 312


Время: 10:10 - 10:10
Предмет: Инновационные медиатехнологии в коммуникации
Категория: лекция
Преподователь: Полунина Ольга Сергеевна
Место проведения: ул. В Пика д.4
Аудитория: ауд. 312


Время: 12:10 - 12:10
Предмет: Инновационные медиатехнологии в коммуникации
Категория: практическое занятие
Преподователь: Полунина Ольга Сергеевна
Место проведения: ул. В Пика д.4
Аудитория: ауд. 312


Время: 13:50 - 13:50
Предмет: Инновационные медиатехнологии в коммуникации
Категория: практическое занятие
Преподователь: Полунина Ольга Сергеевна
Место проведения: ул. В Пика д.4
Аудитория: ауд. 312
→ Ссылка