0

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

из библиотек для бота я использую 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"```

  • https://ru.stackoverflow.com/questions/924219/%d0%9a%d0%b0%d0%ba-%d0%bf%d0%b0%d1%80%d1%81%d0%b8%d1%82%d1%8c-%d1%81%d0%b0%d0%b9%d1%82%d1%8b-%d1%81-%d0%b0%d0%b2%d1%82%d0%be%d1%80%d0%b8%d0%b7%d0%b0%d1%86%d0%b8%d0%b5%d0%b9?r=Saves_AllUserSaves – Сергей Ш Jan 30 '24 at 02:42

1 Answers1

0

Для получения расписания, сайт отправляет 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