Scraper BB: Brandenburg (StarWeb, Wahl 2029-09-23) #27

Closed
opened 2026-04-08 22:22:11 +02:00 by tobias · 2 comments
Owner

Wahltermin

2029-09-23 — Brandenburg (BB), aktuell 8. Wahlperiode.

Backend

Feld Wert
Doku-System StarWeb
Base-URL https://www.parlamentsdokumentation.brandenburg.de
dokukratie-Scraper bb
Drucksachen-Format 8/1234

Adapter-Strategie

StarWeb (5/6) — Wiederverwendung des generischen StarWebAdapters.

Was zu tun ist

  1. Live-Backend anschauen — falls SPA, HAR-Trace einer realen Suche aus DevTools ziehen (siehe Vorgehen in #12 für ParlDok bzw. #13 für eUI).
  2. Adapter in webapp/app/parlamente.py implementieren — entweder als neue Subklasse von ParlamentAdapter oder als zweiter Registry-Eintrag eines existierenden parametrisierbaren Adapters.
  3. Eintrag in der ADAPTERS-Registry am Ende der Datei.
  4. Smoke-Test lokal: ADAPTERS["BB"].search("Schule", limit=10) liefert echte Anträge mit Datum + Fraktionen, sortiert newest-first.
  5. Aktivierung via Folge-Issue (siehe Hängt mit … zusammen unten) — dieses Issue ist nur der Adapter selbst, nicht das Indexieren der Wahlprogramme oder das Frontend-aktiv-Setzen.

Akzeptanzkriterien

  • parlamente.py::ADAPTERS["BB"] existiert und ist instanziierbar
  • search(query="Schule", limit=10) liefert ≥3 echte Drucksachen mit korrektem Datum, Fraktionen, PDF-Link
  • get_document(drucksache) für eine reale Drucksache der laufenden WP liefert das Dokument zurück
  • download_text(drucksache) extrahiert Text aus dem PDF
  • Folge-Issue für Frontend-Aktivierung verlinkt
## Wahltermin **2029-09-23** — Brandenburg (BB), aktuell 8. Wahlperiode. ## Backend | Feld | Wert | |---|---| | Doku-System | `StarWeb` | | Base-URL | https://www.parlamentsdokumentation.brandenburg.de | | dokukratie-Scraper | `bb` | | Drucksachen-Format | `8/1234` | ## Adapter-Strategie **StarWeb (5/6)** — Wiederverwendung des generischen StarWebAdapters. ## Was zu tun ist 1. Live-Backend anschauen — falls SPA, HAR-Trace einer realen Suche aus DevTools ziehen (siehe Vorgehen in #12 für ParlDok bzw. #13 für eUI). 2. Adapter in `webapp/app/parlamente.py` implementieren — entweder als neue Subklasse von `ParlamentAdapter` oder als zweiter Registry-Eintrag eines existierenden parametrisierbaren Adapters. 3. Eintrag in der `ADAPTERS`-Registry am Ende der Datei. 4. Smoke-Test lokal: `ADAPTERS["BB"].search("Schule", limit=10)` liefert echte Anträge mit Datum + Fraktionen, sortiert newest-first. 5. Aktivierung via Folge-Issue (siehe `Hängt mit … zusammen` unten) — dieses Issue ist nur der Adapter selbst, nicht das Indexieren der Wahlprogramme oder das Frontend-aktiv-Setzen. ## Akzeptanzkriterien - [ ] `parlamente.py::ADAPTERS["BB"]` existiert und ist instanziierbar - [ ] `search(query="Schule", limit=10)` liefert ≥3 echte Drucksachen mit korrektem Datum, Fraktionen, PDF-Link - [ ] `get_document(drucksache)` für eine reale Drucksache der laufenden WP liefert das Dokument zurück - [ ] `download_text(drucksache)` extrahiert Text aus dem PDF - [ ] Folge-Issue für Frontend-Aktivierung verlinkt
Author
Owner

Hinweise aus dokukratie/bb.yml — Template-Issue für die StarWeb-Familie

Wenn dieses Issue zuerst angegangen wird, soll der Adapter so generisch werden dass HE/NI/RP/HB als zweite Registry-Einträge passen.

ELVIS Endpoint:

  • Endpoint: https://www.parlamentsdokumentation.brandenburg.de/starweb/LBB/ELVIS/servlet.starweb?path=LBB/ELVIS/LISSH.web&AdvancedSearch=yes
  • Form-Felder: LISSH_DTYP, LISSH_WP_ADV, LISSH_DatumV, LISSH_DatumB, LISSH_DART_ADV=DRUCKSACHE, __action=74,112,201
  • Pagination-Trick: NumPerSegment=1000000 und LimitMaximumHitCount="S99{ITEMS -1:-100000}" — alle Treffer auf einer Seite holen
  • Items: .//li[@name="RecordRepeater"]
  • PDF: .//div[@name="Repeat_DBE"]//a[@title="Gesamtdokument"]/@href
  • Pagination: .//ul[@class="pagination"]//li[@name="NextRecsConditional"]
  • Doc-Type: .//div[@name="Repeat_TYP"]//strong
  • Schlagworte: .//div[@name="Repeat_TYP"]//a[@name="LinkThes"]
  • Originatoren-Regex: (?P<originators_raw>.*)\s+(?P<interpellation_date>\d{2}\.\d{2}\.\d{4})\s?Drucksache\s?(?P<interpellation_reference>\d{1,2}\/\d+)

StarWebAdapter-Design — Konstruktor-Parameter:

StarWebAdapter(
    bundesland="BB",
    name="...",
    base_url="https://www.parlamentsdokumentation.brandenburg.de",
    servlet_path="/starweb/LBB/ELVIS/servlet.starweb",
    db_path="LBB/ELVIS/LISSH.web",
    wahlperiode=8,
    field_map={
        "wp": "LISSH_WP_ADV",
        "dart": "LISSH_DART_ADV",
        "dtyp": "LISSH_DTYP",
        "datv": "LISSH_DatumV",
        "datb": "LISSH_DatumB",
    },
    record_repeater_xpath='.//li[@name="RecordRepeater"]',
    pdf_xpath='.//div[@name="Repeat_DBE"]//a[@title="Gesamtdokument"]/@href',
)

Damit sind HE/NI/RP/HB jeweils nur ein Registry-Eintrag mit angepassten Pfaden + Field-Names. Siehe die jeweiligen anderen Issues für die BL-spezifischen Werte.

## Hinweise aus dokukratie/bb.yml — **Template-Issue für die StarWeb-Familie** Wenn dieses Issue zuerst angegangen wird, soll der Adapter so generisch werden dass HE/NI/RP/HB als zweite Registry-Einträge passen. **ELVIS Endpoint:** - Endpoint: `https://www.parlamentsdokumentation.brandenburg.de/starweb/LBB/ELVIS/servlet.starweb?path=LBB/ELVIS/LISSH.web&AdvancedSearch=yes` - Form-Felder: `LISSH_DTYP`, `LISSH_WP_ADV`, `LISSH_DatumV`, `LISSH_DatumB`, `LISSH_DART_ADV=DRUCKSACHE`, `__action=74,112,201` - Pagination-Trick: `NumPerSegment=1000000` und `LimitMaximumHitCount="S99{ITEMS -1:-100000}"` — alle Treffer auf einer Seite holen - Items: `.//li[@name="RecordRepeater"]` - PDF: `.//div[@name="Repeat_DBE"]//a[@title="Gesamtdokument"]/@href` - Pagination: `.//ul[@class="pagination"]//li[@name="NextRecsConditional"]` - Doc-Type: `.//div[@name="Repeat_TYP"]//strong` - Schlagworte: `.//div[@name="Repeat_TYP"]//a[@name="LinkThes"]` - Originatoren-Regex: `(?P<originators_raw>.*)\s+(?P<interpellation_date>\d{2}\.\d{2}\.\d{4})\s?Drucksache\s?(?P<interpellation_reference>\d{1,2}\/\d+)` **StarWebAdapter-Design — Konstruktor-Parameter:** ```python StarWebAdapter( bundesland="BB", name="...", base_url="https://www.parlamentsdokumentation.brandenburg.de", servlet_path="/starweb/LBB/ELVIS/servlet.starweb", db_path="LBB/ELVIS/LISSH.web", wahlperiode=8, field_map={ "wp": "LISSH_WP_ADV", "dart": "LISSH_DART_ADV", "dtyp": "LISSH_DTYP", "datv": "LISSH_DatumV", "datb": "LISSH_DatumB", }, record_repeater_xpath='.//li[@name="RecordRepeater"]', pdf_xpath='.//div[@name="Repeat_DBE"]//a[@title="Gesamtdokument"]/@href', ) ``` Damit sind HE/NI/RP/HB jeweils nur ein Registry-Eintrag mit angepassten Pfaden + Field-Names. Siehe die jeweiligen anderen Issues für die BL-spezifischen Werte.
tobias added the
phase-2
scraper
labels 2026-04-08 23:16:37 +02:00
Author
Owner

Erledigt in 02ff142.

Riesige Überraschung aus dem HAR-Trace: BB ist NICHT StarWeb wie in dokukratie und bundeslaender.py klassifiziert, sondern läuft auf dem portala/eUI-Backend (gleich wie LSA/BE/BW). Endpoint /portal/browse.tt.json mit db_id=lbb.lissh. Das alte StarWeb-Frontend ist nur Legacy.

Damit ist der vermeintliche "StarWebAdapter-Template"-Ansatz hinfällig — der existierende PortalaAdapter aus #2/#3 ist mit ein paar zusätzlichen Konstruktor-Parametern (nichts für BB, ein paar mehr für HE) direkt wiederverwendbar.

Adapter-Erweiterungen

Im PortalaAdapter zwei neue Konstruktor-Parameter mit backward-kompatiblen Defaults:

  • typ_filter: Optional[str] = "DOKDBE" — wenn None, wird die TYP-Klausel weggelassen (HE rejected DOKDBE)
  • omit_date_filter: bool = False — wenn True, kein DAT/DDAT/SDAT-Term (HE braucht das)

Plus _RE_BE_DATUM erweitert: vorher nur vom DD.MM.YYYY, jetzt fallback auf plain Datum (BB schreibt das Datum vor der Drucksachen-Nummer ohne 'vom'-Marker).

Smoke-Test

BB q="":       5–6 hits in ~5s
BB q="Schule": 5–6 hits, alle echt schul-bezogen

Akzeptanzkriterien

  • parlamente.py::ADAPTERS["BB"] existiert
  • search(query="Schule", limit=10) liefert echte Drucksachen mit Datum, Fraktionen, PDF-Link
  • Folge-Issue #39 für Frontend-Aktivierung verlinkt

Phase-2-Status (#49)

  • #27 BB (02ff142) — portala statt StarWeb, PortalaAdapter-reuse
  • #20 SH (f82c60e) — StarFinderCGIAdapter, eigenständig
  • #30 RP (02ff142) — analog BB
  • #21 HB — kein /portal/-Endpoint, bleibt StarWeb-Servlet, braucht eigenen HAR-Trace
  • #22 NI — nilas/portal ist Login-protected, deferred
  • #24 HE — portala-Backend erreichbar, aber HE-Card-Layout ist anders (Title direkt im h3, kein span-Wrapper, kein span.h6 für Meta), eigener Parser-Pfad nötig
Erledigt in 02ff142. Riesige Überraschung aus dem HAR-Trace: BB ist NICHT StarWeb wie in dokukratie und bundeslaender.py klassifiziert, sondern läuft auf dem **portala/eUI-Backend** (gleich wie LSA/BE/BW). Endpoint `/portal/browse.tt.json` mit `db_id=lbb.lissh`. Das alte StarWeb-Frontend ist nur Legacy. Damit ist der vermeintliche "StarWebAdapter-Template"-Ansatz hinfällig — der existierende **PortalaAdapter** aus #2/#3 ist mit ein paar zusätzlichen Konstruktor-Parametern (nichts für BB, ein paar mehr für HE) direkt wiederverwendbar. ## Adapter-Erweiterungen Im PortalaAdapter zwei neue Konstruktor-Parameter mit backward-kompatiblen Defaults: - `typ_filter: Optional[str] = "DOKDBE"` — wenn None, wird die TYP-Klausel weggelassen (HE rejected DOKDBE) - `omit_date_filter: bool = False` — wenn True, kein DAT/DDAT/SDAT-Term (HE braucht das) Plus _RE_BE_DATUM erweitert: vorher nur `vom DD.MM.YYYY`, jetzt fallback auf plain Datum (BB schreibt das Datum vor der Drucksachen-Nummer ohne 'vom'-Marker). ## Smoke-Test ``` BB q="": 5–6 hits in ~5s BB q="Schule": 5–6 hits, alle echt schul-bezogen ``` ## Akzeptanzkriterien - [x] `parlamente.py::ADAPTERS["BB"]` existiert - [x] `search(query="Schule", limit=10)` liefert echte Drucksachen mit Datum, Fraktionen, PDF-Link - [x] Folge-Issue #39 für Frontend-Aktivierung verlinkt ## Phase-2-Status (#49) - [x] **#27 BB** (02ff142) — portala statt StarWeb, PortalaAdapter-reuse - [x] **#20 SH** (f82c60e) — StarFinderCGIAdapter, eigenständig - [x] **#30 RP** (02ff142) — analog BB - [ ] **#21 HB** — kein /portal/-Endpoint, bleibt StarWeb-Servlet, braucht eigenen HAR-Trace - [ ] **#22 NI** — nilas/portal ist Login-protected, deferred - [ ] **#24 HE** — portala-Backend erreichbar, aber HE-Card-Layout ist anders (Title direkt im h3, kein span-Wrapper, kein span.h6 für Meta), eigener Parser-Pfad nötig
Sign in to join this conversation.
No description provided.