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 dis­se for­ma­te­ne er egnet som en data­kil­de til videre­bruk, men med litt arbeid kan de bli det. Den­ne pos­ten gir deg det du tren­ger for å kom­me i gang med web­skra­ping, kuns­ten å maski­nelt hen­te ut og struk­tu­re­re data fra web.

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

Webskraping: eksempel og verktøy

Web­skra­ping er å lese en web­si­de via en pro­gram­va­re for så å hen­te ut vis­se deler av (html-)koden web­si­den består av, for der­et­ter å lag­re dis­se dele­ne etter eget øns­ke. Typisk skri­ver man et lite script som gjør den­ne job­ben.

Eksem­pel: du job­ber med økonomi/politikk i en redak­sjon og øns­ker å vite 1) hvor ofte din kom­mu­ne er kla­get inn for KOFA (Klage­nemn­da for offent­li­ge anskaf­fel­ser) de senes­te åre­ne, 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 sake­ne de blir inn­kla­get for. Videre vil­le det være greit å lage seg en liten tje­nes­te som auto­ma­tisk infor­me­rer deg hvis det duk­ker opp nye saker som involve­rer din kommune/et spe­si­elt fir­ma i KOFA.

All den­ne infor­ma­sjo­nen fin­nes på kofa.no, men ikke på en slik måte at den­ne enkelt kan leses av. Se på en vil­kår­lig detalj­si­de fra kofa.no. Infor­ma­sjo­nen her er alle­re­de gans­ke godt struk­tu­rert, ved å sam­le det­te inn i en data­ba­se (eller Excel, hvis du fore­trek­ker det) kan alle tre punk­te­ne over raskt besva­res.

Propublica.org gir deg en fyl­dig guide for hvor­dan gjø­re just det­teruby med noko­gi­ri. Du kan strengt tatt bru­ke 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 å star­te.

Poen­get er helt enkelt å lese inn en web­si­de, selek­te­re ele­men­ter som skal spa­res (det er det­te noko­gi­ri og Beaut­i­fulSoup benyt­tes til), for så å lag­re dis­se utvalg­te ele­men­te­ne på en måte du selv fore­trek­ker. Det fin­nes mas­se guid­er på web­ben om detal­je­ne i hvor­dan det­te gjø­res for utal­li­ge språk, her er et eksem­pels­ø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­se­re kjø­rin­gen av scrip­tet. Den­ne typen infor­ma­sjon er det kan­skje prak­tisk å få på star­ten av arbeids­da­gen eller star­ten av uken. Å set­te et script til å auto­ma­tisk kjø­re på vis­se tider kan f.eks. gjø­res ved å set­te opp en cron­tab (auto­ma­ti­sert opp­ga­ve). På den måten kan du også sen­de e-post auto­ma­tisk til deg selv, det som du vel­ger å skri­ve 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 dis­se mai­le­ne, før eller siden glem­mer du detal­je­ne i hvor­dan infor­ma­sjo­nen hen­tes inn.

Vis hensyn

Hent bare ut den infor­ma­sjo­nen du tren­ger, og hent data så sjel­dent som mulig. Les den­ne for fle­re 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. Å leg­ge inn litt vente­tid på stra­te­gis­ke ste­der i scrip­tet (funk­sjo­nen sle­ep i man­ge språk) er også en god idé. Du tren­ger sjel­dent hur­tig­het i sli­ke script, så å skå­ne web­ser­ve­re og data­base­ser­ve­re for en bom­bar­de­ring av kall har du lite å tape og mye å vin­ne på. Du vil ikke his­se på deg driftspersonalet/sikkerhetspersonalet til orga­ni­sa­sjo­nen du job­ber mot.

Fix broken windows

