' 
 
 
 
 

Kom i gang med webskraping

Hvordan hente ut data maskinelt fra web? En bruksanvisning.

Når data blir til­gjenge­lig­gjort på web, er det i form av web­si­der (html), flash eller pdf. Ingen av disse for­ma­tene er egnet som en data­kilde til videre­bruk, men med litt arbeid kan de bli det. Denne pos­ten gir deg det du tren­ger for å komme i gang med web­skra­ping, kuns­ten å maski­nelt hente ut og struk­tu­rere data fra web.

«Bruks­an­vis­nin­gen» er basert på en glim­rende guide fra Pro­Pub­lica, ispedd egne erfa­rin­ger med alter­na­tive verk­tøy til de Pro­Pub­lica har benyt­tet.

Web­skra­ping: eksem­pel og verktøy

Web­skra­ping er å lese en web­side via en pro­gram­vare for så å hente ut visse deler av (html-)koden web­si­den består av, for der­etter å lagre disse delene etter eget ønske. Typisk skri­ver man et lite script som gjør denne jobben.

Eksem­pel: du job­ber med økonomi/politikk i en redak­sjon og øns­ker å vite 1) hvor ofte din kom­mune er kla­get inn for KOFA (Klage­nemnda for offent­lige anskaf­fel­ser) de seneste årene, 2) hvem som kla­ger oftest/oftest blir inn­kla­get i ditt område, og 3) hvor ofte kom­mu­nen får med­hold i sakene de blir inn­kla­get for. Videre ville det være greit å lage seg en liten tje­neste som auto­ma­tisk infor­me­rer deg hvis det duk­ker opp nye saker som involve­rer din kommune/et spe­si­elt firma i KOFA.

All denne infor­ma­sjo­nen fin­nes på kofa.no, men ikke på en slik måte at denne enkelt kan leses av. Se på en vil­kår­lig detalj­side fra kofa.no. Infor­ma­sjo­nen her er alle­rede ganske godt struk­tu­rert, ved å samle dette inn i en data­base (eller Excel, hvis du fore­trek­ker det) kan alle tre punk­tene over raskt besvares.

Propublica.org gir deg en fyl­dig guide for hvor­dan gjøre just detteruby med noko­giri. Du kan strengt tatt bruke et hvil­ket som helst språk, selv har jeg gode erfa­rin­ger med pyt­hon og Beaut­i­fulSoup, og anbe­fa­ler det som et greit sted å starte.

Poen­get er helt enkelt å lese inn en web­side, selek­tere ele­men­ter som skal spa­res (det er dette noko­giri og Beaut­i­fulSoup benyt­tes til), for så å lagre disse utvalgte ele­men­tene på en måte du selv fore­trek­ker. Det fin­nes masse guider på web­ben om detal­jene i hvor­dan dette gjø­res for utal­lige språk, her er et eksem­pel­søk.

Når du så har satt sam­men et script som hen­ter ut det du vil ha, kan det være greit å auto­ma­ti­sere kjø­rin­gen av scrip­tet. Denne typen infor­ma­sjon er det kan­skje prak­tisk å få på star­ten av arbeids­da­gen eller star­ten av uken. Å sette et script til å auto­ma­tisk kjøre på visse tider kan f.eks. gjø­res ved å sette opp en cron­tab (auto­ma­ti­sert opp­gave). På den måten kan du også sende e-post auto­ma­tisk til deg selv, det som du vel­ger å skrive ut (print/put/echo/…) i scrip­tet blir inn­hol­det i mai­len. Sørg for å gi deg selv nyt­tig og menings­full infor­ma­sjon i disse mai­lene, før eller siden glem­mer du detal­jene i hvor­dan infor­ma­sjo­nen hen­tes inn.

Vis hen­syn

Hent bare ut den infor­ma­sjo­nen du tren­ger, og hent data så sjel­dent som mulig. Les denne for flere detal­jer. Sørg f.eks. for at kal­let mot web­ser­ve­ren du skra­per ikke kjø­res i en loop, men kun en gang i star­ten av scrip­tet. Å legge inn litt vente­tid på stra­te­giske ste­der i scrip­tet (funk­sjo­nen sleep i mange språk) er også en god idé. Du tren­ger sjel­dent hur­tig­het i slike script, så å skåne web­ser­vere og data­base­ser­vere for en bom­bar­de­ring av kall har du lite å tape og mye å vinne på. Du vil ikke hisse på deg driftspersonalet/sikkerhetspersonalet til orga­ni­sa­sjo­nen du job­ber mot.

Fix bro­ken windows

Fix bro­ken win­dows er en teori om å mot­ar­beide for­fall i pro­gram­vare­ut­vik­ling. Det samme prin­sip­pet gjel­der i web­skra­ping som et mid­del mot «datar­åte» (eller kan­skje bare «råtne data», datar­åte er et ord som også bru­kes på data­sys­te­mer som for­fal­ler ved at gamle fil­for­ma­ter ikke len­ger er støt­tet i nyere ver­sjo­ner). Så fort det er feil i data­ene du sam­ler inn begyn­ner ver­dien av dem å synke, jo len­ger du kan samle inn uten feil jo mer blir data­ene verdt. Råtne data er smitt­somt. Fiks even­tu­elle pro­ble­mer så snart du opp­da­ger dem.

Pdf, ocr, flash og annet gruff

