2

我正在尝试在我积累的一组 api url 上运行 jsonlite 函数。具体来说,我有一个名为 url_df 的数据框,它有一个名为 URL 的列,其中包含 162800 行 api url。当我编写脚本并一次手动插入每个 url 时,它工作得非常好。这是我用来一次在一个 url 上手动运行它的脚本:

May28 <- 'https://example.example.com/example'. 
May28 <- httr::GET(May28)
May28 <- httr::content(May28, as = 'text')
May28 <- jsonlite::fromJSON(May28)
dplyr::glimpse(May28)
May28 <- as.data.frame(May28)
write.table(May28, file="May28.csv", sep=",")

但是,因为我有超过 100K 行的 api url 要通过,所以我想创建一个循环函数,将上述函数重复到列 URL 中的每一行(每个 api url),这样我就不必手动剪切和将每个 url 粘贴到脚本 100K+ 次。因此,我将此信息保存到名为“url_df”的数据框中,并尝试了以下代码:

j <- 1

for (j in 1:nrow(url_df)){
    url <- url_df$URL[[j]] %>%
  getdata <- GET(url) %>%
  rawdata <- httr::content(getdata, as='text') %>%
  data <- jsonlite::fromJSON(rawdata)
  data_df <- as.data.frame(data)
    print(j)
  j <- j+1
  Sys.sleep(0.5)
}

由于某种原因,它不会运行。我得到的错误之一是: jsonlite::fromJSON(rawdata) 中的错误:找不到对象'rawdata'。

一个可能很重要的警告:每个 api url 不只返回 1 个数据点值(例如,1)。相反,它返回一个值列表(例如,星期日、1、星期二、2 等)。

关于为什么会发生这种情况或我如何克服这个问题的任何想法?

在解决了第一个问题之后,如果可能的话,我想 rbind 我收集的所有数据......

谢谢!!!

4

2 回答 2

0

你试过没有%>%吗?此外,您可以尝试使用模拟 api url 的可重现示例,例如https://jsonplaceholder.typicode.com/todos/1

于 2020-05-29T02:23:09.680 回答
0

循环失败的原因for是您有一些无效或有问题的 URL。

看看这样的事情是否能解决你的问题:

library(tidyverse)

# Function to download - it takes two inputs: (1) url and (2) save file name
dl_my_url <- function(url_address, file_name_to_save){

  x <- httr::GET(url_address)
  y <- httr::content(x, as = 'text')
  z  <- jsonlite::fromJSON(z)

  print(dplyr::glimpse(z))

  output <- as.data.frame(z)

  write.table(output, file = file_name_to_save, sep=",")

}

# make the function safe in case some url fails
safe_dl_my_url <- safely(dl_my_url)

# Run the function (make sure you create a save name for each url)
url_result <- map2(urldf$address, urldf$file_name_to_save, ~safe_dl_my_url(.x, .y))

# To get your results
map(url_result, "result") %>% bind_rows() # or bind_cols which ever works for you

# Check what is failing
map(url_result, "error")
于 2020-05-29T03:38:58.440 回答