Tag

web scrapping Archives - Análise Macro

Dados do IPEADATA no R: web-scrapping e outras alternativas

By | Data Science

Graças ao esforço da comunidade brasileira de R, já foram lançados alguns pacotes para acesso aos dados do IPEADATA através do R, como o ecoseries e o ipeadatar. Ambos os pacotes são de fácil utilização e facilitam a vida de quem precisa coletar os dados da plataforma de dados do IPEA. Infelizmente, estes pacotes encontram-se arquivados no CRAN, que é o servidor oficial de pacotes do R, até a data de publicação deste post. Isso pode ser muito frustrante para quem pretendia instalar os pacotes pela primeira vez ou, por exemplo, para quem os utiliza em ambiente de produção. Portanto, como acessar os dados do IPEADATA até que estes pacotes retornem ao CRAN?

Existem algumas alternativas. Primeiro, vamos carregar os pacotes utilizados neste post:

# Instalar/carregar pacotes
if(!require("pacman")) install.packages("pacman")
pacman::p_load(
"devtools",
"purrr",
"jsonlite",
"magrittr",
"dplyr",
"tidyr",
"lubridate",
"httr"
)

1. Instalar uma versão específica do pacote através do devtools

Com o pacote devtools é possível instalar uma versão específica de um pacote que esteja arquivada no CRAN, de modo que podemos pegar a última versão estável, ou seja, em funcionamento, do pacote e instalar facilmente com a função install_version. No caso do ipeadatar, a penúltima versão disponível no CRAN Package Archive é a 0.1.1, que parece ser estável, haja visto que o pacote foi arquivado após o lançamento da versão 0.1.2. Para instalar por esse método é bastante simples, bastando indicar o pacote, versão e repositório (CRAN).

devtools::install_version(
"ipeadatar", 
version = "0.1.1", 
repos = "http://cran.r-project.org"
)

2. Instalar uma versão específica através do install.packages

O mesmo procedimento anterior é possível de ser feito através do já conhecido install.packages. Basta saber a URL onde a versão do pacote desejado está localizada. Essa informação pode ser obtida na página do CRAN Package Archive. No caso do ipeadatar, uma vez que você tenha a URL, instalar o pacote é similar ao exemplo anterior:

install.packages(
"https://cran.r-project.org/src/contrib/Archive/ipeadatar/ipeadatar_0.1.1.tar.gz", 
repos = NULL, 
type = "source"
)

3. Criar uma função para extrair dados do IPEADATA

A penúltima alternativa deste breve post envolve basicamente replicar o que os pacotes já fazem. Neste caso, iremos utilizar a API do IPEADATA para coletar os dados. A função abaixo realiza a coleta e tratamento prévio dos dados, com um nível básico de robustez contra erros, retornando um objeto tibbl em formato long com colunas de data, valor e código da(s) série(s). A função possui somente um argumento que é o código da série, podendo ser utilizado como vetor de caracteres com mais de um código para coletar em uma única vez.

get_ipea <- function(code){

# Check if argument is character
if (purrr::is_character(code) & !purrr::is_null(code)) {
code <- toupper(code)
} else stop("Code argument must be a character, check the argument.", call. = FALSE)

# Ler página
raw_dados <- try(
suppressWarnings(
purrr::map(
.x = purrr::map(
.x = code,
~paste0(
"http://www.ipeadata.gov.br/api/odata4/ValoresSerie(SERCODIGO='",
.x,
"')"
)
),
~jsonlite::fromJSON(.x)
)
),
silent = TRUE
)

# Warning message for series with null return
if (0 %in% purrr::map(
.x = 1:length(code) %>% purrr::set_names(code),
~length(raw_dados[[.x]][["value"]]))
) {

flag <- purrr::map(
.x = 1:length(code) %>% purrr::set_names(code),
~length(raw_dados[[.x]][["value"]])
) %>%
dplyr::as_tibble() %>%
tidyr::pivot_longer(colnames(.)) %>%
dplyr::filter(value == 0)

if (0 %in% flag$value) {

stop(
paste0(
"Code [",
paste(flag$name, collapse = ", "),
"] not available / not found in IPEADATA."
),
call. = FALSE
)

}

}

# Data wrangling
dados <- purrr::map(.x = 1:length(code), ~raw_dados[[.x]][["value"]]) %>%
dplyr::bind_rows() %>%
dplyr::select("date" = `VALDATA`, "value" = `VALVALOR`, "code" = `SERCODIGO`) %>%
dplyr::mutate(
date = lubridate::as_date(date),
code = as.factor(code)
) %>%
dplyr::as_tibble()

return(dados)

}

