0

我在 R 中使用 Yelp API 来取消一些业务。根据我在文档中阅读的内容,每个 API 调用最多可以提取 20 个业务,但是如果使用 offset= 参数,您基本上可以提取更多记录。

我要做的是创建一个简单的循环来创建多个 API 调用,其中 offset= 参数的值递增。

例如——第一个 API 调用如下所示:

yelpURL <- paste0("http://api.yelp.com/v2/search/?limit=20&offset=20&sort=0&term=food&location=Chicago")

下一个调用的偏移量 = 20,然后是 40、60、80,依此类推。我不知道该怎么写。我想减少我相信的最大企业数量 1,000,并将它们添加到单个数据框中。下面是我的完整代码:

# yelp credentials
consumerKey = "xxxxxxx"
consumerSecret = "xxxxxxx"
token = "xxxxxxx"
tokenSecret = "xxxxxxx"

require(httr)
myApp <- oauth_app("YELP", key=consumerKey, secret=consumerSecret)
mySignature <- sign_oauth1.0(myApp, token=token, token_secret=tokenSecret)


yelpURL <- paste0("http://api.yelp.com/v2/search/?limit=20&offset=20&sort=0&term=food&location=Chicago")
locationData <- GET(yelpURL, mySignature)

require(jsonlite)
locationDataContent = content(locationData)
locationList=jsonlite::fromJSON(toJSON(locationDataContent))
results <- data.frame(locationList)
4

1 回答 1

1

“查询循环”的一般方法可能是将这些 url 读入列表,将每个 json 输入转换为数据框,最后将所有列出的数据框合并为组合数据框:

locationDataList.raw <- lapply(sprintf("http://api.yelp.com/v2/search/?limit=20&offset=%d&sort=0&term=food&location=Chicago", 
                                       seq(0, 60, 20)), 
                               GET, mySignature)
locationDataList <- lapply(locationDataList.raw, function(locationData) {
  locationDataContent = content(locationData)
  locationList=jsonlite::fromJSON(toJSON(locationDataContent))
  return(data.frame(locationList))
})
result <- do.call(rbind, locationDataList)

但是,要将它们“添加到单个数据框中”,您可能必须在合并之前展平/整理您的数据 ( rbind)。例如选择感兴趣的列。但这将是另一个故事。

于 2015-02-10T01:18:05.947 回答