Fix bro­ken win­dows er en teori om å mot­ar­bei­de for­fall i pro­gram­vare­ut­vik­ling. Det sam­me prin­sip­pet gjel­der i web­skra­ping som et mid­del mot «datar­å­te» (eller kan­skje bare «råt­ne data», datar­å­te er et ord som også bru­kes på data­sys­te­mer som for­fal­ler ved at gam­le 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­di­en av dem å syn­ke, jo len­ger du kan sam­le inn uten feil jo mer blir data­ene verdt. Råt­ne data er smitt­somt. Fiks even­tu­el­le pro­ble­mer så snart du opp­da­ger dem.

Pdf, ocr, flash og annet gruff

Å lese .pdf på omtrent sam­me måte som html vir­ker i teori­en, det er bare vel­dig mye vans­ke­li­ge­re å få til på en effek­tiv og gjen­bruk­bar måte i prak­sis. Jeg har ikke selv fått det­te til på en måte jeg mener er god nok for auto­ma­ti­ser­te job­ber. Da Sen­ter for stat­lig øko­nomi­sty­ring (Sfso) star­tet å pub­li­se­re måned­lig stats­regn­skap i desem­ber i fjor, gjor­de jeg et for­søk på .pdfe­ne de pub­li­se­rer. Det­te 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­li­ca (ruby) eller Scra­per­wiki (pyt­hon) være til nyt­te.

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

Et sis­te triks er skra­ping av flash­si­der. Pro­Pub­li­ca viser deg hvor­dan du kan fin­ne fram til data­ene som en flash­si­de benyt­ter. Ved å bru­ke fire­bug kan du sna­ppe opp slikt, og så hop­pe over hele flash-biten. Flash lar seg ikke skra­pe slik html gjør, da flash på web vises som et html-ele­ment som inn­kaps­ler en flash-fil (.swf).

La analysen 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 begyn­ne å ana­ly­se­re. I man­ge til­fel­ler vil den job­ben du har gjort så langt være grunn­la­get for en story, kan­skje du kan rin­ge en eks­pert eller kon­fron­te­re en part med fun­ne­ne dine i et inter­vju? Uan­sett kan det være lurt å dob­belt­sjek­ke data­ene for feil eller mang­ler. En data­vask i Goog­le refi­ne kan i man­ge til­fel­ler slå sam­men dis­se to opp­ga­ve­ne, sjekk ut artik­ke­len om data­vas­king her på Vox Pub­li­ca. Pro­Pub­li­ca har også en artik­kel om Goog­le refi­ne.

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 å skri­ve, 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­ge­re meto­de 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 ret­ning.

Å scra­pe en web­si­de rutine­mes­sig og så selv leg­ge 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 den­ne ide­en, med et til­legg om at vi kol­lek­tivt kan gjen­bru­ke hver­and­res data­inn­sam­ling. Å bru­ke Scra­per­wiki til å ta hånd om data­lag­ring, auto­ma­ti­se­ring og arki­tek­tur for API­et kan være en løs­ning for team som job­ber sam­men i en redak­sjon. Redak­sjo­ner som er i direk­te kon­kur­ran­se med andre (riks­me­di­er) vil nok fore­trek­ke bedrifts­in­ter­ne løs­nin­ger.

Når en web­si­de end­rer struk­tur går ofte skra­pe­re «i styk­ker», de fin­ner ikke det de er på jakt etter len­ger for­di data­ene ikke er der i hie­rar­ki­et hvor de plei­de å være. Det­te er et av argu­men­te­ne mot å bru­ke 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åvir­ke hyp­pig­he­ten av. Min erfa­ring er at det­te 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 fle­re skra­pe­re som har kjørt siden jeg begyn­te med det­te for et drøyt år siden, og ingen skra­pe­re som har stop­pet eller krasjet. 

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

TEMA

D

atajour
nalisti
kk

28 ARTIKLER FRA VOX PUBLICA

FLERE KILDER - FAKTA - KONTEKST

2 KOMMENTARER

KOMMENTÉR
  1. […] This post was men­tio­ned on Twit­ter by Vox Pub­li­ca, Offent­li­ge data. Offent­li­ge data said: Kom i gang med web­skra­ping: Hvor­dan hen­te 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 å kun­ne dri­ve web­skra­ping, det vil si å hen­te data fra nett­si­der og las­te dem ned på data­ma­ski­nen. Det­te var blant de mest […]

Skriv en kommentar

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

Abonner på kommentarer
til toppen