A lista de códigos das séries disponíveis no IPEADATA é disponibiliza em um formato não muito convidativo neste link. Portanto, criei um protótipo de pacote chamado tidyipea e disponibilizei no meu GitHub com uma função chamada codes_ipea, que tem a mesma utilidade da função ipeadatar::available_series, retornando todas os códigos de séries disponíveis na API do IPEA.

No tidyipea também é possível utilizar a função get_ipea apresentada acima. Para instalar o pacote, basta executar:

devtools::install_github("schoulten/tidyipea")

Veja detalhes e informações na página do pacote.

4. Fazer web-scrapping simples

Por fim, também é possível fazer um web-scrapping de modo bem simples. O único requisito é saber o código da série que ser quer obter (você pode obter essa informação através do pacote tidyipea). Vamos a um exemplo com dados do CAGED: primeiro criamos um objeto com o código da série, em seguida fazemos a leitura da página com a função GET do pacote httr. Se estiver tudo ok, basta extrairmos o conteúdo do segundo elemento do objeto raw_data, que é uma lista, e realizar pequenas tratativas para transformar em um tibble.

code <- "GAC12_SALMINRE12"

# Ler página usando web-scrapping
raw_data <- httr::GET(
sprintf("http://ipeadata.gov.br/api/odata4/ValoresSerie(SERCODIGO='%s')", code)
)

# Tratar dados
tbl_data <- httr::content(raw_data)[[2]] %>% 
dplyr::bind_rows() %>% 
dplyr::select("date" = `VALDATA`, "value" = `VALVALOR`) %>% 
dplyr::mutate(date = lubridate::as_date(date))

Assim fica demonstrado diversas alternativas para obtenção dos dados do IPEADATA. A recomendação é sempre utilizar pacotes que estão disponíveis no CRAN, pois os mesmos são robustos entre plataformas e contra erros, além de terem sido testados exaustivamente. No momento atual, os pacotes que faziam esse trabalho de coleta de dados do IPEADATA estão arquivados no CRAN, portanto, recomendamos que utilize as alternativas aqui apresentadas em sequência, conforme melhor atender à necessidade em específico.

___________

(*) Gostou? Conheça nosso Curso de Análise de Conjuntura usando o R.

Como fazer web scrapping de tabelas de dados usando o R?

By | Hackeando o R

Nem sempre os dados que precisamos estão disponíveis facilmente para download, principalmente quando se trata de fontes públicas de informação. Nestes casos, quando não há uma API ou um arquivo CSV, por exemplo, uma alternativa pode ser implementar a técnica de "raspagem de dados" ou web scrapping, que nada mais é do que coletar dados de páginas na web. Felizmente, no R este procedimento costuma ser relativamente fácil e neste post faremos um exercício simples de demonstração.

Como exemplo, pegaremos os dados de mandatos dos Ministros da Saúde do Brasil disponíveis neste link. A página contém três tabelas com informações sobre os nomes dos ministros, datas de início e fim no mandato e o respectivo governo. Vamos pegar os dados dessas três tabelas com o auxílio de alguns pacotes no R e, ao final, faremos uma simples análise gráfica.

Importante: para este tipo de procedimento recomendamos que utilize o navegador Google Chrome.

