LSF-Funktionen
Diese Seite beschreibt die Funktionen aus hexscrapepy.lsf_scraper. Der
Schwerpunkt liegt auf LSF-Systemen: zuerst eine Veranstaltungsliste aufbauen,
dann die Detailseiten laden und in einzelne Inhaltsblöcke zerlegen.
Typischer Ablauf
Wenn du nicht mit Einzelparsern arbeiten willst, ist der typische Ablauf sehr einfach:
Mit lsf_scrape_all_semesters() einen kompletten Lauf starten.
Intern erzeugt das Paket zuerst die Basisdaten mit lsf_scrape_base_data(). Danach lädt es die Detailseiten mit lsf_scrape_veranstaltungsdetails(). Die kleineren lsf_extract_*-Funktionen lesen daraus die einzelnen Inhalte.
semester_liste = [
"Wintersemester 2005/2006",
]
lsf_scraper.scrape_lsf_all_semesters(
start_url="https://studiport.uni-flensburg.de/qisserver/rds?state=user&type=8&topitem=departments&breadCrumbSource==portal",
semester_liste=semester_liste,
output_dir="data/uni_flensburg",
method="path",
)
Wenn du nur einen Teil des Workflows brauchst:
lsf_scrape_base_data()ist für die Veranstaltungsliste zuständiglsf_scrape_veranstaltungsdetails()ergänzt zu vorhandenenURL_Event-Links die Detaildatenlsf_extract_*ist die Gruppe der kleineren Parser für einzelne Bereiche der Detailseite
Rollen der Funktionen
Öffentlich empfohlen
| Funktion | Rolle | Kurzbeschreibung |
|---|---|---|
lsf_scrape_base_data |
Basisdaten | sammelt alle Veranstaltungen eines oder mehrerer Semester und speichert die Ergebnisliste |
lsf_scrape_veranstaltungsdetails |
Detaildaten | öffnet vorhandene Veranstaltungs-Links und ergänzt Titel, Termine, Personen, Module und weitere Details |
lsf_scrape_all_semesters |
Wrapper | nimmt dir den kompletten Ablauf ab und führt Basislauf und Detail-Scraping nacheinander aus |
Modular nutzbar
| Funktion | Rolle | Kurzbeschreibung |
|---|---|---|
lsf_select_semester |
Navigation | stellt im LSF das gewünschte Semester ein und öffnet das Vorlesungsverzeichnis |
lsf_extract_veranstaltungstitel |
Extraktion | liest nur den sichtbaren Titel einer Veranstaltung |
lsf_extract_grunddaten |
Extraktion | liest die normalen Stammdaten wie Art, Nummer oder Semester aus dem Grunddaten-Block |
lsf_extract_termine |
Extraktion | liest die Termin-Tabelle einer Veranstaltung |
lsf_extract_dozenten |
Extraktion | liest die Tabelle der durchführenden Dozierenden |
lsf_extract_zugeordnete_personen |
Extraktion | liest weitere zugeordnete oder verantwortliche Personen |
lsf_extract_studiengaenge |
Extraktion | liest die zugeordneten Studiengänge |
lsf_extract_module |
Extraktion | liest die zugeordneten Module |
lsf_extract_einrichtung |
Extraktion | liest organisatorische Einheiten oder Einrichtungen |
lsf_extract_weitere_angaben |
Extraktion | liest den Sammelblock Weitere Angaben zur Veranstaltung als einzelne Felder |
lsf_extract_lerninhalt |
Extraktion | zieht aus den weiteren Angaben nur den Lerninhalt heraus |
lsf_extract_kommentar |
Extraktion | zieht aus den weiteren Angaben nur den Kommentar heraus |
lsf_fetch_course_html |
Abruf | lädt das rohe HTML einer Detailseite ohne Browser-Automation |
lsf_fetch_course_html_expanded |
Abruf | lädt die Detailseite mit Playwright, wenn Inhalte erst nach Klicks sichtbar werden |
Intern
| Funktion | Rolle | Kurzbeschreibung |
|---|---|---|
lsf_clean_text |
Helper | räumt Text auf und ersetzt leere Werte durch einen einheitlichen Platzhalter |
lsf_normalize_url |
Helper | macht Navigations-URLs vergleichbar, damit Knoten nicht doppelt besucht werden |
_scrape_via_path |
Workflow | interner Weg durch die Baumstruktur des Vorlesungsverzeichnisses |
_scrape_via_search |
Workflow | interner Weg über die Suchmaske |
_find_event_tables |
Parser | erkennt Tabellen, in denen wirklich Veranstaltungen stehen |
_parse_event_table |
Parser | liest eine gefundene Veranstaltungstabelle zeilenweise aus |
_find_lsf_section_table |
Parser | findet robuste Zieltabellen für einzelne Bereiche einer Detailseite |
_needs_expanded_lsf_fetch |
Steuerung | entscheidet, ob eine Detailseite noch einmal mit aufgeklappten Bereichen geladen werden muss |
_load_lsf_results_json |
Resume | lädt schon vorhandene Detaildaten für einen Resume-Lauf |
_write_lsf_results_json |
Resume | speichert Zwischenstände oder Endergebnisse als JSON |
_build_lsf_detail_frame |
Merge | bereitet Detaildaten so auf, dass sie sauber mit den Eingangsdaten zusammengeführt werden können |
Referenz
Komplettes Modul
hexscrapepy.lsf_scraper
lsf_clean_text(text)
Bereinige Freitext für Export und Parsing.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
Roher Text oder |
required |
Returns:
| Type | Description |
|---|---|
|
Bereinigter String mit normalisiertem Whitespace oder |
lsf_extract_dozenten(soup)
Extrahiert echte Dozenten-Tabellen aus einer LSF-Seite.
Wichtig:
Diese Funktion ist bewusst enger gefasst als lsf_extract_zugeordnete_personen.
Sie liest nur Tabellen, die tatsächlich als Durchführende Dozenten
ausgezeichnet sind. Allgemeine Personenblöcke wie Zugeordnete Person
werden hier nicht mehr mit ausgewertet.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
soup
|
BeautifulSoup
|
BeautifulSoup-Objekt der LSF-Seite |
required |
Returns:
| Type | Description |
|---|---|
DataFrame
|
DataFrame mit einer Zeile pro Person und den Spalten |
DataFrame
|
'dozierenden_name' und 'dozierenden_rolle' |
lsf_extract_einrichtung(soup)
Extrahiert den Einrichtungs-Block als verschachtelte Tabelle.
Anders als bei Studiengänge oder Module sind diese Tabellen oft
sehr klein und teils zweispaltig aufgebaut. Deshalb wird hier nicht blind
read_html verwendet, sondern die Tabelle zeilenweise in ein kleines
DataFrame übersetzt.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
soup
|
BeautifulSoup
|
BeautifulSoup-Objekt der LSF-Seite |
required |
Returns:
| Type | Description |
|---|---|
DataFrame
|
DataFrame mit einer Zeile und der Spalte |
lsf_extract_grunddaten(soup)
Lese den Block Grunddaten zur Veranstaltung strukturiert aus.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
soup
|
BeautifulSoup
|
Geparster HTML-Baum der Detailseite. |
required |
Returns:
| Type | Description |
|---|---|
dict
|
Einzeiliges DataFrame mit den erkannten Grunddaten oder ein leeres |
dict
|
DataFrame, wenn der Block fehlt. |
lsf_extract_kommentar(soup)
Extrahiert den Kommentar aus dem Block Weitere Angaben.
Zuerst wird die generische Extraktion über lsf_extract_weitere_angaben
versucht. Falls eine Uni stattdessen nur eine einzige kommentierende Zeile
ohne saubere Überschrift liefert, gibt es darunter noch einen kleinen
Fallback für diesen Sonderfall.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
soup
|
BeautifulSoup
|
BeautifulSoup-Objekt der LSF-Seite |
required |
Returns:
| Type | Description |
|---|---|
DataFrame
|
DataFrame mit einer Zeile und einer Spalte 'kommentar'. |
lsf_extract_lerninhalt(soup)
Extrahiert Lerninhalte aus dem Block Weitere Angaben.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
soup
|
BeautifulSoup
|
BeautifulSoup-Objekt der LSF-Seite |
required |
Returns:
| Type | Description |
|---|---|
DataFrame
|
DataFrame mit einer Zeile und der Spalte |
lsf_extract_module(soup)
Extrahiert den Modul-Block als verschachtelte Tabelle.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
soup
|
BeautifulSoup
|
BeautifulSoup-Objekt der LSF-Seite |
required |
Returns:
DataFrame mit einer Zeile und der Spalte module.
lsf_extract_studiengaenge(soup)
Extrahiert den Studiengangs-Block als verschachtelte Tabelle.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
soup
|
BeautifulSoup
|
BeautifulSoup-Objekt der LSF-Seite |
required |
Returns:
| Type | Description |
|---|---|
DataFrame
|
DataFrame mit einer Zeile und der Spalte |
DataFrame
|
In dieser Zelle liegt wiederum ein DataFrame mit den Originalspalten |
DataFrame
|
der Studiengangstabelle. |
lsf_extract_termine(soup)
Lese alle Terminzeilen einer LSF-Detailseite aus.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
soup
|
BeautifulSoup
|
Geparster HTML-Baum der Detailseite. |
required |
Returns:
| Type | Description |
|---|---|
DataFrame
|
DataFrame mit einer Zeile pro Termin. |
lsf_extract_veranstaltungstitel(soup)
Lese den sichtbaren Veranstaltungstitel aus einer LSF-Detailseite.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
soup
|
BeautifulSoup
|
Geparster HTML-Baum der Detailseite. |
required |
Returns:
| Type | Description |
|---|---|
DataFrame
|
Einzeiliges DataFrame mit der Spalte |
DataFrame
|
leeres DataFrame, wenn kein Titel erkannt wurde. |
lsf_extract_weitere_angaben(soup)
Extrahiert alle Felder aus Weitere Angaben zur Veranstaltung.
Die LSF-Ansicht kapselt diesen Bereich teils in auf-/zuklappbare Container
(z.B. veranst_slide_inhalt). Für das Parsing ist das unkritisch, solange
die Tabelle im HTML enthalten ist. Diese Funktion liest deshalb die
Tabellenzeilen generisch aus und liefert eine einzige Zeile mit allen
vorhandenen Feldern zurück.
lsf_extract_zugeordnete_personen(soup)
Extrahiert die zugeordneten Personen als verschachtelte Tabelle.
Diese Funktion ist für LSF-Blöcke wie Zugeordnete Person oder
Verantwortliche Dozenten gedacht. Das Ergebnis wird bewusst als
verschachtelte Tabelle zurückgegeben, damit die Struktur aus dem HTML
möglichst erhalten bleibt.
Rückgabespalten der inneren Tabelle:
- zugeordnete_person
- zustaendigkeit
lsf_fetch_course_html(url, timeout=30)
Lade das rohe HTML einer LSF-Veranstaltungsseite per HTTP.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
url
|
str
|
URL der Veranstaltungsdetailseite. |
required |
timeout
|
int
|
Timeout des HTTP-Requests in Sekunden. |
30
|
Returns:
| Type | Description |
|---|---|
str
|
Rohes HTML der Antwort als String. |
lsf_fetch_course_html_expanded(url, timeout_ms=30000)
Lade eine LSF-Detailseite mit aufgeklappten Toggle-Bereichen.
Einige LSF-Installationen rendern Bereiche wie Inhalt oder
Zugeordnete Person erst nach einem Klick auf veranst_toggle_*.
Dieser Fallback nutzt Playwright und gibt anschließend das erweiterte HTML zurück.
lsf_normalize_url(url)
Normalisiere LSF-URLs für Duplikaterkennung beim Crawling.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
url
|
Rohe URL aus der LSF-Navigation. |
required |
Returns:
| Type | Description |
|---|---|
|
Stabile Knotenkennung wie |
|
|
kein interpretierbarer |
lsf_scrape_all_semesters(start_url, semester_liste, output_dir, url_column='URL_Event', method='path', include_html=True, html_column='html')
Führe den vollständigen LSF-Workflow für mehrere Semester aus.
Pro Semester werden Basisdaten erzeugt, Duplikate entfernt, Detailseiten gescrapt und die Ergebnisse in semesterbezogenen Dateien gespeichert.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
start_url
|
str
|
LSF-Start-URL der Universität. |
required |
semester_liste
|
Liste der gewünschten Semesterbezeichnungen. |
required | |
output_dir
|
str
|
Zielordner für alle erzeugten Dateien. |
required |
url_column
|
str
|
Spalte mit Veranstaltungs-URLs für das Detail-Scraping. |
'URL_Event'
|
method
|
str
|
Methode für den Basislauf, entweder |
'path'
|
include_html
|
bool
|
Wenn |
True
|
html_column
|
str
|
Name der Spalte für das rohe HTML. |
'html'
|
Returns:
| Type | Description |
|---|---|
dict
|
Dictionary mit Semestername als Schlüssel und gescraptem DataFrame als Wert. |
lsf_scrape_base_data(start_url=DEFAULT_START_URL, semester_liste=None, output_dir=None, method='path')
Erzeuge die Basisdaten eines oder mehrerer Semester aus einem LSF.
Die Funktion sammelt zunächst nur die Veranstaltungslisten und lädt noch keine Detailseiten einzelner Kurse.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
start_url
|
Start-URL der Ziel-LSF-Instanz. |
DEFAULT_START_URL
|
|
semester_liste
|
Liste der zu erhebenden Semesterbezeichnungen. |
None
|
|
output_dir
|
Zielordner für |
None
|
|
method
|
|
'path'
|
Returns:
| Type | Description |
|---|---|
|
Kein In-Memory-Ergebnis. Die Basisdaten werden in Dateien geschrieben. |
Raises:
| Type | Description |
|---|---|
ValueError
|
Wenn |
lsf_scrape_veranstaltungsdetails(df, url_column, include_html=False, html_column='html', existing_results=None, save_path=None, save_every=None)
Lade und parse LSF-Detailseiten für eine Liste von Veranstaltungs-URLs.
Ein vorgeschalteter Basislauf liefert typischerweise eine Tabelle mit
URL_Event. Diese Funktion ruft jede Detailseite auf und ergänzt daraus
Titel, Grunddaten, Termine, Personen, Studiengänge, Module und weitere Angaben.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
df
|
DataFrame
|
DataFrame mit einer Spalte für LSF-URLs. |
required |
url_column
|
str
|
Name der Spalte mit den URLs. |
required |
include_html
|
bool
|
Wenn |
False
|
html_column
|
str
|
Name der Spalte für das rohe HTML. |
'html'
|
existing_results
|
DataFrame | None
|
Bereits vorhandene Detaildaten für Resume-Läufe. |
None
|
save_path
|
str | Path | None
|
Optionaler JSON-Pfad für Checkpoints und finale Ergebnisse. |
None
|
save_every
|
int | None
|
Checkpoint-Intervall in Anzahl neu gescrapter URLs. |
None
|
Returns:
| Type | Description |
|---|---|
DataFrame
|
DataFrame mit den ursprünglichen Eingabedaten plus allen erfolgreich |
DataFrame
|
extrahierten Zusatzspalten. |
lsf_select_semester(page, semester_name)
Wechsle im LSF zum gewünschten Semester und öffne das Vorlesungsverzeichnis.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
page
|
Aktive Playwright-Seite. |
required | |
semester_name
|
str
|
Exakt sichtbare Semesterbezeichnung im Ziel-LSF. |
required |