【问题标题】:Get a list of places from Google Maps in R从 R 中的 Google 地图获取地点列表
【发布时间】:2023-01-03 07:44:35
【问题描述】:

我使用来自googleway 包的google_places 从谷歌获取地点数据框。我正在寻找“德国的献血”(德语)https://www.google.de/maps/search/Blutspende+in+Deutschland/@51.5019637,6.4650438,12z 小插图说每个 API 查询都会在 20 个位置产生结果。 https://cran.r-project.org/web/packages/googleway/vignettes/googleway-vignette.html 我估计德国应该有大约300个献血点。我正在尝试构建一个循环,将所有 Google 地方结果返回到我的关键术语的数据框。可以在这里找到类似的帖子next_page_token not working on second attempt (google_places function)

我如何构建我的循环以使其返回所有 Google 搜索的数据框?

# initialize list
datalist = list()

# start first search
key = "YOUR-KEY"

res <- google_places(search_string = "Blutspende in Deutschland",
                     key = key)

# store first 20 results
datalist[[1]] <- data.frame(Name = res$results$name,
                            Place = res$results$formatted_address)

# set next page token
token = res$next_page_token

for(i in 1:10){
  # sleep time
  Sys.sleep(2)
  
  # next search 
  res_n <- google_places(search_string = "Blutspende in Deutschland",
                         page_token  = token,
                         key = key)
  
  # store next results  
  datalist[[i+1]] <- data.frame(Name = res_n$results$name,
                              Place = res_n$results$formatted_address)
  
  # set next token again  
  token <- res_n$next_page_token
  
  # print status   
  aa = res_n$status
  cat(i, aa, '\n')
}

# to dataframe
big_data = do.call(rbind, datalist)

此搜索中存在大量重复项。

library(tidyverse)
big_data %>% distinct() %>% nrow()

对我来说,202 个条目中我有 54 个不同的条目。我不知道为什么。

【问题讨论】:

    标签: r loops for-loop google-api googleway


    【解决方案1】:

    Google Maps place API 通过查询将响应限制为 60 个位置,分页最多 3 个 json,包含 20 个位置。 (参见Places API Docs)。

    要获得超过 60 个观察结果,使用 googleway 的一个简单技巧是按地区/​​土地,甚至是市政当局进行查询。在下一个示例中,我将遍历 16 个德国土地/州以获得 600 多个结果。

    library(tidyverse)
    library(googleway)
    
    key   <- "your_api_key"
    query <- "Blutspende Blutbank in Brandenburg, Deutschland"
    
    land <- c("Baden-Württemberg", "Bayern", "Berlin", "Brandenburg", "Bremen", "Hamburg", "Hessen", "Mecklenburg-Vorpommern", "Niedersachsen", "Nordrhein-Westfalen", "Rheinland-Pfalz", "Saarland", "Sachsen", "Sachsen-Anhalt", "Schleswig-Holstein", "Thüringen")
    queries <- paste0("Blutspende Blutbank in ", land, ", Deutschland")
    
    # A custom loop function for google_places() 
    google_places_loop <- function(search_string, key, ntimes = 3, page_token = "") {
    
     print(search_string)    
     iter <- 0
     obj_df <- tibble()
     
      while(iter < ntimes & !is.null(page_token)) {
        iter <- iter + 1
        print(iter)
        obj_response <- google_places(search_string = search_string, key = key, page_token = page_token,
                                      language = "DE", # Optional, but note that setting language to German might get you a few more locations
                                      )
        obj_df_new <-   as_tibble(obj_response$results) %>% mutate(iter = iter)
        obj_df <- bind_rows(obj_df, obj_df_new)
        page_token <- obj_response$next_page_token
        
        if(is.null(page_token) == TRUE) {
          print("No more pagination tokens")
          Sys.sleep(2)
        } else {
        Sys.sleep(3) 
        }
    
      }
      
      obj_df
      
    }
    
    # Finally, we loop through the queries by the custom function.
    df_blutspende <- map_df(.x = queries, .f = google_places_loop, key = key)
    

    【讨论】:

      猜你喜欢
      • 2021-03-17
      • 1970-01-01
      • 2017-03-27
      • 2011-05-10
      • 2017-11-04
      • 1970-01-01
      • 1970-01-01
      • 2023-01-10
      • 1970-01-01
      相关资源
      最近更新 更多