Et lille Flask-baseret værktøj, der søger kommune for kommune på SSP-Samrådets repræsentantside og eksporterer resultater som JSON, CSV og Excel. Til brug for programmører der ønsker at bruge dette, for at beskytte børn og unge i forbindelse med chat, hvor mistrivsel opdages af AI chat bot.
Klik billedet for at hente DEMO VIDEO
Applikationen gør dette for hver af de 98 kommuner:
- bygger en søge-URL med korrekt URL-encoding, så
æ,øogåvirker - henter HTML fra SSP-Samrådets side
- finder kontaktblokke med
mailto:ogtel: - udleder navn, titel, e-mail og telefon
- normaliserer output til en fast JSON-struktur
- gemmer resultatet som:
ssp_kontakter.jsonssp_kontakter.csvssp_kontakter.xlsx
For alle 98 kommuner er den forventede samlede køretid cirka 1 minut og 15 sekunder. Det er forventet adfærd og ikke en fejl.
Køretiden kommer primært fra:
- 98 HTTP-requests
- HTML-parsing for hver kommune
- en lille pause mellem requests for at være skånsom mod kildesitet
Hver kommune gemmes i et objekt i denne stil:
{
"id": "koebenhavn-ssp",
"municipality": "København",
"region": "Region Hovedstaden",
"website": "https://www.kk.dk",
"sspPage": "https://www.kk.dk/ssp",
"contacts": [
{
"name": "SSP Koordinator",
"email": "ssp@kk.dk",
"phone": "33 66 33 66",
"title": ""
}
],
"status": "found",
"sourceType": "official",
"verificationStatus": "auto-validated",
"verification": {
"sourceLooksOfficial": true,
"hasContact": true,
"hasEmail": true,
"hasPhone": true,
"domainMatchesMunicipality": true,
"scrapeStatus": "found",
"manualReviewed": false,
"confidence": 0.9
},
"verifiedAt": "",
"notes": "",
"sourceSummary": {
"hasWebsite": true,
"hasSspPage": true,
"contactCount": 1
}
}app_repo_ready.py– hovedapplikationenrequirements.txt– Python-afhængighederREADME.md– dokumentationLICENSE– MIT-licens.gitignore– ignorerer outputfiler og lokale miljøfiler
Brug Python 3.11 eller nyere.
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtPå Windows PowerShell:
python -m venv .venv
.venv\Scripts\Activate.ps1
pip install -r requirements.txtStart applikationen:
python app_repo_ready.pyÅbn derefter:
http://localhost:5000
Viser webinterfacet.
Starter scraping i en baggrundstråd.
Sætter stop-flag. Den aktuelle request afsluttes typisk først, hvorefter processen stopper.
Returnerer live-status som JSON, bl.a.:
- antal færdige kommuner
- nuværende kommune
- elapsed tid
- estimeret tid tilbage
- fordelinger på
found,no_contactogerror
Downloader ssp_kontakter.json.
Downloader ssp_kontakter.csv.
Downloader ssp_kontakter.xlsx.
Kommunerne ligger i KOMMUNER opdelt efter region.
Funktionen build_ssp_search_url() bruger urllib.parse.quote(..., safe="-").
Det betyder for eksempel:
Allerød→Aller%C3%B8dBrøndby→Br%C3%B8ndbyHøje-Taastrup→H%C3%B8je-TaastrupÆrø→%C3%86r%C3%B8
extract_contacts_from_html() leder efter blokke med:
a[href^="mailto:"]a[href^="tel:"]
Hvis en blok indeholder kontaktoplysninger, forsøger funktionen også at finde:
- navn via overskrifter eller stærk tekst
- titel via tekst, der ligner SSP-rollebetegnelser
transform_result() pakker hver kommune ind i det aftalte JSON-format og beregner:
sourceTypeverificationsourceSummary
save_outputs() skriver både JSON, CSV og Excel.
verification.confidence er en simpel heuristik og ikke en maskinlært score. Den bygger på:
- om der er kontakt
- om der er e-mail
- om der er telefon
- om der findes et officielt website
- om domænet ligner et kommunedomæne
Hvis du vil have en strengere model, kan scoren nemt justeres i build_verification().
Der er et par ting, som er værd at vide:
- scraperen bruger SSP-Samrådets søgeside som kilde, ikke nødvendigvis kommunens egen SSP-side
sspPagebygges som standard tilwebsite + "/ssp"og er derfor et kvalificeret gæt, ikke verificeret URL-opslag- HTML-strukturen på kildesitet kan ændre sig
- nogle kommuner kan have kontaktinfo uden
mailto:ellertel:, og de kan derfor blive overset - nogle navne/titler kan blive udledt lidt groft, hvis HTML’en er uens
Hvis du vil gøre projektet mere robust, er næste naturlige skridt:
- validere
sspPagemed et faktisk request - gemme alle fundne e-mails og telefoner, ikke kun første værdi i standard-output
- tilføje retry-logik ved timeouts
- logge rå HTML-udsnit ved fejl
- skrive tests for:
slugify()build_ssp_search_url()extract_contacts_from_html()build_verification()
Typisk repo-opsætning:
git init
git add app_repo_ready.py requirements.txt README.md LICENSE .gitignore
git commit -m "Initial SSP scraper"Projektet er udgivet under MIT-licensen. Se LICENSE.