Nivågradering av kataloger: hva N1 til N5 koster
Det vanligste spørsmålet vi får om datainnhenting — web scraping, som det heter på engelsk — er «hva koster det?».
Avis-ID-en skifter hver uke. Det er den ene detaljen som avgjør om automatiseringen lever eller dør på mandag.
En kunde som selger til dagligvare spurte om noe som hørtes enkelt ut: kan dere holde oversikt over hva kjedene har på tilbud?
Svaret folk venter seg er en OCR-jobb. Tilbudsavisen er en PDF, PDF-en er bilder av sider, og et sted må noen lese av «Jarlsberg 500 g — 59,90». Det er den dyre veien, den skjøre veien, og den vi ikke gikk.
Ikke avisen. Ikke et arkiv av PDF-er. De trengte én tabell: vare, pris, kjede, gyldighetsperiode. Noe de kan regne på.
Det er verdt å stoppe ved, for det er her de fleste datainnhentingsprosjekter tar feil retning. Spørsmålet «kan dere hente tilbudsavisen» er ikke det samme som «kan dere hente tilbudene». Det første er en filjobb. Det andre er en datajobb, og den er som regel enklere — hvis du leter riktig sted.
Tilbudsavisene ligger hos en tredjepart som viser dem i en nettleser-visning. Den visningen må vite hva som står i avisen — ellers kunne den ikke gjøre varene søkbare eller klikkbare.
Og det gjør den. I HTML-en for hver enkelt side ligger det en tabell merket monitoring-products-table. Varenavn, pris og gyldighetsdato, i ren tekst, under bildet av siden.
Da er jobben ikke lenger bildetolkning. Den er å be om riktig adresse og lese et regulært uttrykk. Ingen OCR, ingen modell som gjetter på et tall, ingen usikkerhet om det stod 59,90 eller 5990.
Dette er trinn tre i figuren vi bruker på datainnhenting: den skjulte datakilden. Den er nesten alltid der på sider som viser data pent. Den er bare ikke annonsert.
Hver avis har en ID i adressen:
kundeaviser.alletilbudsaviser.co.no/kiwi-tilbud/kundeavis-48213-7
48213 er avisen. 7 er sidenummeret.
Den ID-en skifter når kjeden legger ut ny avis. Skriver du den inn i automatiseringen, virker alt strålende — til neste mandag, da alle 320 forespørsler treffer en avis som ikke finnes lenger, og du får null rader uten en eneste feilmelding.
Løsningen er ikke å oppdatere ID-en manuelt hver uke. Det er å ikke vite den.
Vi henter først kjedens egen oversiktsside, /kiwi-tilbud, og plukker ID-en ut av HTML-en med mønsteret kundeavis-(\d+)-0 — lenken til side null i den avisen som ligger ute akkurat nå. Den ID-en går videre til resten av kjøringen.
Resultatet er at automatiseringen ikke merker at avisen byttes. Den finner alltid den som gjelder.
Regelen vi tar med oss videre: hver gang en adresse inneholder et tall som noen andre bestemmer, skal det tallet hentes, ikke skrives inn.
Ti kjeder: spar, rema 1000, kiwi, meny, joker, bunnpris, coop extra, coop obs, coop mega, coop prix.
For hver kjede: hent oversiktssiden, finn avis-ID-en, gå gjennom side 0 til 31, se etter tabellen, plukk vare, pris og gyldighet, skriv til basen.
Ti kjeder ganger trettito sider er 320 forespørsler i en full kjøring. Per i dag ligger det 217 tilbud i basen.
Hver rad lagres under en nøkkel satt sammen av kjede, varenavn og pris:
kiwi_Jarlsberg_500_g_5990
Samme vare til samme pris hos samme kjede gir alltid samme nøkkel, og raden skrives over i stedet for å legges til.
Det betyr at du kan kjøre den to ganger etter hverandre, eller midt i en kjøring som feilet halvveis, uten å få dubletter og uten et eget oppryddingssteg. Det er ikke en finesse — det er forskjellen på en jobb du tør å kjøre om igjen og en du ikke tør å røre.
Trettito sider er et tak. Har en avis 33 sider, mister vi den siste, og vi får ikke beskjed. Taket er valgt fordi ingen av de ti avisene så langt har vært lengre — men det er et anslag, ikke en garanti, og det skal enten måles eller gjøres dynamisk før dette kan kalles ferdig.
Vi har ikke slått den på fast ennå. Den kjøres på bestilling. En ukentlig kjøring med varsling når en kjede plutselig gir null rader — som er det sikreste tegnet på at noe har endret seg i kilden — er neste steg, ikke noe som står i drift i dag. Vi sier det heller enn å la deg tro noe annet.
I dag: en JSON-fil på Drive, oppdatert når kjøringen kjøres, med alle radene og hvor hver enkelt kom fra.
Det er nok til å regne på, og det er nok til å legge inn i et regneark eller et system. Det er ikke en innlogget oversikt der kunden selv kan filtrere på kjede og uke. Den er neste steg — og den bygges når noen faktisk skal bruke den daglig, ikke før.
Har du en kilde som viser data pent, men ikke gir deg dem — spør oss om det finnes en tabell bak visningen før du bestiller en OCR-jobb. Den finnes oftere enn folk tror, og den koster en brøkdel.
Det vanligste spørsmålet vi får om datainnhenting — web scraping, som det heter på engelsk — er «hva koster det?».
Vi kartla en norsk produktkatalog for å hente ut varedata. Fire av fem veier var blindveier. Her er hver eneste av dem — og de 19 % vi endte på.
En PDF-katalog på tolv megabyte inn, nittitre produkter ut. Bildene koblet vi på til slutt — og løsningen lå i fontvekten, ikke i posisjonen.
Denne artikkelen hører til datainnhenting. Skal noen gjøre jobben for deg, er det dette vi tilbyr: hjelp til å hente ut data.