继续...使用R从API提取数据

时间:2019-02-07 14:09:30

标签: r json loops opendata

我是一个超级新手,正在为R撰写论文。这个答案中的代码终于对我有用(Extracting data from an API using R),但是我不知道如何在其中添加循环。当我需要全部3360时,我会不断获得API的首页。 这是代码:

    library(httr)
    library(jsonlite)
    r1 <- GET("http://data.riksdagen.se/dokumentlista/? 
    sok=&doktyp=mot&rm=&from=2000-01-01&tom=2017-12- 31&ts=&bet=&tempbet=&nr=&org=&iid=&webbtv=&talare=&exakt=&planering=&sort=rel&sortorder=desc&rapport=&utformat=json&a=s#soktraff")

r2 <- rawToChar(r1$content)

class(r2)
r3 <- fromJSON(r2)

r4 <- r3$dokumentlista$dokument

到我到达r4时,它已经是一个数据帧。

请谢谢!

编辑:最初,我无法获得以页面为信息的URL。现在我有了(下)。我仍然无法循环播放。 “ http://data.riksdagen.se/dokumentlista/?sok=&doktyp=mot&rm=&from=2000-01-01&tom=2017-12-31&ts=&bet=&tempbet=&nr=&org=&iid=&webbtv=&talare=&exakt=&planering=&sort=rel&sortorder=desc&rapport=&utformat=json&a=s&p=

1 个答案:

答案 0 :(得分:0)

我认为您可以按照以下步骤从r3中提取下一页的网址:

next_url <- r3$dokumentlista$`@nasta_sida`
# you need to re-check this, but sometimes I'm getting white spaces within the url, 
# you may not face this problem, but in any case this line of code solved the issue 
next_url <- gsub(' ', '', n_url)

GET(next_url)

更新

我尝试了带有10页的页码的网址,并且有效

my_dfs <- lapply(1:10, function(i){
  my_url <- paste0("http://data.riksdagen.se/dokumentlista/?sok=&doktyp=mot&rm=&from=2000-01-01&tom=2017-12-31&ts=&bet=&tempbet=&nr=&org=&iid=&webbtv=&talare=&exakt=&planering=&sort=rel&sortorder=desc&rapport=&utformat=json&a=s&p=", i)
  r1 <- GET(my_url)
  r2 <- rawToChar(r1$content)
  r3 <- fromJSON(r2)
  r4 <- r3$dokumentlista$dokument
  return(r4)
})

更新2:

提取的数据帧很复杂(例如,某些列是数据帧的列表),这就是为什么简单的rbind在这里不起作用的原因,在堆积数据之前,您必须进行一些预处理在一起,像这样的事情会起作用

my_dfs %>% lapply(function(df_0){
      # Do some stuff here with the data, and choose the variables you need
      # I chose the first 10 columns to check that I got 200 different observations
      df_0[1:10]
    }) %>% do.call(rbind, .)