/Matemaks-Scraper

Scraper dla matemaks.pl

Primary LanguagePython

⚠️ Brak wsparcia: Ten Scraper, jaki i wtyczka do Matemaks powinny działać, ale autor już dzięki tym narzędziom zakończył swoją przygodę maturalną i ich nie aktualizuje (na studiach używa się e-trapez, ale jego dostaniecie w paczkach od starszych roczników :P)

Matemaks Scraper

Czyli prosty scraper do matemaks.pl z obsługą logowania do matemaks.pl i pobierania danych dostępnych tylko po zalogowaniu.

Wymagania

- Python 3

- biblioteka Selenium

⚠️ Stara wersja Selenium: Jak widzisz Scraper działa ze starą wersją Selenium 4.2.0 (maj 2022), co może wiązać się z brakiem poprawek bezpieczeństwa. Sprawdź czy nie wykryto jakichś luk w zabezpieczeniach lub dostosuj kod do najnowszej wersji (nie powinno to być więcej niż kilka zmian).

Do działania Selenium potrzebny jest też sterownik. Obecna wersja tego scrapera obsługuje domyślnie przeglądarkę Google Chrome, dla której sterowniki znajdziesz tutaj.

Jeżeli chcesz odpalić scraper na Firefox, wystarczy w matemaks_scraper.py zamienić linię:

self.browser = webdriver.Chrome()

na

self.browser = webdriver.Firefox()

oczywiście musisz też mieć wtedy sterownik dla Firefox

Jak korzystać

Zaimportuj scraper

   # Importuje scraper
   from matemaks_scraper import MatemaksScraper

   # Importuje funcje pozwalające wyeksportować dane (opcjonalne)
   from export_functions import *

Zainicjuj scraper

   # Tworzy nową instancję scrapera
   scraper = MatemaksScraper()

   # Jeżeli nie podano danych logowania do matemaks.pl w config.py
   # to należy podać je podczas inicjalizacji klasy MatemaksScraper
   scraper = MatemaksScraper("login", "haslo")

Korzystaj z metod

Korzystaj z metod udostępnionych w ramach tego scraper'a.

Dostępne metody:

Zamknij otwartą przez scraper przeglądarkę

   # Zamyka przeglądarkę
   scraper.close_browser()

   # Można też tak :)
   del scraper

Wyeksportuj dane (opcjonalne)

Korzystaj z funkcji pozwalających zapisać uzyskane dane lub utwórz swoje własne rozwiązania.

Dostępne funkcje eksportujące:

Uzupełnij dane logowania w config.py (opcjonalne)

Dla łatwiejszego stosowania scraper'a można podać dane logowania do matemaks.pl w pliku config.py:

LOGIN = "[YOUR_LOGIN_TO_MATEMAKS_PL]"
PASSWORD = "[YOUR_PASSWORD_TO_MATEMAKS_PL]"

Metody klasy MatemaksScraper

get_questions(url, only_video_ids=False)

Zwraca słownik z wszystkimi pytaniami występującymi pod podanym adresem url.

Domyślnie zwracane są dane w następującej strukturze:

"id": { // id pytania
    "yt": string, // id flimu z odpowiedzią na youtube
    "ans": string, // odpowiedź do pytania (pusty string, string, html lub MathJax)
    "pts": string, // ilość punktów za pytanie
    "data": string, // data
}

only_video_ids == True spowoduje, że zwrócone dane będą wyglądać następująco:

// id pytania: id flimu z odpowiedzią na youtube
"id": "yt"

get_lessons_data(url, **kwargs)

Zwraca słownik z informacjami o lekcjach występujących pod podanym adresem url.

Domyślnie zwracane są dane w następującej strukturze:

{
    "number of lesson": { // numer lekcji
        "lvl": number, // poziom (1 dla matury podstawowej i 2 dla matury rozszerzonej),
        "yt": string, // id flimu z lekcją na youtube,
        "lesson_url": string, // url z ćwiczeniami do lekcji
        "questions": { // obiekt z pytaniami do lekcji
            "id": { // id pytania
                "yt": string, // id flimu z odpowiedzią na youtube
                "ans": string, // odpowiedź do pytania (pusty string, string, html lub MathJax)
                "pts": string, // ilość punktów za pytanie
                "data": string, // data
            }
            ...
        }
    }
    ...
}

only_questions == True spowoduje zwrócenie tylko pytań dla każdej lekcji:

{
    "number of lesson": { // numer lekcji
        "id": { // id pytania
            "yt": string, // id flimu z odpowiedzią na youtube
            "ans": string, // odpowiedź do pytania (pusty string, string, html lub MathJax)
            "pts": string, // ilość punktów za pytanie
            "data": string, // data
        }
        ...
    }
    ...
}

only_video_ids == True spowoduje, że zwrócone dane będą wyglądać następująco:

    {
    "numer lekcji": "id flimu z lekcją na youtube"
    ...
    }

get_basic_matura_course(**kwags)

Metoda pomocnicza, wywołuje get_lessons_data() z url strony zawierającej kurs maturalny na poziomie podstawowym. Adres url tej strony jest zapisany w config.py w stałej BASIC_MATURA_COURSE_URL.

Zwraca więc wszystkie informacje o lekcjach z kursu podstawowego. Metoda ta obsługuje flagi dostępne dla get_lessons_data() (czyli only_questions i only_video_ids).

get_extended_matura_course(**kwags)

Metoda pomocnicza, wywołuje get_lessons_data() z url strony zawierającej kurs maturalny na poziomie rozszerzonym. Adres url tej strony jest zapisany w config.py w stałej EXTENDED_MATURA_COURSE_URL.

Zwraca więc wszystkie informacje o lekcjach z kursu rozszerzonego. Metoda ta obsługuje flagi dostępne dla get_lessons_data() (czyli only_questions i only_video_ids).

get_all_matura_course(**kwargs)

Wywołuje get_basic_matura_course() oraz get_extended_matura_course()

Wygląda to w ten sposób:

return {
    "basic_matura": get_basic_matura_course(**kwargs),
    "extended_matura": get_extended_matura_course(**kwargs)
}

get_all_matura_questions(only_video_ids=False)

  1. Pobiera wszytskie pytania z zestawmi pytań (url do zestawów pobiera z config.py ze stałej QUESTIONS_COLLECTIONS_URLS)

  2. Następnie pobiera wszystkie pytania występujące w lekcjach zarówno w kursie podstawowym, jak i rozszerzonym (wywołuje get_all_matura_course(only_questions=True))

  3. Łączy pytania i zwraca w następującym układzie:

    {
        "id": { // id pytania
            "yt": string, // id flimu z odpowiedzią na youtube
            "ans": string, // odpowiedź do pytania (pusty string, string, html lub MathJax)
            "pts": string, // ilość punktów za pytanie
            "data": string, // data
        }
        ...
    }

    Jeżeli zaś only_video_ids zostanie ustawione na True, to dane będą zwracane w następujący sposób:

    {
     "id": "yt" // id pytania: id flimu z odpowiedzią na youtube
     ...
    }

close_browser()

Zamyka przeglądarkę otwartą w czasie inicjalizacji klasy MatemaksScraper.

generate_data_for_matemaks_extension()

Generuje dane potrzebne dla wtyczki Matemaks Extension

Funkcje exportujące

export_to_json(data, file_path=DEFAULT_OUTPUT_FILE_PATH)

Zapisuje data do pliku .json w ścieżce podanej jako drugi argument (domyślnie plik generuje się do ścieżki podanej w config.py w stałej DEFAULT_OUTPUT_FILE_PATH)