Statistiline andmeteadus ja visualiseerimine MTMS.01.100     Praktikumid     Projektid

Andmete kraapimine veebist

Sissejuhatus

Eva “Usin” Masin on esimeses praktikumis kohatud Mati “Raha” Masina vastand. Talle meeldib rutiinsus, andmete tuim kopeerimine ja sisestamine. Vabal ajal meeldib talle lugeda romaanisarja “Tõde ja õigus” - eelmine nädal luges ta kokku tähekombinatsiooni “pa” esinemissageduse. Homme pärast tööd jätkab ta “pb” esinemissageduse leidmisega.

Kahjuks oli eelnev tekst fiktsioon ning eva-laadsed kopeerijad surid välja koos neandertaallastega. Selles praktikumis vaatame, kuidas R-is ellu äratada tehis-Eva, kes oskab veebilehtedelt automaatselt infot eraldada ja selle transformeerida struktureeritud andmestikuks.

Täpsemalt, uurime

  • kuidas eraldada Riigikogu hääletamistulemusi,
  • kuidas eraldada Postimehe uudiste pealkirju,
  • kuidas eraldada ilmajaama vaatlusandmeid.

alt text

Kaks esimest ülesannet õpetavad paketi rvest funktsionaalsust ja annavad sissejuhatuse veebikraapimisse minimalistlike veebilehtede põhjal.

Ülesanne 1 (2 punkti) - CSS id

Eralda html koodis sinisena olev tekst muutujasse tekst. Kasuta paketti rvest.

alt text

url = "http://andmeteadus.github.io/examples/html1.html"

# sinu kood

Ülesanne 2 (2 punkti) - CSS class

Eralda html koodis punaselt olev tekst muutujasse tekst. Kasuta paketti rvest.

alt text

  • Vastava html koodiga saad mängida siin.

  • Lõpptulemuse peaks olema selline: tekst = c("I am different.", "I am different too.")

url = "http://andmeteadus.github.io/examples/html2.html"

# sinu kood

Ülesanne 3 (2 punkti)

Eralda Riigikogu hääletamistulemuste veebilehe html lähtekoodist, mitu saadikut hääletas kooseluseaduse eelnõu:

  • poolt
  • vastu
  • oli erapooletu
  • ei hääletanud

Praktikumis tutvusime, kuidas brauseri veebiarendus tööriistadega leida üles lähtekoodist vajalikud kohad. Variandid olid:

  • Chrome’is vajuta parem klikk ja “inspekteeri elementi”. Alernatiivid on klahvikombinatsioon Ctrl + Shift + I või klahv F12.
  • vahendiga selectorgadget

Need muudavad lähtekoodis õige klassi, id või sildi leidmise oluliselt lihtsamaks. Mõnes olukorras on kasulikum üks variant, mõnes teine.

Vihje: Kasutada paketi tidyr funktsiooni extract_numeric() kui sa ei taha regulaaravaldistega mässata. Vaata näiteks, mida teeb järgmine koodirida "Kokku: 101 liiget" %>% extract_numeric()

url = "http://www.riigikogu.ee/?op=ems&page=haaletus&hid=a85129ed-4873-4b9d-ac37-4788b6587fa0&"

# sinu kood

Ülesanne 4 (2 punkti)

  • Eralda kooseluseaduse eelnõu hääletamistulemuste veebilehe html lähtekoodist andmetabel, kus on 101 rida ning tunnused nr, nimi, otsus, fraktsioon.

Vihje: kasuta funktsiooni html_table

  • Kirjuta vastav kood funktsiooniks extract_table (seda funktsiooni läheb vaja järgmises ülesandes, kus eraldad kõigi Riigikogu XII hääletuste kohta vastava tabeli). Sisendiks on kas veebilehe url, faili lokaalne asukoht või sõne. Funktsioon peab tagastama vastava data.frame-i (pane tähele, et su funktsioon ei tagastaks listi, milles on üks data.frame).
url = "http://www.riigikogu.ee/?op=ems&page=haaletus&hid=a85129ed-4873-4b9d-ac37-4788b6587fa0&"

extract_table = function(x){
  # sinu kood
}

Kontrolli, et funktsioon töötab.

Ülesanne 5 (5 punkti) - andmestiku ehitamine

