Web-scraping URL fixa

Olá, pessoal. Tudo bem?

Estou fazendo um trabalho para faculdade e utilizei algumas séries do site: http://www14.fgv.br/fgvdados20/default.aspx?Convidado=S

No site, eles dão a opção de baixar a série em formato XLS. No entanto, como a url não muda e não encontrei o arquivo .xls na opção de inspercionar, recorro aqui a ajuda de vocês.

Pois bem, a ideia seria navegar pelo R, de modo a baixar o arquivo XLS da série de “Indicadores de Incerteza”. Para tanto, a seguinte ordenação de passos deve ser estabelecida:

  1. Acessar o site http://www14.fgv.br/fgvdados20/default.aspx?Convidado=S

  2. Clicar no triângulo ao lado de "Séries Institucionais FGV (Consultas Gratuitas)
    fgv1

  3. Em seguida, clicar no triangulo ao lado de “Indicadores de Incerteza”
    fgv2

  4. Marcar a opção de "Indicador de Incerteza da Economia Brasil (IIE-Br)
    fgv3
    fgv4

  5. Clicar em “Fechar”

  6. Clicar em “Série histórica” e, em seguida, “Visualizar e salvar” .

Nesse ponto a série em questão aparece em uma tabela e na parte superior lhe da a opção de salvar em diversos formatos. Qualquer um deles é últil pois permite o tratamento no R.

Então, minha dúvida é a seguinte:

  1. Será que preciso criar um script que “navegue” por esses passos até conseguir baixar ou capturar a tabela? Ou será que na inspeção existe algum link “escondido” que já me leve diretamente para a série de dados?

  2. Como fazer isso no R? Não sei nem por onde começar, rs.

Como sempre, agradeço demais a ajuda de vocês e parabenizo pela iniciativa do fórum.

Olá @vetromille, tudo bem?

Vou responder só o primeiro passo pois é beeeeeem trabalhoso :slight_smile:

O script abaixo serve para fazer o clique no primeiro triângulo (:sob:)

Os passos foram

  • Acessar página inicial do site para obter os parâmetros da sessão (viewstate e viewstate generator)
  • No navegador, cliquei no triângulo para ver quais requisições eram feitas. São duas principais: default e consulta. A default é um POST e a consulta é um GET.
  • Então primeiro peguei os parâmetros do POST, fiz o POST e depois acessei a segunda página via GET

library(magrittr)

# acessa pagina inicial
r0 <- httr::GET("http://www14.fgv.br/fgvdados20/default.aspx?Convidado=S")

# pega parâmetros que dependem da sessão
vs <- r0 %>% 
  xml2::read_html() %>% 
  xml2::xml_find_first("//*[@id='__VIEWSTATE']") %>% 
  xml2::xml_attr("value")

vs_gen <- r0 %>% 
  xml2::read_html() %>% 
  xml2::xml_find_first("//*[@id='__VIEWSTATEGENERATOR']") %>% 
  xml2::xml_attr("value")

# escreve os parâmetros (obtive da aba "Network")
parametros <- list(
  "ctl00$smg" = "ctl00$updpCatalogo|ctl00$dlsCatalogoFixo$ctl01$imbOpNivelUm",
  "cphConsulta_tabInicial_ClientState" = '{"ActiveTabIndex":0,"TabEnabledState":[true,true,true],"TabWasLoadedOnceState":[true,false,false]}',
  "__EVENTTARGET" = "",
  "__EVENTARGUMENT" = "",
  "cphConsulta_TabUltimos_ClientState" = '{"ActiveTabIndex":0,"TabEnabledState":[true,true,true,true],"TabWasLoadedOnceState":[true,false,false,false]}',
  "__VIEWSTATE" = vs,
  "__VIEWSTATEGENERATOR" = vs_gen,
  "__VIEWSTATEENCRYPTED" = "",
  "ctl00$drpFiltro" = "E",
  "ctl00$txtBuscarSeries" = "",
  "ctl00$cphConsulta$txtCMValor" = "",
  "ctl00$cphConsulta$txtCMData" = "__/__/____",
  "ctl00$cphConsulta$mkeCMData_ClientState" = "",
  "ctl00$cphConsulta$drpMoedaDe" = "0",
  "ctl00$cphConsulta$drpMoedaPara" = "1",
  "ctl00$cphConsulta$txtAMValor" = "",
  "ctl00$cphConsulta$txtAMDataInicio" = "__/__/____",
  "ctl00$cphConsulta$mkeAMDataInicio_ClientState" = "",
  "ctl00$cphConsulta$txtAMDataFinal" = "__/__/____",
  "ctl00$cphConsulta$mkeAMDataFinal_ClientState" = "",
  "ctl00$cphConsulta$drpAMIndice" = "160868",
  "ctl00$txtBAPalavraChave" = "",
  "ctl00$rblTipoTexto" = "E",
  "ctl00$txtBAColuna" = "",
  "ctl00$txtBAIncluida" = "",
  "ctl00$txtBAAtualizada" = "",
  "__ASYNCPOST" = "true",
  "ctl00$dlsCatalogoFixo$ctl01$imbOpNivelUm.x" = "5",
  "ctl00$dlsCatalogoFixo$ctl01$imbOpNivelUm.y" = "7"
)

# faz a requisição POST
u_post <- "http://www14.fgv.br/fgvdados20/default.aspx"
r <- httr::POST(u_post, body = parametros, encode = "form")

# acessa o resultado da requisição
u_get <- "http://www14.fgv.br/fgvdados20/consulta.aspx"
r1 <- httr::GET(u_get)

## se quiser visualizar o resultado no RStudio
# remotes::install_github("jtrecenti/scrapr")
scrapr::html_view(r1)
 

Eu acredito que para acessar os próximos botões, basta repetir esse procedimento mais vezes, mas mudando os parâmetros da requisição.

Espero que tenha ajudado um pouco!

Oi, @jtrecenti. Tudo bem?

Consegui fazer o scraper seguindo as suas recomendações! Realmente deu trabalho para conseguir terminar. Mas, foi ótimo para aprender mais sobre webscraping. Além disso, finalmente aprendi a utilizar o network do Chrome. Percebi que precisamos ficar apertando F5 com frequência para poder conseguir ter acesso aos parâmetros do POST.

Pela sua gentileza, agradeço demais a ajuda.

Segue o cógido aqui disponível no github. Será que você poderia dar uma olhada e me dizer se esta é a ideia mesmo? Fiquei com algumas dúvidas principalmente na parte em que uso um loop e na parte final. Aparentemente, preciso utilizar o comando fill = TRUE na função rvest::html_table() pois a tabela não é direita, ou seja, sem essa opção não consigo pegar a tabela. Além disso, ao utilizar essa opção, demora-se muito para obter a tabela inteira, será que existe uma opção mais rápida?

#' 21. Salva o data.frame e arruma os dados
df <- httr::GET("http://www14.fgv.br/fgvdados20/VisualizaConsultaFrame.aspx") %>%

  xml2::read_html() %>%

  xml2::xml_find_all("//table") %>%

  rvest::html_table(fill = TRUE) %>%

Muito obrigado pela ajuda. Grande abraço!

1 Curtida