Å lese .pdf på omtrent samme måte som html vir­ker i teorien, det er bare vel­dig mye vans­ke­li­gere å få til på en effek­tiv og gjen­bruk­bar måte i prak­sis. Jeg har ikke selv fått dette til på en måte jeg mener er god nok for auto­ma­ti­serte job­ber. Da Sen­ter for stat­lig øko­nomi­sty­ring (Sfso) star­tet å pub­li­sere måned­lig stats­regn­skap i desem­ber i fjor, gjorde jeg et for­søk på .pdfene de pub­li­se­rer. Dette er et muli­gens gjen­nom­før­bart pro­sjekt, men kre­ver mye mer arbeid enn det er verdt uten en god plan videre. Jeg gav opp.

Hvis ditt pro­sjekt kre­ver skra­ping av .pdfer kan guiden til Pro­Pub­lica (ruby) eller Scra­per­wiki (pyt­hon) være til nytte.

OCR er en for­kor­telse for opti­cal cha­rac­ter rec­og­nition, optisk tegn­gjen­kjen­ning på norsk. Målet med denne tek­nik­ken er å tolke bil­der av tekst om til tekst (noen lurin­ger lag­rer inn­hold i pdf eller html som pixel-baserte bil­der). I teorien vir­ker dette også, og det fin­nes bråte­vis med digi­ta­li­se­rings­pro­sjek­ter som base­rer seg på denne meto­den. I prak­sis er dette også ofte en skuf­felse, så ha mode­rate for­håp­nin­ger til effek­ti­vi­tet og pre­si­sjon her. Goog­les tesseract-ocr er et ofte sitert verk­tøy i denne sam­men­heng. For detal­jer om fram­gangs­måte, se Pro­Pub­lica eller Google code.

Et siste triks er skra­ping av flash­si­der. Pro­Pub­lica viser deg hvor­dan du kan finne fram til data­ene som en flash­side benyt­ter. Ved å bruke fire­bug kan du snappe opp slikt, og så hoppe over hele flash-biten. Flash lar seg ikke skrape slik html gjør, da flash på web vises som et html-element som inn­kaps­ler en flash-fil (.swf).

La ana­ly­sen begynne!

Når du nå har sam­let inn data med scrip­tet ditt, og lag­ret data­ene slik du liker å ha dem, kan du begynne å ana­ly­sere. I mange til­fel­ler vil den job­ben du har gjort så langt være grunn­la­get for en story, kan­skje du kan ringe en eks­pert eller kon­fron­tere en part med fun­nene dine i et inter­vju? Uan­sett kan det være lurt å dob­belt­sjekke data­ene for feil eller mang­ler. En data­vask i Google refine kan i mange til­fel­ler slå sam­men disse to opp­ga­vene, sjekk ut artik­ke­len om data­vas­king her på Vox Pub­lica. Pro­Pub­lica har også en artik­kel om Google refine.

Veien videre

Web­skra­ping er litt vans­ke­lig første gang. Din andre skra­per tar kun en brøk­del av tiden å skrive, og blir bedre enn den første. En skra­per har typisk kun få kode­lin­jer, er lett å lese og for­stå og kan enkelt modi­fi­se­res. Det er sann­syn­lig at web­skra­ping blir en vik­ti­gere metode fram­over, da sta­dig mer data pub­li­se­res på nett. Web­skra­ping er ikke den beste løs­nin­gen for noen av oss, det vi egent­lig vil ha er et API, men å få data ut på web er et skritt i rik­tig retning.

Å scrape en web­side rutine­mes­sig og så selv legge data­ene et sted hvor de kan nås via et API, er en god idé. Scraperwiki.org er en ope­ra­sjo­na­li­se­ring av denne ideen, med et til­legg om at vi kol­lek­tivt kan gjen­bruke hver­and­res data­inn­sam­ling. Å bruke Scra­per­wiki til å ta hånd om data­lag­ring, auto­ma­ti­se­ring og arki­tek­tur for APIet kan være en løs­ning for team som job­ber sam­men i en redak­sjon. Redak­sjo­ner som er i direkte kon­kur­ranse med andre (riks­me­dier) vil nok fore­trekke bedrifts­in­terne løsninger.

Når en web­side end­rer struk­tur går ofte skra­pere «i styk­ker», de fin­ner ikke det de er på jakt etter len­ger fordi data­ene ikke er der i hie­rar­kiet hvor de pleide å være. Dette er et av argu­men­tene mot å bruke skra­ping som del av en arbeids­flyt. Det fin­nes et poten­si­elt ved­li­ke­holds­ar­beid du selv ikke kan påvirke hyp­pig­he­ten av. Min erfa­ring er at dette ikke er et stort pro­blem da web­si­der, kan­skje sær­lig statlige/kommunale, sjel­dent end­res på andre måter enn at mer inn­hold fyl­les på. Jeg har flere skra­pere som har kjørt siden jeg begynte med dette for et drøyt år siden, og ingen skra­pere som har stop­pet eller krasjet.

Web­skra­ping er ikke den beste løs­nin­gen, men den vir­ker.

2 KOMMENTARER

KOMMENTÉR
  1. […] This post was men­tio­ned on Twit­ter by Vox Pub­lica, Offent­lige data. Offent­lige data said: Kom i gang med web­skra­ping: Hvor­dan hente ut data maski­nelt fra web? En bruks­an­vis­ning. http://bit.ly/g4tBXB […]

  2. […] pro­gram­me­ring i Pyt­hon. Målet mitt med å lære meg Pyt­hon er poten­sia­let for å kunne drive web­skra­ping, det vil si å hente data fra nett­si­der og laste dem ned på data­ma­ski­nen. Dette var blant de mest […]

Skriv en kommentar

Bidra til god debatt - skriv under fullt navn. Se våre kommentarregler.

Abonner på kommentarer
til toppen