使用Google Places API在R中提取联系信息遇NA值问题
解决Google Maps提取商户电话和网站全为NA的问题
问题原因
google_places()的基础搜索结果(results$results)默认不包含formatted_phone_number和website字段,这两个字段只有通过商户的place_id调用详情接口才能获取。你当前的代码直接从基础搜索结果里提取这两个字段,自然会返回NA。
解决方案
修改代码,对每个搜索到的商户,用其place_id调用google_place_details()接口获取完整信息,再从中提取电话和网站。同时优化字段长度对齐逻辑,避免手动补NA的繁琐操作。
修改后的完整代码
library(tidyverse) library(googleway) # 设置API密钥 api_key <- "My_Key" # 读取城市列表 cities <- read_csv('My_Directory') # 搜索关键词 search_terms <- "My Search Term" # 初始化结果列表(比循环rbind数据框更高效) shops_list <- list() # 遍历每个城市执行搜索 for (i in 1:nrow(cities)) { city <- cities$City[i] search_query <- paste(search_terms, city, sep = " ") # 执行基础地点搜索 results <- google_places(search_string = search_query, key = api_key) if (results$status == "OK" && nrow(results$results) > 0) { # 遍历每个搜索结果,调用详情接口获取完整信息 temp_list <- map(results$results$place_id, function(pid) { place_details <- google_place_details(place_id = pid, key = api_key) # 提取字段,不存在则返回NA tibble( name = place_details$result$name, address = place_details$result$formatted_address, phone_number = place_details$result$formatted_phone_number %||% NA_character_, website = place_details$result$website %||% NA_character_ ) }) # 将当前城市的结果合并为数据框,加入列表 shops_list[[i]] <- bind_rows(temp_list) } } # 合并所有城市的结果 shops <- bind_rows(shops_list)
关键说明
- 核心逻辑:通过
google_place_details()接口传入商户的place_id,才能拿到电话、网站这类详细信息,这是解决NA问题的关键。 - 字段安全提取:用
%||%运算符(tidyverse内置)自动处理字段不存在的情况,无需手动判断长度补NA。 - 性能优化:用列表存储中间结果再合并,比循环
rbind数据框的效率更高,尤其适合城市数量较多的场景。 - API配额提醒:调用详情接口会额外消耗API配额,注意查看Google Cloud的费用监控,避免超出预算。
内容的提问来源于stack exchange,提问作者Rachel Rotz
相关产品推荐
相关产品推荐

