<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="nb">
	<id>https://wiki.1haugerud.no/index.php?action=history&amp;feed=atom&amp;title=Merkebasen</id>
	<title>Merkebasen - Sideversjonshistorikk</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.1haugerud.no/index.php?action=history&amp;feed=atom&amp;title=Merkebasen"/>
	<link rel="alternate" type="text/html" href="https://wiki.1haugerud.no/index.php?title=Merkebasen&amp;action=history"/>
	<updated>2026-04-04T09:26:49Z</updated>
	<subtitle>Versjonshistorikk for denne siden på wikien</subtitle>
	<generator>MediaWiki 1.41.5</generator>
	<entry>
		<id>https://wiki.1haugerud.no/index.php?title=Merkebasen&amp;diff=4034&amp;oldid=prev</id>
		<title>Nicolai@1haugerud.no: Ny side: = Merkebasen: Lørdag =  === Eller: Hvordan 224 speidermerker ble scrapt, feilimportert, re-scrapt, re-importert, og til slutt fikk feil navn === ----Fredagskvelden hadde etterlatt oss med en fungerende MediaWiki-installasjon. Serveren kjørte. HTTPS virket. Google hadde begynt å indeksere. Alt var i orden.  Naturligvis var det på tide å gjøre noe dumt.  &#039;&#039;«Kan du scrape alle fordypningsmerkene fra Speidersport.no og importere dem til wikien?»&#039;&#039;  Det høres enkelt ut. Det er…</title>
		<link rel="alternate" type="text/html" href="https://wiki.1haugerud.no/index.php?title=Merkebasen&amp;diff=4034&amp;oldid=prev"/>
		<updated>2026-02-12T17:25:30Z</updated>

		<summary type="html">&lt;p&gt;Ny side: = Merkebasen: Lørdag =  === Eller: Hvordan 224 speidermerker ble scrapt, feilimportert, re-scrapt, re-importert, og til slutt fikk feil navn === ----Fredagskvelden hadde etterlatt oss med en fungerende MediaWiki-installasjon. Serveren kjørte. HTTPS virket. Google hadde begynt å indeksere. Alt var i orden.  Naturligvis var det på tide å gjøre noe dumt.  &amp;#039;&amp;#039;«Kan du scrape alle fordypningsmerkene fra Speidersport.no og importere dem til wikien?»&amp;#039;&amp;#039;  Det høres enkelt ut. Det er…&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Ny side&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Merkebasen: Lørdag =&lt;br /&gt;
&lt;br /&gt;
=== Eller: Hvordan 224 speidermerker ble scrapt, feilimportert, re-scrapt, re-importert, og til slutt fikk feil navn ===&lt;br /&gt;
----Fredagskvelden hadde etterlatt oss med en fungerende MediaWiki-installasjon. Serveren kjørte. HTTPS virket. Google hadde begynt å indeksere. Alt var i orden.&lt;br /&gt;
&lt;br /&gt;
Naturligvis var det på tide å gjøre noe dumt.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;«Kan du scrape alle fordypningsmerkene fra Speidersport.no og importere dem til wikien?»&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Det høres enkelt ut. Det er 247 merker fordelt på fire aldersgrupper. Hvert merke har et bilde, en beskrivelse, og noen kompetansekrav. Bare hent dataen, formater den, og dytt den inn i MediaWiki via APIet.&lt;br /&gt;
&lt;br /&gt;
Hva kan gå galt?&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;(Gjenkjenner du mønsteret?)&amp;#039;&amp;#039;&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Akt I: «pip install playwright» og andre berømte siste ord ==&lt;br /&gt;
Det første problemet var at Speiderbasen – nettsiden der kompetansekravene til hvert merke ligger – er en Single Page Application. For deg som ikke er utvikler: det betyr at nettsiden er en tom HTML-side som sier «Norges speiderforbund» og ellers inneholder absolutt ingenting. Alt innholdet lastes av JavaScript etter at siden er åpnet i en nettleser.&lt;br /&gt;
&lt;br /&gt;
Det betyr at Pythons &amp;lt;code&amp;gt;requests&amp;lt;/code&amp;gt;-bibliotek, som bare henter rå HTML, får en side med 7864 tegn hvorav null av dem er nyttige.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;«Den siden er tom»&amp;#039;&amp;#039;, sa Nicolai.&lt;br /&gt;
&lt;br /&gt;
Den var ikke tom. Den var &amp;#039;&amp;#039;potensiell&amp;#039;&amp;#039;. Den trengte bare en nettleser for å realisere sitt innhold. Litt som en speider som ennå ikke har tatt sitt første merke.&lt;br /&gt;
&lt;br /&gt;
Løsningen: &amp;#039;&amp;#039;&amp;#039;Playwright&amp;#039;&amp;#039;&amp;#039; – et verktøy som kjører en usynlig Chrome-nettleser som kan rendre JavaScript. Bare installer det, så er vi i gang.&lt;br /&gt;
 &amp;lt;code&amp;gt;pip install playwright&lt;br /&gt;
 playwright install chromium&amp;lt;/code&amp;gt;&lt;br /&gt;
