WebScraper - raspagem dentro da raspagem

Olá,

Estou tentando descobrir quais são os atletas olímpicos do estado do Paraná. Dentro do site do Comitê Olímpico Brasileiro (COB) entrei na seção “atletas” (https://www.cob.org.br/pt/cob/time-brasil/atletas). Ao perceber como os dados estavam organizados, vi que daria pra usar o Webscraper. Consegui fazer uma tabela com os nomes dos(as) atletas, a modalidade e a foto de cada um(a) (bem semelhante ao exercício da AMAZON, no curso de DADOS 360).

No entanto, o dado “local de nascimento” de cada esportista só é possível saber quando clicamos na imagem deles. Minha dúvida é: Como faço para que o webscraper raspe os elementos de uma página e também um dado que está dentro de um link em cada um dos elementos?

No vídeo do exercício da AMAZON, no curso DADOS 360, o Adriano comenta que um dos seletores do webscraper é o “Element click”. Fiquei imaginando que talvez a solução fosse por esse caminho, porém não consegui avançar.

Até o momento, cheguei até aqui:

{"_id":“cob”,“startUrl”:[“https://www.cob.org.br/pt/cob/time-brasil/atletas?&page=[1-16]"],“selectors”:[{“id”:“atleta”,“type”:“SelectorElement”,“parentSelectors”:["_root"],“selector”:“div.col-lg-4”,“multiple”:true,“delay”:0},{“id”:“nome”,“type”:“SelectorText”,“parentSelectors”:[“atleta”],“selector”:“h3”,“multiple”:false,“regex”:"",“delay”:0},{“id”:“modalidade”,“type”:“SelectorText”,“parentSelectors”:[“atleta”],“selector”:“span”,“multiple”:false,“regex”:"",“delay”:0},{“id”:“foto”,“type”:“SelectorImage”,“parentSelectors”:[“atleta”],“selector”:“img”,“multiple”:false,"delay”:0}]}

Na imagem o dado que eu gostaria de extrair de cada atleta: “local de nascimento”

1 Curtida

@Talita dá uma olhada em como funciona o seletor ‘Link selector’. Em uma tradução livre da documentação oficial aqui:

O seletor de links é usado para selecionar links e navegar nos sites. Se você usar o seletor ‘Link Selector’ sem nenhum seletor “filho” então ele irá extrair o link (URL) e o atributo ‘href’ do link. Se você adicionar seletores filhos para o ‘Link selector’ então estes seletores filhos serão utilizados na página que o link está apontando.

Não consegui importar seu sitemap, mas ao que parece falta apenas você criar o ‘Link selector’ apontando onde está o link de cada caixa para em seguida, entrar na página de um perfil, e criar um novo seletor de texto que aponte para o texto da ficha técnica. Fiz um teste aqui com este sitemap e parece que atende o que você busca. Dá uma olhada aí:

{"_id":“cob”,“startUrl”:[“https://www.cob.org.br/pt/cob/time-brasil/atletas"],“selectors”:[{“id”:“atletas”,“type”:“SelectorElement”,“parentSelectors”:["_root"],“selector”:“div.col-lg-4”,“multiple”:true,“delay”:0},{“id”:“nome”,“type”:“SelectorText”,“parentSelectors”:[“atletas”],“selector”:“h3”,“multiple”:false,“regex”:"",“delay”:0},{“id”:“categoria”,“type”:“SelectorText”,“parentSelectors”:[“atletas”],“selector”:“span”,“multiple”:false,“regex”:"",“delay”:0},{“id”:“perfil”,“type”:“SelectorLink”,“parentSelectors”:[“atletas”],“selector”:“a”,“multiple”:false,“delay”:0},{“id”:“data”,“type”:“SelectorText”,“parentSelectors”:[“perfil”],“selector”:".shadow p”,“multiple”:false,“regex”:"",“delay”:0}]}

1 Curtida

Oi, Talita. Tudo bem?

Eu não tenho prática com a extensão Webscraper, mas fiz um código no R que faz isso que você deseja. Só não ficou perfeito porque o site não tem os dados referentes a alguns atletas.

Se você tiver interesse, é só rodar o código abaixo no RStudio ou baixar o CSV no link abaixo:

# instalação do pacote
install.packages("tidyverse")

# leitura do pacote
library(tidyverse)

i <- 1:16 # número de páginas com atletas
list_url <- paste0("http://www.cob.org.br/pt/cob/time-brasil/atletas?&page=", i)

# função para pegar todos os links de atletas dentro da lista de url
pegar_url <- function(x){
  url[x] %>%
  read_html() %>%
  html_nodes("a") %>%
  html_attr("href") %>%
  as.data.frame() %>%
  rename("link" = ".") %>%
  filter(str_detect(link, "time-brasil/atletas/")) %>%
  mutate(link = str_replace_all(link, "https", "http"))
}

all_url <- map_dfr(1:length(list_url), pegar_url)
  
# função para pegar todas as informações de atletas dentro de cada link
pegar_info <- function(x){
  as.character(all_url$link[x]) %>%
  read_html() %>%
  html_node("div.card-body") %>%
  html_node("p") %>%
  html_text() %>%
  as.data.frame() %>%
  rename("conteudo" = ".") %>%
  mutate(link = all_url$link[x],
        conteudo = str_remove_all(conteudo, "  ")) %>%
  separate(conteudo, c("nome_completo", "data_de_nascimento", "local_de_nascimento"), sep = "\r\n\r\n") %>%
  mutate(nome_completo = str_remove_all(nome_completo, "Nome completo: "),
         data_de_nascimento = str_remove_all(data_de_nascimento, "Data de nascimento: "),
         local_de_nascimento = str_remove_all(local_de_nascimento, "Local de nascimento: "))
}

all_info <- map_dfr(1:length(all_url$link), pegar_info)

# download do csv com as informações de atletas
write.csv(all_info, "dados_dos_atletas_COB.csv")

Link do CSV: https://gist.github.com/gabrielacaesar/df332c76147eeaed6719e3db21c600ff
Link do R: https://github.com/gabrielacaesar/studyingR/blob/master/atletas_cob.R

Adriano e Gabriela, obrigada pelo retorno!

Vou ser se consigo colocar em prática as soluções que vcs sugeriram. Abraço!

2 Curtidas

As vezes vale a pena mandar um e-mail pra imprensa, provavelmente eles tem esse tipo de informação pronta.