API查询循环

时间:2017-07-22 06:42:01

标签: r api loops

我正在尝试从API中提取一些数据,将其全部放入单个数据框中。我正在尝试将变量放入我正在拉出的URL中,然后循环它以从54个键中提取数据。这是我到目前为止的笔记。

library("jsonlite")
library("httr")
library("lubridate")
options(stringsAsFactors = FALSE)
url <- "http://api.kuroganehammer.com"

### This gets me a list of 58 observations, I want to use this list to 
### pull data for each using an API

raw.characters <- GET(url = url, path = "api/characters")
## Convert the results from unicode to a JSON
text.raw.characters <- rawToChar(raw.characters$content)
## Convert the JSON into an R object. Check the class of the object after 
## it's retrieved and reformat appropriately
characters <- fromJSON(text.raw.characters)
class(characters)

## This pulls data for an individual character. I want to get one of 
## these for all 58 characters by looping this and replacing the 1 in the
## URL path for every number through 58.
raw.bayonetta <- GET(url = url, path = "api/characters/1/detailedmoves")
text.raw.bayonetta <- rawToChar(raw.bayonetta$content)
bayonetta <- fromJSON(text.raw.bayonetta)

## This is the function I tried to create, but I get a lexical error when 
## I call it, and I have no idea how to loop it.
move.pull <- function(x) {
  char.x <- x
  raw.x <- GET(url = url, path = cat("api/characters/",char.x,"/detailedmoves", sep = ""))
  text.raw.x <- rawToChar(raw.x$content)
  char.moves.x <- fromJSON(text.raw.x)
  char.moves.x$id <- x
  return(char.moves.x)
}

1 个答案:

答案 0 :(得分:2)

第一部分:

library(jsonlite)
library(httr)
library(lubridate)
library(tidyverse)

base_url <- "http://api.kuroganehammer.com"

res <- GET(url = base_url, path = "api/characters")
content(res, as="text", encoding="UTF-8") %>% 
  fromJSON(flatten=TRUE) %>% 
  as_tibble() -> chars

获取字符的数据框。

此:

pb <- progress_estimated(length(chars$id))
map_df(chars$id, ~{

  pb$tick()$print()

  Sys.sleep(sample(seq(0.5, 2.5, 0.5), 1)) # be kind to the free API

  res <- GET(url = base_url, path = sprintf("api/characters/%s/detailedmoves", .x))

  content(res, as="text", encoding="UTF-8") %>% 
    fromJSON(flatten=TRUE) %>% 
    as_tibble() 

}, .id = "id") -> moves

获取所有“移动”的数据框,并为角色添加“id”。你也可以免费获得进度条。

然后,您可以根据需要left_join()或分组&amp;将移动数据嵌套到单独的list-nest列中。如果您想要开头,可以使用map() vs map_df()

留下时间暂停代码。这是一个免费的API,你应该增加暂停时间,以避免DoS的网站。