Scraper HB: Bremen (PARiS, Wahl 2027-05-09) #21

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

Wahltermin

2027-05-09 — Bremen (HB), aktuell 21. Wahlperiode.

Backend

Feld Wert
Doku-System PARiS
Base-URL https://paris.bremische-buergerschaft.de
dokukratie-Scraper hb
Drucksachen-Format 21/1234

Adapter-Strategie

PARiS basiert auf StarWeb (siehe bundeslaender.py::HB.anmerkung). Wenn der generische StarWebAdapter aus dem SH-Issue existiert, ist HB vermutlich ein zweiter Registry-Eintrag mit angepasster base_url. Falls die PARiS-Variante abweicht, eigene Subklasse wie PortalaAdapter es für LSA/BE hat.

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["HB"].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["HB"] 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 **2027-05-09** — Bremen (HB), aktuell 21. Wahlperiode. ## Backend | Feld | Wert | |---|---| | Doku-System | `PARiS` | | Base-URL | https://paris.bremische-buergerschaft.de | | dokukratie-Scraper | `hb` | | Drucksachen-Format | `21/1234` | ## Adapter-Strategie PARiS basiert auf StarWeb (siehe `bundeslaender.py::HB.anmerkung`). Wenn der generische StarWebAdapter aus dem SH-Issue existiert, ist HB vermutlich ein zweiter Registry-Eintrag mit angepasster `base_url`. Falls die PARiS-Variante abweicht, eigene Subklasse wie PortalaAdapter es für LSA/BE hat. ## 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["HB"].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["HB"]` 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/hb.yml

PARiS ist eine StarWeb-Skin, nicht eigene Engine — Endpoint folgt dem Servlet-Pattern:

  • Endpoint: https://paris.bremische-buergerschaft.de/starweb/paris/servlet.starweb?path=paris/LISSH.web
  • Form-Action über .//form[@name="__form"]
  • Form-Felder:
    • 12_LISSH_WP (legislative_term)
    • 07_LISSH_DTYP (document_type)
    • 13_LISSH_FASTDATV / 14_LISSH_FASTDATB (start/end date)
    • 08_LISSH_DART=DRUCKSACHE
    • 11_LISSH_PARL=L
    • __action=20, 50, 46 (verschiedene Suchaktionen)
  • Items: .//tbody[@name="RecordRepeater"]
  • Title: .//tr[@name="Repeat_WHET"]/td/h2
  • PDF: .//td/a[contains(@href, "/dokumente/")][last()]/@href
  • Pagination: .//div[@id="seitenzahl"]//span[@name="NextRecsConditional"]

Synergie: Wiederverwendung des generischen StarWebAdapter aus dem #27 BB-Issue wenn das zuerst angegangen wird. Bremen ist dann ein zweiter Registry-Eintrag mit angepasster base_url und ggf. anderen LISSH_*-Field-Präfixen.

bundeslaender.py-Korrektur: HB.doku_system="PARiS" → sollte "StarWeb" sein, weil PARiS technisch StarWeb ist.

## Hinweise aus dokukratie/hb.yml **PARiS ist eine StarWeb-Skin**, nicht eigene Engine — Endpoint folgt dem Servlet-Pattern: - Endpoint: `https://paris.bremische-buergerschaft.de/starweb/paris/servlet.starweb?path=paris/LISSH.web` - Form-Action über `.//form[@name="__form"]` - Form-Felder: - `12_LISSH_WP` (legislative_term) - `07_LISSH_DTYP` (document_type) - `13_LISSH_FASTDATV` / `14_LISSH_FASTDATB` (start/end date) - `08_LISSH_DART=DRUCKSACHE` - `11_LISSH_PARL=L` - `__action=20, 50, 46` (verschiedene Suchaktionen) - Items: `.//tbody[@name="RecordRepeater"]` - Title: `.//tr[@name="Repeat_WHET"]/td/h2` - PDF: `.//td/a[contains(@href, "/dokumente/")][last()]/@href` - Pagination: `.//div[@id="seitenzahl"]//span[@name="NextRecsConditional"]` **Synergie:** Wiederverwendung des **generischen `StarWebAdapter`** aus dem **#27 BB-Issue** wenn das zuerst angegangen wird. Bremen ist dann ein zweiter Registry-Eintrag mit angepasster `base_url` und ggf. anderen `LISSH_*`-Field-Präfixen. **bundeslaender.py-Korrektur:** `HB.doku_system="PARiS"` → sollte `"StarWeb"` sein, weil PARiS technisch StarWeb ist.
tobias added the
phase-2
scraper
labels 2026-04-08 23:16:36 +02:00
Author
Owner

Sondiert in der Phase-2-Session: paris.bremische-buergerschaft.de hat KEIN /portal/-Endpoint (404). Im Gegensatz zu BB/RP/HE/BW läuft HB nicht auf dem portala/eUI-Backend.

PARiS bleibt damit eine echte StarWeb-Servlet-Instanz mit dem alten mehrstufigen Form-Submit-Pattern (servlet.starweb?path=paris/LISSH.web plus __action-Codes plus Session-State). Das ist dieselbe Klasse wie das ursprünglich für BB vermutete Schema — siehe das deferred Issue #27 das aufzeigt warum das ohne HAR-Trace mehrtägige Trial-and-Error wäre.

Was zu tun ist

HAR-Trace einer echten Suche auf https://paris.bremische-buergerschaft.de/starweb/paris/servlet.starweb?path=paris/LISSH.web — dann ist der Adapter ein 4-Stunden-Job. Sobald HB durch ist, ist eventuell auch das StarWeb-Servlet-Pattern für andere möglicherweise noch nicht migrierte Instanzen klarer.

Deferred bis HAR-Trace.

Sondiert in der Phase-2-Session: **paris.bremische-buergerschaft.de hat KEIN /portal/-Endpoint** (404). Im Gegensatz zu BB/RP/HE/BW läuft HB **nicht** auf dem portala/eUI-Backend. PARiS bleibt damit eine echte StarWeb-Servlet-Instanz mit dem alten mehrstufigen Form-Submit-Pattern (`servlet.starweb?path=paris/LISSH.web` plus `__action`-Codes plus Session-State). Das ist dieselbe Klasse wie das ursprünglich für BB vermutete Schema — siehe das deferred Issue #27 das aufzeigt warum das ohne HAR-Trace mehrtägige Trial-and-Error wäre. ## Was zu tun ist HAR-Trace einer echten Suche auf https://paris.bremische-buergerschaft.de/starweb/paris/servlet.starweb?path=paris/LISSH.web — dann ist der Adapter ein 4-Stunden-Job. Sobald HB durch ist, ist eventuell auch das StarWeb-Servlet-Pattern für andere möglicherweise noch nicht migrierte Instanzen klarer. Deferred bis HAR-Trace.
Author
Owner

Erledigt durch Roadmap Phase I / Commit 278d74f. Eigener PARiSHBAdapter mit Single-POST-Pipeline gegen den PARiS-Servlet. Drucksachen-IDs mit S/L-Suffix für Stadtbürgerschaft vs Landtag. Live: 5 Klima-Anträge der WP21 inkl. SPD/GRÜNE/LINKE-Koalition.

Erledigt durch Roadmap Phase I / Commit `278d74f`. Eigener `PARiSHBAdapter` mit Single-POST-Pipeline gegen den PARiS-Servlet. Drucksachen-IDs mit S/L-Suffix für Stadtbürgerschaft vs Landtag. Live: 5 Klima-Anträge der WP21 inkl. SPD/GRÜNE/LINKE-Koalition.
Sign in to join this conversation.
No description provided.