Цикл запросов API Yelp V2 в R

Я использую Yelp API в R для закрытия некоторых предприятий. Из того, что я прочитал в документации, вы можете получить до 20 предприятий за вызов API, однако, если вы используете параметр 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 и так далее. Я не знаю, как это написать. Я хотел бы сократить максимальное количество предприятий, которое, как мне кажется, составляет 1000, и добавить их в один фрейм данных. Вот мой полный код ниже:

# 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)

person davids12    schedule 09.02.2015    source источник


Ответы (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). Например. выберите интересующие столбцы. Но это будет другая история.

person lukeA    schedule 10.02.2015
comment
Спасибо. Похоже, что выравнивание данных будет немного болезненным. Я полагаю, что отдельные кадры данных были бы в порядке. Как бы вы предложили организовать результаты каждого вызова API? - person davids12; 10.02.2015
comment
Tbh, я бы сохранил locationDataList.raw и locationDataList, поместил файл в Dropbox или что-то еще и опубликовал новый вопрос, который ссылается на данные и спрашивает, как rbind фреймы данных. Я сталкивался с похожими проблемами json, но так и не нашел идеального решения. Тем не менее, я уверен, что у профессионалов есть один. - person lukeA; 10.02.2015