求助:如何批量通过API获取城市经纬度(附R初始调用代码)
批量获取城市经纬度:R/Python 实现方案
R 实现方案
基于你提供的基础代码,我们可以用purrr包实现批量处理,同时加入请求延迟避免API限流,最终输出包含城市、纬度、经度的表格。
完整代码
library(httr2) library(purrr) library(dplyr) library(jsonlite) # 配置API密钥 API_KEY <- "你的RapidAPI密钥" API_HOST <- "geocoding-by-api-ninjas.p.rapidapi.com" # 待处理的城市列表 cities <- c("New York", "London", "Tokyo", "Beijing") # 定义单个城市的经纬度获取函数 get_geo_data <- function(city) { # 构造请求 req <- request("https://geocoding-by-api-ninjas.p.rapidapi.com/") %>% req_url_path("v1/geocoding") %>% req_url_query(name = city) %>% req_headers( 'X-RapidAPI-Key' = API_KEY, 'X-RapidAPI-Host' = API_HOST ) # 发送请求并解析结果 resp <- req %>% req_perform() json_data <- resp %>% resp_body_json() # 提取需要的字段,处理无结果的情况 if(length(json_data) == 0) { return(tibble(city = city, latitude = NA, longitude = NA)) } else { return(tibble( city = city, latitude = json_data[[1]]$latitude, longitude = json_data[[1]]$longitude )) } } # 批量处理:加入延迟(每秒1次请求,避免限流) geo_results <- map_dfr(cities, function(city) { Sys.sleep(1) get_geo_data(city) }) # 输出结果 print(geo_results)
关键说明
- 用
map_dfr批量遍历城市列表,自动将结果合并为DataFrame - 加入
Sys.sleep(1)控制请求频率,避免触发API限流机制 - 增加了无结果的容错处理,返回NA值
- 使用
dplyr和tibble简化数据整理流程
Python 实现方案
如果偏好Python,可以用requests库结合pandas实现同样的功能:
完整代码
import requests import pandas as pd import time # 配置API密钥 API_KEY = "你的RapidAPI密钥" API_HOST = "geocoding-by-api-ninjas.p.rapidapi.com" BASE_URL = "https://geocoding-by-api-ninjas.p.rapidapi.com/v1/geocoding" # 待处理的城市列表 cities = ["New York", "London", "Tokyo", "Beijing"] # 定义请求头 headers = { "X-RapidAPI-Key": API_KEY, "X-RapidAPI-Host": API_HOST } # 存储结果的列表 geo_data = [] # 批量处理 for city in cities: params = {"name": city} try: response = requests.get(BASE_URL, headers=headers, params=params) response.raise_for_status() # 检查请求是否成功 data = response.json() if data: geo_data.append({ "city": city, "latitude": data[0]["latitude"], "longitude": data[0]["longitude"] }) else: geo_data.append({ "city": city, "latitude": None, "longitude": None }) except Exception as e: print(f"获取{city}数据失败: {str(e)}") geo_data.append({ "city": city, "latitude": None, "longitude": None }) time.sleep(1) # 延迟1秒避免限流 # 转换为DataFrame并输出 df = pd.DataFrame(geo_data) print(df)
关键说明
- 用
requests.get发送请求,结合params传递城市参数 - 加入异常处理,捕获请求失败的情况
- 使用
time.sleep(1)控制请求频率 - 最终结果转换为
pandas.DataFrame,方便后续分析或导出表格
内容的提问来源于stack exchange,提问作者Vanda Klčová
相关产品推荐
相关产品推荐

