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

By Beatriz Milz e Julio Trecenti in Portugues API purrr httr web-scraping

November 29, 2021

Este post foi originalmente 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
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-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():

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!

Você pode se interessar também por…

Licença de uso

Estes materiais são disponibilizados com a licença Creative Commons Atribuição-CompartilhaIgual (CC BY-SA), ou seja, você pode compartilhar e adaptar este material, porém deve atribuir os créditos para as pessoas autoras, adicionando um link para o material original, e o seu material também deve ter este mesmo tipo de licença.

Saiba mais em: Creative Commons