Webscraping demorado

Olá, pessoal. Tudo bem? Estou avançando nos aprendizados de webscraping e encontrei o seguinte site na internet https://www.inflation.eu/ e fiz o scraping das tabelas dos países com a inflação com o código abaixo:

  1. Esse primeiro pega a lista de países que o site comtempla:
library(tidyverse)

u <- "https://www.inflation.eu/en/inflation-rates/"

## COUNTRIES

countries <- u %>% 
  
  glue::glue("cpi-inflation.aspx") %>% 
  
  httr::GET() %>% 
  
  xml2::read_html() %>%
  
  xml2::xml_find_all("//table") %>% 
  
  rvest::html_table() %>% 
  
  magrittr::extract2(13) %>% 
  
  janitor::row_to_names(1) %>%
  
  dplyr::select(country = 1) %>% 
  
  dplyr::mutate(country = country %>% str_remove_all("Inflation ") %>% tolower %>% str_replace(" ", "-")) %>% 
  
  dplyr::pull()

  1. Agora, eu monto um tibble com uma coluna sendo os países e a outra os anos que são comtemplados para cada país:
progressr::with_progress({
  
  p <- progressr::progressor(along = countries)
  
  base <- map_dfr(.x = countries,
                  
                  .f = ~ {
                    
                    url <- u %>% glue::glue("{.x}/historic-inflation/cpi-inflation-{.x}-2021.aspx")
                    
                    p()
                    
                    base <- httr::GET(url) %>%
                      
                      xml2::read_html() %>%
                      
                      xml2::xml_find_all("//table") %>%
                      
                      rvest::html_table() %>%
                      
                      magrittr::extract2(17) %>%
                      
                      tidyr::pivot_longer(cols = everything(), values_to = "ano") %>%
                      
                      dplyr::select(ano) %>%
                      
                      dplyr::filter(ano != "") %>%
                      
                      dplyr::mutate(ano = ano %>% str_remove_all("CPI inflation ") %>% tolower()) %>%
                      
                      tidyr::separate(ano, into = c("country", "year"), "(?<=[a-z]) (?=[0-9])") %>%
                      
                      dplyr::arrange(year) %>%
                      
                      tibble::add_row(country = .x, year = "2021") %>%
                      
                      tidyr::drop_na() %>%
                      
                      dplyr::mutate(country = str_replace(country, " ", "-"))
                  })
})
  1. Por fim, faço a busca das tabelas que contenham os valores para a inflação de cada país a cada mês.
progressr::with_progress({

  p <- progressr::progressor(along = base$country)

  teste <- purrr::map2_dfr(.x = base$country, 
                    
                    .y = base$year, 
                    
                    .f = ~{
                      
                      message(paste0(.x, .y))
                      
                      p()
                      
                      url <- u %>% glue::glue("{.x}/historic-inflation/cpi-inflation-{.x}-{.y}.aspx")
        
                      parsed <- httr::GET(url) %>%
                        
                        xml2::read_html() %>%
                        
                        xml2::xml_find_all("//table") %>%
                        
                        rvest::html_table() %>% 
                        
                        magrittr::extract2(16) %>% 
                        
                        janitor::remove_empty(which = c("rows", "cols")) %>% 
                        
                        janitor::row_to_names(1) %>% 
                        
                        janitor::clean_names() %>% 
                        
                        dplyr::rename(monthly = 2, accum_12m = 4) %>% 
                        
                        dplyr::select(1, 2, 4) %>% 
                        
                        dplyr::mutate(inflation_monthly_basis = str_remove(inflation_monthly_basis, " \\-.*$") %>% 
                                        
                                        parse_date(format = "%B %Y"),
                                      
                                      across(.cols = 2:3, .fns = parse_number), 
                                      
                                      country = .x)})
})

Minhas dúvidas:

  1. O código ficou bonito e tal, porém, não acho que esteja da forma correta, isto é, com funções para cada coisa, etc. Será que alguém poderia me ajudar a melhorá-lo e deixá-lo mais “profissional”?

  2. O último código demora muuuuuito a rodar por completo, alguém poderia me ajudar a mostrar como eu faço para rodar em paralelo, isto é, fazer diversas requisições no site ao mesmo tempo e fazer com que o código complete mais rápido? Eu tentei utilizar a função furrr::future_map2_dfr() mas não vi nenhuma diferença de tempo.

Desde já, meu muito obrigado!