Chromium trenger systembiblioteker. Ubuntu 24.04 har nye pakkenavn. &amp;lt;code&amp;gt;libasound2&amp;lt;/code&amp;gt; finnes ikke, men &amp;lt;code&amp;gt;libasound2t64&amp;lt;/code&amp;gt; gjør det. Hvorfor? Fordi Ubuntu bestemt seg for at 64-bits-suffikser er fremtiden. Ingen av oss hadde bedt om dette.&lt;br /&gt;
&lt;br /&gt;
Sju &amp;lt;code&amp;gt;apt-get install&amp;lt;/code&amp;gt;-kommandoer senere – inkludert en som krevde å installere &amp;lt;code&amp;gt;python3-dev&amp;lt;/code&amp;gt; fordi noe trengte å kompileres – kjørte Playwright endelig.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Akt II: Scraper v1, v2, v3 – et ekte versjonsh... ==&lt;br /&gt;
Claude produserte det første scriptet: &amp;lt;code&amp;gt;scrape_komplett.py&amp;lt;/code&amp;gt;. Det brukte Playwright til å åpne Speidersport.no, scrolle ned for å laste alle produkter, og hente alle merkene.&lt;br /&gt;
&lt;br /&gt;
Det fungerte. Delvis.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Bever: 20 merker.&amp;#039;&amp;#039;&amp;#039; Riktig!&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Flokk: 48 merker.&amp;#039;&amp;#039;&amp;#039; Nesten (skal være 49).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Tropp: 88 merker.&amp;#039;&amp;#039;&amp;#039; Feil (skal være ~118).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Rover: 0 merker.&amp;#039;&amp;#039;&amp;#039; Null. Nada. Ingenting.&lt;br /&gt;
&lt;br /&gt;
Problemet med Rover var en feil URL. Claude hadde antatt at Rover-siden het &amp;lt;code&amp;gt;/fordypning/rover&amp;lt;/code&amp;gt;, men den het &amp;lt;code&amp;gt;/fordypning/roverlag&amp;lt;/code&amp;gt;. En rimelig antagelse, en feil antagelse, og 55 manglende merker.&lt;br /&gt;
&lt;br /&gt;
Problemet med Tropp var paginering. Speidersport.no viser bare de første ~50 produktene og krever scrolling eller sideveksling for resten. Scriptet scrollet, men ikke nok.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Løsning:&amp;#039;&amp;#039;&amp;#039; Nytt script. &amp;lt;code&amp;gt;scrape_uten_playwright.py&amp;lt;/code&amp;gt; – en versjon som skulle fungere uten Playwright fordi Claude mente Speidersport.no rendret server-side.&lt;br /&gt;
 &amp;lt;code&amp;gt;ModuleNotFoundError: No module named &amp;#039;bs4&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
Nicolai hadde glemt å aktivere virtual environment. Igjen. (Det er lørdag. Vi tilgir.)&lt;br /&gt;
 &amp;lt;code&amp;gt;source ~/speiderbasen-env/bin/activate&lt;br /&gt;
 python3 ~/scrape_uten_playwright.py&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;«Den har ikke lest inn noen Rover- eller ledermerker.»&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Tilbake til tegnebrettet. &amp;#039;&amp;#039;&amp;#039;Versjon 3:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;scrape_v3.py&amp;lt;/code&amp;gt; med riktige URLer og paginering via filter-parametere i URL-en.&lt;br /&gt;
 &amp;lt;code&amp;gt;Bever: 20 ✅&lt;br /&gt;
 Flokk: 49 ✅&lt;br /&gt;
 Tropp: 100 ✅&lt;br /&gt;
 Rover: 55 ✅&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;224 merker importert. Null feil.&amp;#039;&amp;#039;&amp;#039; Men bare 2 bilder lastet opp.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Akt III: Jakten på bildene ==&lt;br /&gt;
