Esse post foi origalmente publicado no blog da Curso-R.
Introdução
Olá!
Recentemente eu (Bea) andei explorando algumas APIs, com ajuda do Julio, que ficou respondendo as dúvidas! No processo aprendemos muitas coisas legais e resolvemos compartilhar com vocês através de alguns posts.
O tema dá muito pano pra manga, pois usamos código em R para automatizar quase tudo! Nas últimas semanas, aprendemos a trabalhar com o GitHub (Ex: criar e configurar repositórios), Zoom (criar chamadas), Google Drive e Sheets (estruturar e editar arquivos), e Google Classroom (criar e configurar salas de aula).
Tudo isso usando muito tidyverse
!
Mas calma!! Vamos começar do começo. Neste primeiro post, vamos falar sobre o que é uma API e mostrar um exemplo básico.
O que é uma API?
API é uma sigla para Application Programming Interface, ou seja, uma interface de computação. Sem usar palavras complicadas, uma explicação que está nos slides do curso de Deploy! é:
Uma API não deixa de ser um “link” que aceita parâmetros e retorna dados. As APIs também são abordadas no curso de Web Scraping!
PokéAPI
Um exemplo de acesso à API é buscando na PokéAPI, uma API para buscar Pokémons! E com tantas possibilidades interessantes, porque buscar justamente Pokémons? Essa API tem fins educacionais, portanto é um ótimo lugar para começar a praticar o tema.
O primeiro passo para acessar qualquer API é procurar uma documentação.
Na documentação do PokéAPI, é mostrado que devemos usar o seguinte padrão:
GET https://pokeapi.co/api/v2/{endpoint}/
Isso significa que devemos fazer uma requisição GET
(apenas para consultar dados), começar com a url base (é a parte que não muda: https://pokeapi.co/api/v2/
) e complementar com os parâmetros da busca (que chamamos de endpoint).
O pacote httr
é muito usado para acessar APIs através do R, e disponibiliza uma função chamada httr::GET()
para fazer esse tipo de acesso!
Por exemplo:
# url_base - nunca muda na mesma API
<- "https://pokeapi.co/api/v2"
url_base # endpoint - é o que muda o resultado
<- "/pokemon/ditto"
endpoint # precisamos colar os textos para criar o link
<- paste0(url_base, endpoint)
u_pokemon # ver como o texto ficou colado
# u_pokemon
# > "https://pokeapi.co/api/v2/pokemon/ditto"
# fazer a requisição do tipo GET
<- httr::GET(u_pokemon)
r_pokemon r_pokemon
Response [https://pokeapi.co/api/v2/pokemon/ditto]
Date: 2021-12-06 13:16
Status: 200
Content-Type: application/json; charset=utf-8
Size: 22.3 kB
Esse resultado é um pouco diferente do que estamos acostumados! O que é mais importante de reparar é o status, pois indica se a requisição foi bem sucedida. Status: 200
significa que deu certo! :)
As APIs costumam retornar arquivos JSON
, e para acessar o conteúdo que foi obtido podemos usar a função httr::content()
:
<- httr::content(r_pokemon) c_pokemon
Ao salvar o resultado da função em um objeto, podemos ver que agora a classe dele é uma lista:
class(c_pokemon)
[1] "list"
Podemos manipular essa lista com funções do tidyverse
para obter uma tabela, assim fica mais fácil de trabalhar. Mas atenção, da seguinte forma ela ainda não está no formato tidy
! Saiba mais o que são dados tidy no material do curso de Faxina de Dados.
library(magrittr)
<- c_pokemon %>%
dados_ditto ::map(unlist, recursive = TRUE) %>%
purrr::map(tibble::enframe) %>%
purrr::map_dfr(
purrr~dplyr::mutate(.x, dplyr::across(.fns = as.character)),
.id = "id"
)::glimpse(dados_ditto) dplyr
Rows: 396
Columns: 3
$ id <chr> "abilities", "abilities", "abilities", "abilities", "abilities",…
$ name <chr> "ability.name", "ability.url", "is_hidden", "slot", "ability.nam…
$ value <chr> "limber", "https://pokeapi.co/api/v2/ability/7/", "FALSE", "1", …
Agora você pode usar o que aprendemos para pesquisar outros Pokémons! Quem sabe explorar a teoria de que o Ditto é um clone falho do Mew?
<- "https://pokeapi.co/api/v2/pokemon/mew" %>%
dados_mew ::GET() %>%
httr::content() %>%
httr::map(unlist, recursive = TRUE) %>%
purrr::map(tibble::enframe) %>%
purrr::map_dfr(
purrr~dplyr::mutate(.x, dplyr::across(.fns = as.character)),
.id = "id"
)::glimpse(dados_mew) dplyr
Rows: 10,083
Columns: 3
$ id <chr> "abilities", "abilities", "abilities", "abilities", "base_experi…
$ name <chr> "ability.name", "ability.url", "is_hidden", "slot", "1", "name",…
$ value <chr> "synchronize", "https://pokeapi.co/api/v2/ability/28/", "FALSE",…
Saiba mais sobre a teoria aqui:
É isso! Dúvidas, sugestões e críticas, mande aqui nos comentários. Comentem também quais exemplos, dentre os que foram listados, vocês gostariam de saber mais!!
Até a próxima!