Ülesandes 4 tegid läbi Riigikogu saadikute hääletamistulemuste eraldamise kooseluseaduse korral. Failis htmls.zip on olemas veebilehed kõigi Riigikogu XII hääletuste kohta. Sinu ülesandeks on koostada andmetabel, kus ridades on Riigikogu saadiku nimi ja veergudes kõik hääletamiskorrad. Seda andmestikku läheb vaja järgmises praktikumis, kus uurime hääletamismustreid.

  1. Kõigepealt paki lahti zip fail ning loe R-i sisse kõigi html failide nimed.
    Näpunäide: Järgnev kood aitab kätte saada kõigi antud kaustas olevad csv-failide nimed (seejuures argument full.names võimaldab tagastada terve failitee).
filenames = list.files("C:/Users/Kasutaja/andmeteadus/kodutoo5/", pattern = "*.csv", full.names=TRUE)
  1. Esialgu loe sisse umbes 5 erinevat html faili.
  • NB! Alles siis, kui oled täiesti kindel, et sinu kood töötab korrektselt, võta kasutusele kõik html failid.
  • Näpunäide: Järgnev kood loeb sisse kõik muutujas filenames olevad csv andmestikud ning tekitab neist listi.
list_of_dataframes = list()
for(i in 1:length(filenames)){
  temp = read.csv(filenames[i])
  list_of_dataframes[[i]] = temp
}
  • Praegu pole sul read.csv käsuga midagi peale hakata, sest tegeleme html failidega. Kasuta ülesandes 4 kirjutatud funktsiooni extract_table.
  • Eelneva for-tsükli asemel võid kasutada funktsiooni lapply.
  1. Lisa igal tsükli sammul andmestikule hääletuse indeks või muu identifikaator. Näiteks temp$haaletus = i.

  2. Nüüdseks peaksid olema saanud listi, mille elementideks on erinevad andmetabelid (kõiki faile kasutades peaks nende koguarv olema 1845). Tee nendest andmetabelitest üks suur (pikk) andmetabel, paigutades need üksteise otsa. Seda aitab teha paketi dplyr funktsioon rbind_all. Tulemuseks peaksid saama andmetabeli, mille ridade arv on 101 * “sinu kasutatud failide arv”.

  3. Muuda pikk andmetabel laiaks. Seda aitab teha paketi reshape2 käsk dcast. Uuri funktsiooni dcast minimalistlikku näidet siit.

  4. Kui kõik eelnev töötab, tee eelnev läbi kõikide html failidega. Ära kohku, kui kõikide html tabelite eraldamisega läheb aega 5 minutit või rohkem.

  5. Soovitus: Kui oled eelneva ühe korra läbi teinud, pole vaja knitri raporti genereerimisel enam sedasama korrata. Saadud andmetabeli saad endale salvestada käsuga save(andmed, file="riigikogu.RData"). Raportis võid muuta vastava koodiploki eval=FALSE.

# sinu kood

Lõpptulemuseks võiksid saada järgneva andmestiku, kus on 143 rida ning 1846 veergu.

Nimi 1 2 3 4 1844 1845
Aadu Must vastu poolt vastu poolt NA NA
Aare Heinvee poolt poolt poolt poolt poolt poolt
Aivar Kokk poolt poolt poolt poolt puudub puudub

Ülesanne 6 (3 punkti)

Eva “Usin” Masin töötab start-upis, mis lubab Eesti turule tuua unikaalse personaalse uudisterakenduse, mis filtreerib uudiseid vastavalt kasutaja soovidele. Eva “Usin” Masin pandi koostama andmebaasi Postimehe esilehe uudiste kohta. Eva teab, kuidas karjääriredelis ülespoole ronida: “Bossi käsu peale olgu uudiste pealkirjad võimalikult kiiresti olemas”.

Automatiseeri seesama protsess. Tagasta kõik Postimehe esilehe uudiste pealkirjad (joonisel näidatud kollasega).

  • Ära kurvasta, kui sa ei saa absoluutselt kõiki pealkirju, 97% on praegu piisav.
  • Kui sulle ei meeldi Postimehe veebilehe hiiglaslikku lähtekoodi inspekteerida brauseris vaikimisi olevate vahenditega, siis abiks on praktikumis tutvustatud tööriist selectorgadget.
  • Vaata, et sinu tagastatud pealkirjade hulgas poleks tühju sõnesid või arve.