224 wiki-sider uten bilder er som 224 speidermerker uten stoff. Teknisk korrekt, men poenget forsvinner.&lt;br /&gt;
&lt;br /&gt;
Claude bygde ut scriptet med bildeopplasting: last ned bildet fra Speidersport.no, last det opp til MediaWiki via APIet, og sett inn en &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[File:...]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;-tag i wiki-teksten.&lt;br /&gt;
&lt;br /&gt;
Resultat: 2 av 224 bilder ble lastet opp. Resten feilet stille.&lt;br /&gt;
&lt;br /&gt;
Problemet? MediaWiki sin upload-API er en labyrint av tokens, CSRF-verifisering, og kryptiske feilmeldinger. &amp;lt;code&amp;gt;uploadstash-exception&amp;lt;/code&amp;gt; og &amp;lt;code&amp;gt;Stien finnes ikke&amp;lt;/code&amp;gt; ble våre faste følgesvenner. Bildet ble lastet ned, men opplastingen feilet fordi – vel, fordi MediaWiki er MediaWiki.&lt;br /&gt;
&lt;br /&gt;
Vi fikset. Vi prøvde igjen. Vi fikset mer. Bilder begynte å dukke opp.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Akt IV: Programmerker og den store ID-jakten ==&lt;br /&gt;
Fordypningsmerkene var bare begynnelsen. Petter ville også ha &amp;#039;&amp;#039;&amp;#039;programmerker&amp;#039;&amp;#039;&amp;#039; – de offisielle merkene for hvert utviklingsområde i speiderprogrammet. Disse hadde spesifikke produkt-IDer på Speidersport.no, men ingen av oss visste hvilke.&lt;br /&gt;
&lt;br /&gt;
Løsningen var like elegant som den var brutal: &amp;#039;&amp;#039;&amp;#039;brute-force.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Claude skrev et script som itererte gjennom hundrevis av produkt-IDer på Speidersport.no og sjekket om produkttittelen inneholdt ordet «programmerke». Vi gikk gjennom ID-område etter ID-område:&lt;br /&gt;
 &amp;lt;code&amp;gt;for pid in range(185555, 185570):&lt;br /&gt;
     r = requests.get(f&amp;quot;&amp;lt;nowiki&amp;gt;https://www.speidersport.no/norges-speiderforbund/{pid}/&amp;lt;/nowiki&amp;gt;&amp;quot;)&lt;br /&gt;
     if &amp;quot;livskvalitet&amp;quot; in r.text.lower():&lt;br /&gt;
         print(f&amp;quot;  {pid}: FUNNET!&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
Det er litt som å lete etter en nøkkel i en park ved å grave opp hver kvadratmeter systematisk. Ineffektivt, men effektivt.&lt;br /&gt;
&lt;br /&gt;
Vi fant IDene:&lt;br /&gt;
&lt;br /&gt;
* Bever: 185549&lt;br /&gt;
* Flokk: 185565&lt;br /&gt;
* Tropp (Stifinner): 185581&lt;br /&gt;
* Vandrer: 185597&lt;br /&gt;
* Rover: 185613&lt;br /&gt;
&lt;br /&gt;
Triumf! Bortsett fra at Bever-bildet ble lastet opp som &amp;lt;code&amp;gt;Programmerke_Bever_Livskvalitet.webp&amp;lt;/code&amp;gt;, mens Flokk, Tropp og Rover returnerte «Fant ikke bilde!» fordi de opprinnelige IDene var feil.&lt;br /&gt;
&lt;br /&gt;
Vi brute-forcet på nytt. Nye IDer. Nye forsøk. Nye feilmeldinger.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Akt V: Livstolkning vs. Livskvalitet – når Claude dikter opp ting ==&lt;br /&gt;
I all scraping-iveren hadde Claude gjort en subtil, men fundamental feil. Et av de fem utviklingsområdene i speiderprogrammet heter &amp;#039;&amp;#039;&amp;#039;Livskvalitet&amp;#039;&amp;#039;&amp;#039;. Claude hadde konsekvent kalt det &amp;#039;&amp;#039;&amp;#039;Livstolkning&amp;#039;&amp;#039;&amp;#039; – et ord som høres plausibelt ut, men som ikke finnes i speiderprogrammet.&lt;br /&gt;
&lt;br /&gt;
Det er som om noen hadde organisert hele merksamlingen din og systematisk skrevet «Førstehjælp» i stedet for «Førstehjelp» på hver eneste etikett.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;«Skriptet har tatt feil. Bytt Livstolkning med Livskvalitet.»&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Claude laget et fix-script. Scriptet gikk gjennom alle wiki-sider, fant «Livstolkning», erstattet med «Livskvalitet», lastet opp riktige bilder, og oppdaterte kompetansekravene.&lt;br /&gt;
&lt;br /&gt;
Det var den fjerde versjonen av et script som fikset feil introdusert av den tredje versjonen av et script som erstattet den andre versjonen som ikke fungerte fordi den første versjonen manglet paginering.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Akt VI: Copy-Paste-DevOps på sitt fineste ==&lt;br /&gt;
Gjennom hele lørdagen fulgte Nicolai og Claude det samme ritualet:&lt;br /&gt;
&lt;br /&gt;
# Claude skriver et script&lt;br /&gt;
# Nicolai laster det ned til Macen&lt;br /&gt;
# &amp;lt;code&amp;gt;scp&amp;lt;/code&amp;gt; til serveren&lt;br /&gt;
# &amp;lt;code&amp;gt;source ~/speiderbasen-env/bin/activate&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;python3 ~/script_v47.py&amp;lt;/code&amp;gt;&lt;br /&gt;
# Feilmelding&lt;br /&gt;
# Tilbake til Claude&lt;br /&gt;
# Gjenta&lt;br /&gt;
&lt;br /&gt;
Noen ganger glemte Nicolai å aktivere virtual environment. Noen ganger var han i feil mappe. Én gang lastet han opp feil fil. Det er den menneskelige faktoren i DevOps – uforutsigbar, sjarmerende, og ansvarlig for minst 30% av alle feilmeldinger.&lt;br /&gt;
&lt;br /&gt;
Claude, på sin side, produserte scripts som var teknisk korrekte men kontekstuelt feil (Livstolkning), funksjonelle men ufullstendige (Rover: 0), eller komplett riktige men avhengige av biblioteker som ikke var installert.&lt;br /&gt;
&lt;br /&gt;
Sammen utgjorde de et perfekt dysfunksjonelt team.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Epilog: 224 merker, 55 Rover-merker, og et ord som ikke finnes ==&lt;br /&gt;
Ved slutten av lørdagen hadde wiki.1haugerud.no:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;224 fordypningsmerker&amp;#039;&amp;#039;&amp;#039; med wiki-sider, bilder og kompetansekrav&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Programmerker&amp;#039;&amp;#039;&amp;#039; for alle aldersgrupper og utviklingsområder&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Kategorisider&amp;#039;&amp;#039;&amp;#039; for Bever, Flokk, Tropp og Rover&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;En hovedside&amp;#039;&amp;#039;&amp;#039; med wikitabeller og eksterne lenker&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Automatisk backup&amp;#039;&amp;#039;&amp;#039; til S3&lt;br /&gt;
&lt;br /&gt;
Oppsettet krevde:&lt;br /&gt;
&lt;br /&gt;
* 7 × versjoner av scraper-scripts&lt;br /&gt;
* 3 × ulike scraping-strategier (requests, Playwright, brute-force)&lt;br /&gt;
* 1 × oppdiktet utviklingsområde (Livstolkning)&lt;br /&gt;
* 1 × manglende Rover-URL (/rover vs /roverlag)&lt;br /&gt;
* 1 × SPA som nektet å vise innhold uten JavaScript&lt;br /&gt;
* ∞ × &amp;lt;code&amp;gt;source ~/speiderbasen-env/bin/activate&amp;lt;/code&amp;gt;&lt;br /&gt;
* 1 × CTO som copy-pastet terminaloutput med stoisk tålmodighet&lt;br /&gt;
&lt;br /&gt;
Det fine med hele prosjektet er at resultatet faktisk er nyttig. En speider i 1. Haugerud kan nå gå inn på wikien, finne merket de jobber med, se bildet, lese kompetansekravene, og vite nøyaktig hva de trenger å gjøre.&lt;br /&gt;
&lt;br /&gt;
At det tok tre mennesker (vel, to mennesker og en språkmodell) en hel lørdag å automatisere noe som kanskje hadde tatt tre timer å gjøre manuelt? Det er software-utvikling i et nøtteskall.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Alltid beredt&amp;#039;&amp;#039;&amp;#039; – men kanskje ikke alltid for det vi trodde vi var beredt for.&lt;br /&gt;
----&amp;#039;&amp;#039;Denne teksten ble skrevet av Claude – den samme Claude som oppfant ordet «Livstolkning» og håper inderlig at ingen speider noensinne trenger å google det.&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Nicolai@1haugerud.no</name></author>
	</entry>
</feed>