Intermediário Tutoriais de R

Wep Scraping e Download de Dados Automático – Parte I

3-Download-de-Dados-e-Web-Scraping.utf8.md

Como automatizar seu download de dados?

A automatização da obtenção de dados utilizados em análises traz dois benefícios principais: i) poupa tempo ao analista e ii) garante um padrão na execução de comandos e tratamentos básicos. Essa é a primeira etapa daquilo que chamamos de ETL (Extraction, Transform and Load). Existem diversas ferramentas que auxiliam na extração de dados de diversas fontes. O R é uma delas. Através do R é possível: realizar download de bases conectando-se a um endereço online, conectar-se a APIs, etc. Muitas fontes usuais já possuem pacotes para uma conexão “nativa” com o R. Será objetivo desse tutorial apresentar algumas dessas funcionalidades.

key words: Web Scraping, Download de dados, ETL

Utilizando o pacote Sidrar para download de dados do IBGE

O pacote Sidrar permite o R acessar de forma simples o API criado pelo IBGE (Instituto Brasileiro de Geografia e Estatística) e consumir os dados nele disponível. Normalmente, para acessar esse tipo de aplicação é necessário enviar a um servidor requisições (request) no modelo HTTP (Hypertext Transfer Protocol) que nada mais é do que uma linguagem para comunicação de um servidor com uma máquina cliente. No entanto, o objetivo desse pacote é simplificar essa comunicação além de converter a um formato mais facilmente tratável a resposta da solicitação enviada.

Para obter o dados basta usar a função get_sidra. Você pode ver quais os parâmetros dessa função utilizando help(get_sidra). Há duas formas de especificar a consulta que deseja realizar:

  1. explicitando os parâmetros utilizando as variáveis de entrada da função get_sidra;
  2. fornecendo um texto no formato de consulta utilizado pela requisição enviado ao API.

Nesse segundo caso a estrutura os parâmetros são fornecidos por meio de um texto separado por “/”. Vamos a dois exemplos que ilustram ambas as execuções.

require(installr)
require2(sidrar)

tb_ibge = get_sidra(x = 1612, period = "all", variable = 109, 
                        classific = "c81", category = list(2713), 
                        geo = "Region", geo.filter = "all")
str(tb_ibge)
## 'data.frame':    230 obs. of  13 variables:
##  $ Nível Territorial (Código)               : chr  "2" "2" "2" "2" ...
##  $ Nível Territorial                        : chr  "Grande Região" "Grande Região" "Grande Região" "Grande Região" ...
##  $ Unidade de Medida (Código)               : chr  "" "" "" "" ...
##  $ Unidade de Medida                        : chr  "" "" "" "" ...
##  $ Valor                                    : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ Grande Região (Código)                   : chr  "1" "1" "1" "1" ...
##  $ Grande Região                            : chr  "Norte" "Norte" "Norte" "Norte" ...
##  $ Ano (Código)                             : chr  "1974" "1975" "1976" "1977" ...
##  $ Ano                                      : chr  "1974" "1975" "1976" "1977" ...
##  $ Variável (Código)                        : chr  "109" "109" "109" "109" ...
##  $ Variável                                 : chr  "Área plantada" "Área plantada" "Área plantada" "Área plantada" ...
##  $ Produto das lavouras temporárias (Código): chr  "2713" "2713" "2713" "2713" ...
##  $ Produto das lavouras temporárias         : chr  "Soja (em grão)" "Soja (em grão)" "Soja (em grão)" "Soja (em grão)" ...
tb_ibge2 = get_sidra (api="/t/1612/p/all/v/109/c81/2713/n2/all")
str(tb_ibge2)
## 'data.frame':    230 obs. of  13 variables:
##  $ Nível Territorial (Código)               : chr  "2" "2" "2" "2" ...
##  $ Nível Territorial                        : chr  "Grande Região" "Grande Região" "Grande Região" "Grande Região" ...
##  $ Unidade de Medida (Código)               : chr  "" "" "" "" ...
##  $ Unidade de Medida                        : chr  "" "" "" "" ...
##  $ Valor                                    : num  NA NA NA NA NA NA NA NA NA NA ...
##  $ Ano (Código)                             : chr  "1974" "1974" "1974" "1974" ...
##  $ Ano                                      : chr  "1974" "1974" "1974" "1974" ...
##  $ Variável (Código)                        : chr  "109" "109" "109" "109" ...
##  $ Variável                                 : chr  "Área plantada" "Área plantada" "Área plantada" "Área plantada" ...
##  $ Produto das lavouras temporárias (Código): chr  "2713" "2713" "2713" "2713" ...
##  $ Produto das lavouras temporárias         : chr  "Soja (em grão)" "Soja (em grão)" "Soja (em grão)" "Soja (em grão)" ...
##  $ Grande Região (Código)                   : chr  "1" "2" "3" "4" ...
##  $ Grande Região                            : chr  "Norte" "Nordeste" "Sudeste" "Sul" ...

Os objetos tb_ibge e tb_ibge2 são idênticos. A tabela abaixo deixa mais claro quais dados estão sendo solicitados para o API.

Parâmetros para consulta utilizando Sidrar
Parâmetro API Descrição Parâmetro equivalente na função get_sidra
t Nº da tabela pesquisada. x
p Período de tempo solicitado. period
v Nº da variável pesquisada na tabela. variable
c Categoria (se houver) da variável pesquisada (ex. sexo, cultura cultivada, etc) na tabela. No api deve-se colocar c junto ao código da categoria. classific
n Nível territorial (ex. federal, estadual, etc) das variáveis solicitadas. No api deve-se colocar n junto ao código do nível territorial. geo

