Acessando APIs com R: Exemplos com a PokéAPI!

  • Escrito por Beatriz e Julio em Conceitos
  • 29/11/2021

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
url_base <- "https://pokeapi.co/api/v2"      

# endpoint - é o que muda o resultado
endpoint <- "/pokemon/ditto"                 

# precisamos colar os textos para criar o link
u_pokemon <- paste0(url_base, endpoint) 

# ver como o texto ficou colado
# u_pokemon 
# > "https://pokeapi.co/api/v2/pokemon/ditto"

# fazer a requisição do tipo GET
r_pokemon <- httr::GET(u_pokemon) 

r_pokemon
## Response [https://pokeapi.co/api/v2/pokemon/ditto]
##   Date: 2021-11-29 11:44
##   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():

c_pokemon <- httr::content(r_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)
dados_ditto <- c_pokemon %>%
  purrr::map(unlist, recursive = TRUE) %>%
  purrr::map(tibble::enframe) %>%
  purrr::map_dfr(
    ~dplyr::mutate(.x, dplyr::across(.fns = as.character)), 
    .id = "id"
  )

dplyr::glimpse(dados_ditto)
## 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?

dados_mew <- "https://pokeapi.co/api/v2/pokemon/mew" %>% 
  httr::GET() %>% 
  httr::content() %>%
  purrr::map(unlist, recursive = TRUE) %>%
  purrr::map(tibble::enframe) %>%
  purrr::map_dfr(
    ~dplyr::mutate(.x, dplyr::across(.fns = as.character)), 
    .id = "id"
  )

dplyr::glimpse(dados_mew)
## 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!

comments powered by Disqus