1º passo: identificar

Antes de tudo, até mesmo antes de abrir o RStudio, é preciso identificar na página quais informações se deseja coletar. Neste exemplo, os dados estão organizados em três tabelas: República Nova, Ditadura militar, Nova República.

2º passo: navegar

Agora que sabemos o que desejamos obter, o próximo passo é buscar o chamado XPath que nos fornece um caminho para as tabelas, dentro da estrutura da página. Esse caminho servirá para apontar o que exatamente iremos coletar da página, facilitando o trabalho. Para obtê-lo é bem simples: clique com o botão direito em cima da tabela e depois clique em Inspecionar.

Isso fará com que se abra uma seção de ferramentas de desenvolvedor no navegador. Na aba Elements, aparecerá em destaque os códigos HTML do local onde você clicou com o botão direito. Um olhar ligeiro nos mostrará que as três tabelas que estamos buscando possuem essa identificação logo no início: <table width="100%" class="wikitable"> e devem constar próximo à região de destaque aberta. Agora clique com o botão direito sobre essa identificação em qualquer uma das três tabelas, selecione Copy e depois Copy XPath.

Esse procedimento pode variar conforme a página e/ou elemento que se deseja coletar, portanto é importante o instinto da curiosidade.

Feito estes procedimentos você deve ter obtido um código XPath similar a esse:


//*[@id="mw-content-text"]/div[1]/table[1]

Iremos remover a parte final entre colchetes que indica o número da tabela que queremos, assim obteremos todas as três tabelas de uma única vez:


//*[@id="mw-content-text"]/div[1]/table

3º passo: coletar

Agora vamos para o R fazer a coleta dos dados efetivamente. Aqui utilizaremos estes pacotes:

# Instalar/carregar pacotes
if (!require("pacman")) install.packages("pacman")
pacman::p_load(
"tidyverse",
"rvest",
"janitor",
"lubridate"
)

Para organização do código, primeiro definimos os parâmetros XPath e a URL da página, salvando-os em objetos, e depois fazemos a leitura das informações da página usando a função read_html do pacote rvest.

# URL base
www <- "https://pt.wikipedia.org/wiki/Lista_de_ministros_da_Sa%C3%BAde_do_Brasil"

# Xpath da tabela
xpath <- "//*[@id='mw-content-text']/div[1]/table"

# Salvar informações da página
pg <- rvest::read_html(www)

Agora usamos a função html_nodes para extrair exatamente o XPath desejado e transformamos o output em tabela. Em sequência fazemos uma pequena tratativa e unimos as três tabelas. O resultado é uma tibble com 59 linhas.

# Buscar tabelas pelo Xpath e transformar formato
dados <- pg %>%
rvest::html_nodes(xpath = xpath) %>%
rvest::html_table() %>%
purrr::map(~dplyr::mutate(.x, `Nº` = as.character(`Nº`))) %>%
dplyr::bind_rows() %>%
janitor::clean_names()

dplyr::glimpse(dados)
# Rows: 59
# Columns: 5
# $ no <chr> "1", "2", "3", "3", "4", "4", "4", "5", "5", "6", "7", "8",~
# $ nome <chr> "Antônio Balbino", "Miguel Couto Filho", "Mário Pinotti", "~
# $ inicio <chr> "6 de agosto de 1953", "23 de dezembro de 1953", "3 de junh~
# $ fim <chr> "22 de dezembro de 1953", "2 de junho de 1954", "24 de agos~
# $ presidente <chr> "Getúlio Vargas", "Getúlio Vargas", "Getúlio Vargas", "Café~

Simples e rápido, né? E com esses dados em mãos, basta mais algumas tratativas para poder gerar um gráfico como esse:


Com o gráfico é possível observar uma similaridade de mudanças de ministros entre o governo atual e os conturbados governos Collor e Itamar.

 

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais
e conteúdos exclusivos sobre Análise de Dados!

Assinar Gratuitamente