####################################
# Webscraping ######################
####################################

install.packages("tidyverse")
install.packages("rvest")

library(tidyverse)

# v r je nekolik knihoven pouzitelnych pro stahovani z internetu, my budeme pouzivat rvest
library(rvest)

# nejprve potrebujeme link, ze ktereho budeme stahovat
#pred stahovanim overime licencni podminky o pristupu robotu en.wikipedia.org/robots.txt - pro srovnani zkuste take facebook.com/robots.txt
URL <- "https://en.wikipedia.org/wiki/2021_Scottish_Parliament_election"

#potom je nutne nacist stranku do R, stranky jsou v html jazyce, proto pouzivame prikaz read_html
pg <- read_html(URL)

#nastavit link i nacist stranku muzeme v jednom kroku, ve smyckach to ale muze prinest komplikace, proto doporucuji spise postup na 2 radky
pg <- read_html("https://en.wikipedia.org/wiki/2021_Scottish_Parliament_election")
#nactena stranka vypada takto
pg


#stahnuti tabulky
# v nactene strance musime urcit tabulku ke stazeni pomoci html_nodes
# a potom stahnout pomoci html_table
# pro stazeni textu html_text, dalsi moznosti 

??html_nodes
??html_table

#prvni priklad


tabulka1 <- pg %>%
  html_nodes(xpath='//*[@id="mw-content-text"]/div[1]/table[2]') %>%   ##tuto "cestu" najdeme pomoci weboveho prohlizece, pozor na uvozovky, pokud jsou v rámci cesty pouzity, tak hranicni uvozovky musi byt jine
  html_table()
#stazena tabulka je soucasti listu, extrakci provedeme takto
tabulka1 <- tabulka1[[1]]


#druhy priklad

tabulka2 <- pg %>%
  html_nodes(xpath='//*[@id="mw-content-text"]/div[1]/table[8]') %>%   ##tuto "cestu" najdeme pomoci weboveho prohlizece, pozor na uvozovky, pokud jsou v rámci cesty pouzity, tak hranicni uvozovky musi byt jine
  html_table()
tabulka2 <- tabulka2[[1]]

#Error: Table has inconsistent number of columns. Do you want fill = TRUE?
# Nefunguje to, tak se podivame do napovedy nebo na stackoverflow
?html_table

#musime do html_table do zavorky napsat fill = TRUE, rovnou muzeme nastavit i header
tabulka2 <- pg %>%
  html_nodes(xpath='//*[@id="mw-content-text"]/div[1]/table[8]') %>%   
  html_table(header = TRUE, trim = TRUE, fill = F, dec = ".")
tabulka2 <- tabulka2[[1]]


#vratme se k tabulce 1
# na wiki je v tabulce cela rada linku, ty ale nejsou ve stazene tabulce

#stazeni linku
?html_attr



linky <- pg %>%
  html_nodes(xpath = '//html/body/div[3]/div[3]/div[5]/div[1]/table[2]/tbody/tr/td[1]/span/span/span/a') %>% 
  html_attr("href")    #tady je zmena oproti predchozimu, namisto html_table pouzivame html_attr, href rika, ze jde o odkaz, nekdy je ale atribut html_attr("data-permalink") 

#jde o linky do wikipedie, takze je potreba z nich udelat kompletni linky pridanim zacatku
linky <- as.data.frame(linky)
linky$linky_ok <- paste("https://en.wikipedia.org", linky$linky, sep="")

#pro dalsi pouziti si z korenu linku vyrobime jmena poslancu smazanim /wiki/ tim, ze znaky nahradime nicim
linky$jmeno <- gsub( "/wiki/", "", linky$linky) 


#linky vyuzijeme ke stazeni informaci o poslancich
#nejprve vyzkousime, jestli to muze fungovat na jednom pripadu
URL <- linky$linky_ok[1]
pg <- read_html(URL)
tabulka <- pg %>%
  html_nodes(xpath= '//html/body/div[3]/div[3]/div[5]/div[1]/table') %>%   
  html_table( fill = TRUE)
tabulka <- tabulka[[1]]


#kdyz chceme stahovat stejne veci z ruznych stranek tak muzeme vyuzit tzv. smycku - naglicky loop
for(i in 1:32){
  URL <- linky$linky_ok[i]
  pg <- read_html(URL)
  tabulka <- pg %>%
    html_nodes(xpath= '//html/body/div[3]/div[3]/div[5]/div[1]/table') %>%   
    html_table( fill = TRUE)
  tabulka <- tabulka[[1]]
  
    filename <- paste("C:\\Users\\petrh\\Documents\\politologie\\vyuka\\datamanagment\\stahovani\\", linky$jmeno[i], '.csv', sep="") ## pred stahovanim je nutne si zalozit slozku, kam se budou soubory stahovat, cesta ke slozce musi byt soucasti jmena stahovaneho souboru
  write.csv(tabulka, row.names= FALSE, file=filename) #tabulku ulozime
}

#ve slozce se podivejte na tabulku Angus_MacDonald_(politician)
#ze stranek se stahla jina tabulka nez ta s informacemi
# pro stazeni spravnych tabulek ze vsech stranek musime postupovat jinak, namisto xpath pouzijeme css

for(i in 1:length(linky$linky_ok)){
  URL <- linky$linky_ok[i]  #tady je dulezite nahradit 1 za i
  pg <- read_html(URL)
  tabulka <- pg %>%
    html_nodes(css = ".infobox") %>%   
    html_table( fill = TRUE)
  tabulka <- tabulka[[1]]
  
  filename <- paste("C:\\Users\\petrh\\Documents\\politologie\\vyuka\\datamanagment\\stahovani\\tabulka_", linky$jmeno[i], '.csv', sep="")
  write.csv(tabulka, row.names= FALSE, file=filename)
}



