Boa tarde.
Estou raspando os dados do campeonatos de surf profissional masculino no site da Worls Surf League (https://www.worldsurfleague.com/). Mas acho que ainda está muito manual, uso o mouse, olho a tela, copio valores etc.
Poderiam me ajudar no sentido de melhorar isso?
Criei para tal a função func_etapas
, que retorna um dataframe com as seguintes colunas:
“id” que identifica a etapa de um circuito (os circuitos são anuais e contêm 10 a 11 etapas);
“round” que indica a fase (eliminatórias, quartas e final, semifinal e final), no url é dado por “roundId=…”;
“heat”, a bateria, que representa o conjunto de atletas que competem ao mesmo tempo, em geral são 2 (homem a homem), mas podem ser 3 ou 4
“athlete”, que é o competidor;
“wave”, é o número da onda, no máximo 15; e,
“score” que é a nota em uma determinada onda.
Segue abaixo a função.
func_etapas <- function(base_url,
evento_url,
roundID,
num_heat,
athlete_per_heat,
quart_semi_final,
id) {
# As partes da url são:
# A base_url que vai do começo até mct (men's CT)
# O evento_url que vai do travessão até o sinal de igual.
# "/48/boost-mobile-pro?roundId="
# E o número do roundID (número na url que indica a parte da competição:
# final, semifinal, quartas etc), é só um número.
# Criando a coluna score.
vju <- paste0(base_url, evento_url, roundID)
score <- read_html(vju)%>%
html_nodes(".wave-wrap .score") %>%
html_text() %>%
str_squish()
# Criando a coluna athlete.
kol <- paste0(base_url, evento_url, roundID)
athlete <- read_html(kol)%>%
html_nodes(".avatar--athlete") %>%
html_text() %>%
str_squish() %>%
# Foi repetido 15 vezes porque cada atleta tem direito a 15 ondas.
rep(each = 15)
# Criando a coluna heat.
# Cada round tem uma quantidade de baterias e cada bateria uma quantidade de surfistas.
heat <- rep(c(1:num_heat), each = athlete_per_heat * 15)
# Número de linhas do tibble.
# Este número irá ajudar a fazer as repetições dos itens que não mudam em cada etapa:
# ano; local; genero; parada etc.
num_lin <- length(athlete)
# Round significa quartas, semi, final etc.
round <- rep(quart_semi_final, num_lin)
# É o número da onda do competidor.
wave <- rep(1:15, num_lin/15)
id <- id
# Criando o tibble.
tabela <- tibble(id, round, heat, athlete, wave, score) %>%
#### Excluindo as células de score vazias.
filter(score != "")
}
As listas para cada etapa tem esta formação.
a <- list('https://www.worldsurfleague.com/events/2011/mct')#url base
b <- list('/259/rip-curl-pro-bells-beach?roundId=')#url da etapa
c <- list(538,694,545,696,691,692,1038,1055)#roundID
d <- list(12,12,12,4,4,4,2,1)#número de baterias
e <- list(3,2,2,3,2,2,2,2)#número de atletas por bateria
f <- list('Round 1', 'Round 2', 'Round 3', 'Round 4', 'Round 5',
'Quarterfinal', 'Semifinal', 'Final')#os nomes das baterias
g <- list(201102)#id, que é ano seguido do stop.
Ao final aplico a função.
# Agora criando o tibble do men's ct de 2008 etapa quiksilver pro gold coast.
mens_2011_rip_curl_pro_bells_beach <- pmap(list(a,b,c,d,e,f,g), func_etapas) %>%
# Até aqui temos uma list de tibbles, o bind_rows junta todas elas em uma só.
bind_rows()
A função funciona, o problema é estou preenchendo as listas usando mouse e copiando os valores numa folha de papel, mas gostaria de automatizar mais o procedimento.
Alguém poderia me dar alguma pista ou sugestão?
Agradeço desde já a atenção.