Raspagem de dados WSL

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.

3 curtidas

Oi, Mário. Tudo bem?

Não sei se vou conseguir ajudar…
Mas por que você não pega os dados de cada etapa pela URL do ano (por exemplo, https://www.worldsurfleague.com/events?year=2011) em vez de indicar dentro da lista aquelas informações? Você quer os dados de todas as etapas ou só de algumas em específico?

Um abraço!

2 curtidas

Obrigado Gabriel.

Consegui automatizar relativamente a busca pelos ‘roundID=’ de cada fase de uma competição. Adiantou um bocado. Preciso conhecer melhor o tema ‘web scraping’, até para aproveitar mais a ajuda da comunidade.

abs.