matevzraspet / APPR-2017-18

Repozitorij z gradivi za predmet Analiza podatkov s programom R v študijskem letu 2017/18
MIT License
0 stars 0 forks source link

Uvoz tabele #1

Closed matevzraspet closed 6 years ago

matevzraspet commented 6 years ago

Pozdravljeni, imam problem, da ne vem točno kako bi iz spletne strani(link naveden spodaj) pobral več podatkov iz tabele. Spletna stran namreč prikazuje 25 zadetkov v tabeli na stran, potem pa je treba klikniti naprej za novih 25 podatkov(povezava do spletne strani pa ostaja identična).

Sam sem tako uvozil tabelo s 25 podatki, rad pa bi uvozil 100 podatkov. Koda je navedena spodaj.

link <- "https://www.transfermarkt.com/spieler-statistik/wertvollstespieler/marktwertetop?land_id=0&ausrichtung=alle&spielerposition_id=alle&altersklasse=alle&jahrgang=0&plus=1" stran <- html_session(link) %>% read_html() podrobno <- stran %>% html_nodes(xpath="//table") %>% .[[2]] %>% html_table(dec = ",", fill = TRUE) podrobno <- podrobno[,-c(1,2,3,7,8)] colnames(podrobno) <- c("igralec", "pozicija", "starost", "vrednost", "odigrane tekme", "zadeti goli", "avtogoli", "asistence", "rumeni kartoni", "drugi rumeni karton", "rdeci karton","prisel kot menjava","odsel na klop") podrobno <-na.omit(podrobno)

  1. problem: Na zgoraj navedenem linku sta v tabeli tudi sličici države in kluba v katerem igra igralec. Ne vem točno kako lahko ta dva podatka uvozim v tabelo, saj sta podana v obliki slike, tako da bom imel v svoji tabeli še stolpca z državljanstvom igralca in klubom igralca v katerem igra.

Najlepša hvala za pomoč,

Matevž Raspet

jaanos commented 6 years ago

Po straneh lahko skačeš tako, da na koncu URL-ja dodaš še &page= in številko strani (od 1 naprej). Tako bo najbolje, če si pripraviš funkcijo za uvoz izbrane strani:

uvozi.igralce <- function(stran) {
  link <- sprintf("https://www.transfermarkt.com/spieler-statistik/wertvollstespieler/marktwertetop?land_id=0&ausrichtung=alle&spielerposition_id=alle&altersklasse=alle&jahrgang=0&plus=1&page=%d", stran)
  tabela <- html_session(link) %>% read_html() %>% html_nodes(xpath="//table") %>% .[[2]]
  podrobno <- tabela %>% html_table(dec = ",", fill = TRUE) %>%
    .[, -c(1, 2, 3, 7, 8)] %>% na.omit()
  colnames(podrobno) <- c("igralec", "pozicija", "starost", "vrednost", "odigrane.tekme",
                          "zadeti.goli", "avtogoli", "asistence", "rumeni.kartoni", "drugi.rumeni.karton",
                          "rdeci.karton", "prisel.kot.menjava", "odsel.na.klop")
  podrobno$drzava <- tabela %>% html_nodes(xpath="./tbody/tr/td[4]/img[1]") %>% html_attr("alt")
  podrobno$klub <- tabela %>% html_nodes(xpath="./tbody/tr/td[5]/a/img[1]") %>% html_attr("alt")
  return(podrobno)
}

Ker html_table izpusti podatke, ki niso v besedilu tabele - torej med drugim državo in klub - bo treba za te poskrbeti ročno. V zgornji kodi se tako prebere atribut alt pri prvi sliki v četrtem oziroma petem stolpcu v tabeli, prebrani podatki pa se dodajo kot stolpec v končno razpredelnico.

Da dobiš podatke iz npr. prvih 4 strani, lahko potem narediš enostavno

igralci <- lapply(1:4, uvozi.igralce) %>% bind_rows()

Mimogrede: svetujem, da v imenih stolpcev ne uporabljaš presledkov (pa tudi ne šumnikov in ostalih posebnih znakov), saj se boš kasneje tako lažje skliceval nanje. V zgornjem primeru sem tako presledke nadomestil s pikami.

Podatke, ki jih tako pridobiš, pretvori še v obliko tidy data. Svetujem, da narediš dve tabeli: eno z osnovnimi podatki (ime, pozicija, starost, vrednost, država, klub - seveda pretvori vrednost v število), in eno s številskimi podatki (stolpci, ki se nanašajo na tekme, gole in kartone, bodo tako pretvorjeni v vrstice).

matevzraspet commented 6 years ago

Zmenjeno, najlepša hvala za pomoč.