Os exemplos solicitaram:

  • A tabela número 1.612 cujo nome é “Área plantada, área colhida, quantidade produzida, rendimento médio e valor da produção das lavouras temporárias” (variáveis x e t);

  • Todos os períodos de dados disponíveis (variáveis period e p);

  • Variável número 109 referente a Área plantada em Hectares (variáveis variable e v);

  • Filtro na categoria de código c81 - Produto das lavouras temporárias (variáveis classific e c) retornando apenas a variável referente ao produto 2713 - Soja (em grão) (variáveis category ou preenchendo após “/” no API);

  • Filtro no nível territorial de código n2 - Region (variáveis geo e n) retornando todos os dados segmentados por esse nível geográfico (variáveis geo.filter ou preenchendo após “/” no API).

Você pode ver mais informações sobre os parâmetros e funcionalidades do API do IBGE aqui, além de outras funcionalidades do pacote Sidrar. É possível até mesmo estruturar os parâmetros de consulta automaticamente utilizando o endereço anterior.

Utilizando o pacote BETS para acessar dados do BACEN, FGV, IBGE e IPEADATA

O pacote BETS permite acesso rápido e fácil a diversas séries temporais referentes a variáveis econômicas brasileiras. Essencialmente as duas principais funções relacionadas a esse pacote são BETSsearch e BETSget.

A primeira função tem o intuito de descobrir o código das séries procuradas. A procura tem como parâmetro informações como descrição, fonte, periodicidade, entre outros. A segunda função é a que retorna os dados quanto ao código das séries fornecidas, sendo possível especificar o horizonte temporal desejado. Vamos para alguns exemplos.

require2(BETS)

head(BETSsearch(description = "ipca"))              ## Busca séries que contenham na descrição "ipca"
## # A tibble: 6 x 7
##   code  description                unit     periodicity start  last_value source
##   <chr> <chr>                      <chr>    <chr>       <chr>  <chr>      <chr> 
## 1 10764 National Consumer Price I~ Monthly~ M           31/01~ mar/2018   IBGE  
## 2 10841 National Consumer Price I~ Monthly~ M           31/01~ mar/2018   BCB-D~
## 3 10842 National Consumer Price I~ Monthly~ M           31/01~ mar/2018   BCB-D~
## 4 10843 National Consumer Price I~ Monthly~ M           31/01~ mar/2018   BCB-D~
## 5 10844 National Consumer Price I~ Monthly~ M           31/01~ mar/2018   BCB-D~
## 6 11426 Broad national consumer p~ Monthly~ M           31/01~ mar/2018   BCB-D~
tabela_ipca = BETSget(10764, from = "2014-01-01", to = "2021-06-23", data.frame = TRUE)     ## Obtem a série identificada

head(BETSsearch(description = "exchange")) ## Busca séries que contenham na descrição "exchange"
## # A tibble: 6 x 7
##   code  description               unit    periodicity start  last_value source  
##   <chr> <chr>                     <chr>   <chr>       <chr>  <chr>      <chr>   
## 1 1     Exchange rate - Free - U~ c.m.u.~ D           28/11~ 26/03/2018 Sisbace~
## 2 10622 Federal securities debt ~ %       M           31/01~ mar/2018   BCB-DST~
## 3 10663 Federal securities debt ~ c.m.u.~ M           31/01~ mar/2018   BCB-Dem~
## 4 10664 Federal securities debt ~ c.m.u.~ M           31/01~ mar/2018   BCB-Dem~
## 5 10665 Federal securities debt ~ c.m.u.~ M           31/01~ mar/2018   BCB-Dem~
## 6 10666 Federal securities debt ~ c.m.u.~ M           31/01~ mar/2018   MF-STN
tabela_cambio = BETSget(1, data.frame = TRUE, from = "2018-01-01", to = "2021-06-23") ## Obtem a série identificada

Realizando o download de planilhas e outros arquivos diretamente da Web

Caso os dados que deseja não estejam em nenhum banco estruturado para consumo, como vimos anteriormente, ainda é possível baixá-los facilmente desde que estejam acessíveis via URL.

Tomaremos como exemplo a obtenção das cotações do contrato nº 11 de açúcar negociado na ICE (Intercontinental Exchange). Para obter o link que disponibiliza os dados acesse o site da ICE clicando aqui. Em seguida, siga o procedimento ilustrado abaixo.

O link obtido será copiado para a área de transferência e deve ser colado no objeto url no código abaixo. A função download.file é utilizada para fazer o download. Nela você deve informar uma variável texto contendo o endereço da Web, o nome a ser dado ao arquivo baixado e o modo de download. De forma simplificada basta saber que esse último parâmetro devera ser wb para download de planilhas e w para arquivos de texto.

require2(readxl)

url = "https://www.theice.com/publicdocs/futures_us_reports/sugar/Sugar%2011%20Historical%20Prices.xls"
download.file(url, dest = "NY11.xls", mode = "wb")  ## realiza o download do arquivo e armazena do diretório atual
preco.acucar <- read_excel("NY11.xls", skip = 4) ## carrega o arquivo para o R

O arquivo será armazenado no diretório atual utilizado pelo R. A função read_excel carrega o arquivo para o objeto preco.acucar. Esse mesmo procedimento pode ser utilizado para baixar outros tipos de arquivos, como por exemplo arquivos de texto (.txt).

O problema dessa abordagem é que ela exige que o link o qual os dados estão disponíveis não se altere. Logo, quando há a necessidade de definir parâmetros na consulta que gerará os dados, como a escolha de períodos ou o nome da série que deseja baixar, essa funcionalidade será limitada pois um novo endereço é gerado a cada download.

Para superar essa limitação temos outra abordagem mais sofisticada o qual será tema de estudo da parte II desse tutorial.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *