【问题标题】:Multiple Google Places API calls within Sapply functionSapply 函数中的多个 Google Places API 调用
【发布时间】:2017-07-21 16:19:31
【问题描述】:

我有一个要输入 Google Places API 的位置列表。有些位置有超过 20 个结果。我在下面提供了一个此类位置的示例。要获得超过前 20 个的结果,您必须对 Google Places 进行额外的 API 调用,并使用从第一个 Google Places API 调用中获得的额外“令牌”参数。

使用以下有缺陷的函数,我试图根据是否需要获得额外的结果来执行额外的 API 调用。当前函数产生 NULL 值。任何有关纠正此功能的帮助将不胜感激。

要输入 Sapply 的列表:

LatLongList <- as.list("42.36354942,-71.06396087")

应用功能:

library(RCurl)
library(tidyjson)
library(magrittr)
library(dplyr)

PullFromPlaces <- function(x) {

  url = paste0("https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=",x,"&radius=",radius_meters,"&types=",type,"&key=",key)
    payload_json <- getURL(url)

    next_page_token <- payload_json %>%        
      as.tbl_json %>% 
      enter_object("next_page_token")
      next_page_token <- as.character(attr(next_page_token,"JSON"))

      if (length(next_page_token) != 0) {

      url = paste0("https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=",x,"&radius=",radius_meters,"&types=",type,"&pagetoken=",next_page_token,"&key=",key)
      payload_json <- getURL(url)

      }
}

应用执行:

Output <- sapply(LatLongList, PullFromPlaces)

【问题讨论】:

    标签: json r google-places-api sapply rcurl


    【解决方案1】:

    我在vignette of my googleway package中有一个这样的查询示例

    library(googleway)
    
    
    api_key <- 'your_api_key'
    
    myLocation <- c(42.36354942, -71.06396078)
    
    myPlaces <- google_places(location = myLocation, 
                            radius = 500,
                            key = api_key)
    
    nextPlaces <- google_places(location = myLocation,
                                radius = 500,
                                page_token = myPlaces$next_page_token, 
                                key = api_key)
    
    
    myPlaces$results$name
    # [1] "Boston"                                              "Kimpton Onyx Hotel"                                 
    # [3] "Holiday Inn Express Hotel & Suites Boston Garden"    "Wyndham Boston Beacon Hill"                         
    # [5] "The Boxer Boston Hotel"                              "Whole Foods Market"                                 
    # [7] "The Liberty, a Luxury Collection Hotel, Boston"      "Massachusetts General Hospital"                     
    # [9] "TD Garden"                                           "Sugarman, Rogers, Barshak & Cohen, P.C."            
    # [11] "Dr. Richard J. Deasla, MD"                           "Massachussetts General Hospital"                    
    # [13] "Massachusetts General Hospital: Temel Jennifer S MD" "Vrahas Mark Steven MD"                              
    # [15] "Harry E. Rubash, MD"                                 "Dr. Ziv Williams, MD"                               
    # [17] "CCRM Boston"                                         "Domino's Pizza"                                     
    # [19] "Massachusetts General Hospital: Yeh Sunu Susan MD"   "North End"
    
    nextPlaces$results$name
    # [1] "Massachusetts General Hospital: Ryan Colleen MD"         "Warshaw Andrew L MD"                                    
    # [3] "Massachusetts General Hospital: Althausen Anne M MD"     "Massachusetts General Hospital: Shipley William MD"     
    # [5] "Massachusetts General Hospital: Feldman Adam S MD"       "Massachusetts General Hospital: Packard Swift Alison MD"
    # [7] "Dr. Nahel Elias, MD"                                     "Dr. Steven L. Mcafee, MD"                               
    # [9] "Dr. Charles A. Welch, MD"                                "Massachusetts General Hospital: Kilbride Ronan D MD"    
    # [11] "Massachusetts General Hospital: Garasic Joseph Mich MD"  "Massachusetts General Hospital: Akins Cary W MD"        
    # [13] "Dr. Edwin C. Huang, MD"                                  "Massachusetts General Hospital: Davis Benjamin T MD"    
    # [15] "Massachusetts General Hospital: Levins Paul C MD"        "Massachusetts General Hospital: Passeri Jonathan MD"    
    # [17] "Massachusetts General Hospital: Weil Michelle MD"        "Massachusetts General Hospital: Steele David John MD"   
    # [19] "Massachusetts General Hospital: Chae Claudia U MD"       "Massachusetts General Hospital: Connolly Thomas Jose MD"
    

    【讨论】:

    • 非常感谢 SymbolixAU。这是一个很好的第一步,但我想知道您是否对如何结合第一个和第二个 API 拉取以及结果 40-60 的第三个 API 拉取有任何建议?我希望能够一次提取所有内容。
    • @Bdude11383 - 我还没有完全测试它,但是某种循环直到page_token 不再存在/无效应该做吗?
    【解决方案2】:

    我想通了。下面是放入 sapply 或 lapply 的函数。半径、类型和关键参数是预定义的。

    library(jsonlite)
    library(RCurl)
    library(tidyjson)
    library(magrittr)
    library(stringr)
    library(plyr)
    library(dplyr)
    
    PullFromPlaces <- function(x) {
    
          url = paste0("https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=",x,"&radius=",radius_meters,"&types=",type,"&key=",key)
          payload_json <- getURL(url)
    
          next_page_token <- payload_json %>%        
            as.tbl_json %>% 
            enter_object("next_page_token") 
          next_page_token <- as.character(attr(next_page_token,"JSON"))
    
          if (length(next_page_token) == 0) {
    
            payload_json <- data.frame(payload_json,stringsAsFactors = FALSE)
    
          }   else {
            Sys.sleep(2)
            url2 = paste0("https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=",x,"&radius=",radius_meters,"&types=",type,"&pagetoken=",next_page_token,"&key=",key)
            payload_json2 <- getURL(url2)
    
            next_page_token <- payload_json2 %>%        
              as.tbl_json %>% 
              enter_object("next_page_token") 
            next_page_token <- as.character(attr(next_page_token,"JSON"))
    
            if (length(next_page_token) == 0) {
    
              payload_json <- rbind_pages(list(data.frame(payload_json,stringsAsFactors = FALSE),data.frame(payload_json2,stringsAsFactors = FALSE)))
    
            }   else {
              Sys.sleep(2)
              url3 = paste0("https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=",x,"&radius=",radius_meters,"&types=",type,"&pagetoken=",next_page_token,"&key=",key)
              payload_json3 <- getURL(url3)
    
              payload_json <- rbind_pages(list(data.frame(payload_json,stringsAsFactors = FALSE),data.frame(payload_json2,stringsAsFactors = FALSE),data.frame(payload_json3,stringsAsFactors = FALSE)))
    
            } 
    
          }
        }    
    

    【讨论】:

      猜你喜欢
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多