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.
Õnneks oli eelnev tekst fiktsioon ja 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.
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.
Vastava html koodiga saad mängida siin.
Loe lühiülevaadet, millest koosnevad veebilehed.
Uuri paketi rvest minimalistlikku näidet.
Minimalistliku näite põhjal peaksid oskama eraldada lähtekoodis olevad 4 lõiku. Et eraldada lõik, kus id=“p01”, pead teadma, kuidas CSS-is tähistatakse id-sid. Suur vihje on olemas eelneva html koodi < style > blokis. Abiks võib-olla ka CSS selektorite interaktiivne testnäide.
(1 boonuspunkt) CSS selektorite õppimiseks on tore tutorial http://flukeout.github.io/. Tee läbi esimesed 6 taset ja saada vastused tekstina.
Uuri paketi rvest dokumentatsiooni. Kasuks tulevad funktsioonid
html
,html_node
,html_nodes
jahtml_text
.Lõpptulemuse peaks olema selline:
tekst = c("I am different.")
url = "http://andmeteadus.github.io/2016/examples/html1.html"
# sinu kood
Ülesanne 2 (2 punkti) - CSS class
Eralda html koodis punaselt olev tekst muutujasse tekst
. Kasuta paketti rvest.
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 veebilehelt (lähtekoodi nägemiseks paremklikk ja Wiew Page Source), mitu saadikut hääletas kooseluseaduse:
- 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.
Vihjed:
- Funktsioonile
html_nodes
antud argumendis võib olla mõistlik tühikud asendada punktidega. - 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/tegevus/tooulevaade/haaletused/haaletustulemused-kohalolekukontroll/a85129ed-4873-4b9d-ac37-4788b6587fa0/"
# sinu kood
Ülesanne 4 (2 punkti)
- Eralda kooseluseaduse eelnõu hääletamistulemuste veebilehelt andmetabel, kus on 101 rida ja tunnused Nimi, Otsus ja 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/tegevus/tooulevaade/haaletused/haaletustulemused-kohalolekukontroll/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.
- Kõigepealt paki lahti zip fail ja 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 argumentfull.names
võimaldab tagastada terve failitee).
filenames = list.files("C:/Users/Kasutaja/andmeteadus/kodutoo5/", pattern = "*.csv", full.names=TRUE)
- 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
olevadcsv
andmestikud ja 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 funktsiooniextract_table
. - Eelneva
for
-tsükli asemel võid kasutada funktsioonilapply
.
Lisa igal tsükli sammul andmestikule hääletuse indeks või muu identifikaator. Näiteks
temp$haaletus = i
.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”.Muuda pikk andmetabel laiaks. Seda aitab teha paketi reshape2 käsk
dcast
. Uuri funktsioonidcast
minimalistlikku näidet siit.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.
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 koodiplokieval=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.
url = "http://www.postimees.ee/"
# sinu kood
Ülesanne 7 (3 punkti)
Eva “Usin” Masinal on suur huvi ilmaandmete vastu. Kümme minutit pärast iga täistundi märgib ta Ilmateenistuse vaatlusandmeid oma märkmikku, et hiljem analüüsi teha.
Automatiseeri seesama protsess.
Juhised:
- Riigi Ilmateenistus pakub värskeid ilmaandmeid XML faili kujul.
- Meie tegeleme Eesti vaatlusandmete XML failiga.
- Saa XML failist kätte iga ilmajaama õhurõhk.
- Saa XML failist kätte iga ilmajaama tuule kiirus.
- Tee neist õhurõhu ja tuule kiiruse scatterplot.
Näpunäide:
Ülesanne 8 (2 punkti)
Eva “Usin” Masin on lotohuviline, aga ta pole aastaid Viking Lottoga võitnud. Ta arvab, et lototulemused pole päris juhuslikud ning lotos on võimalik statistiline eelis saada. Seepärast märgib ta iga lotokolmapäev Viking Lotto loositud numbrid üles ja uurib, kas number kahtesid loositakse rohkem välja, kui juhus lubaks.
1.) Õpeta tehis-Eva tegema seda sama.
- Eesti Loto veebilehel on toodud statistika loositud pallide sagedusest.
- Eralda vastav tabel, kus veergudes on tunnused Number, Sagedus ja Sagedus protsentides.
- selectorgadget veab sind siin alt ning kergem on lähtekoodi inspekteerida brauseris olevate tööriistadega (Chrome’s vajuta
Ctrl + Shift + I
või tee parem klikk ja vajuta inspekteeri elementi). - Visualiseeri saadud andmetabelit. Tee näiteks tulpdiagramm, kus x-teljel on arvud 1-48 ning y-telg tähistab sagedust.
2.) (2 boonuspunkti + lisaboonuspunkt) Viimase 250 loosiga on pall 35 tulnud 31 korral, pall 34 aga 55 korral. Uuri, kas on alust arvata, et Viking Lotto süsteem on kallutatud. Selleks mõtle välja, kuidas seda kontrollida (näiteks võid kasutada simulatsioonidel põhinevat lähenemist). Selgita lühidalt oma lähenemist ja raporteeri, millise tulemuse said. Lisaboonuspunkti saamiseks visualiseeri seda tulemust.
Boonusülesanne 1 (kuni 5 punkti) - Kas kõik teed viivad Facebooki? (ehk juhuslik ekslemine veebilehtedel)
Alusta suvaliselt veebilehelt. Eralda kõik väljuvad lingid. Vali üks neist linkidest suvaliselt. Hüppa sellele lingile. Kui sellel leheküljel pole ühtegi väljuvat linki, mine tagasi. Kui väljuvaid linke on mitmeid, vali jälle välja suvaline ja hüppa sinna. Kui jõudsid Facebooki, on katse lõppenud. Korda seda protsessi mitu korda ja erinevate alglehtedega. Uuri, mitmel juhul jõudsid FBsse.
Näpunäide: Abiks on paketi rvest funktsioon follow_link()
.
Boonusülesanne 2 - Facebooki API kasutamine
Kasuta paketti Rfacebook ning leia:
(1 boonuspunkt) Mis on olnud Tartu Ülikooli Facebooki lehe kõige populaarsem postitus? Mis on olnud matemaatika-informaatikateaduskonna Facebooki lehe kõige populaarsem postitus?
(5 boonuspunkti :-)) Kasuta R-i, et uuendada oma staatust tekstiga ‘Teen aine “Statistiline andmeteadus ja visualiseerimine” kodutööd. Väga põnev! :-)’. Abiks on käsk updateStatus
.
(3 boonuspunkti) Kui sulle ei meeldi Facebooki algoritm, mille põhjal ta postitusi ja pilte uudisvoos järjestab, mõtle välja algoritm, mis selle parandab. Implementeeri selle prototüüp (kasuks tuleb käsk getNewsfeed
).
Abistavad lingid:
- Kuidas autentida: http://thinktostart.com/analyzing-facebook-with-r/
- Rfacebook dokumentatsioon: http://cran.r-project.org/web/packages/Rfacebook/Rfacebook.pdf