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:
- 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()
- 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, " ", "-"))
})
})
- 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:
-
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”?
-
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!