首页电脑使用Python通过强制 体现语句间的逻辑关系 python通过api获得响应

Python通过强制 体现语句间的逻辑关系 python通过api获得响应

圆圆2025-08-11 20:01:25次浏览条评论

Python中通过API获取地理距离:请求限流与数据整合实践本教程详细讲解如何利用Python通过外部API计算断层间的行驶距离,并重点介绍如何实现API请求的限流以遵守服务条款。文章内容介绍了API调用函数的构建、基于上下文管理器的智能限流机制、鲁棒的错误处理方法,以及最终将所有数据(包括原始坐标和计算出的距离)整合到Pandas DataFrame中的完整流程,旨在帮助读者、稳定地处理大规模地理空间数据请求。 1. 构建地理距离计算API函数

在处理地理空间数据时,我们需要经常计算两点间的实际驾驶距离。这通常通过调用第三方地图服务的api来实现。以下是一个使用osrm(开源路由机)公共api计算驾驶距离的python函数示例。osrm提供了一个开放且高性能的路由服务,非常适合此类任务。import requestsimport jsonimport pandas as pdfrom contextlib import contextmanagerfrom time import sleepimport http.client # For HTTPStatusdef get_drive_distance(lat1, lon1, lat2, lon2): quot;quot;quot;通过OSRM API计算两点间的驾驶距离。

参数: lat1 (float): 起点经度 lon1 (float): 起点经度 lat2 (float): 终点纬度 lon2 (float): 终点经度 返回: float: 驾驶距离(英里),如果请求失败则返回None quot;quot;quot; try: # OSRM API 的URL结构:/route/v1/car/{lon1},{lat1};{lon2},{lat2} url = fquot;http://router.project-osrm.org/route/v1/car/{lon1},{lat1};{lon2},{lat2}?overview=falsequot; response = requests.get(url) #检查HTTP响应状态码,如果不是2xx则发送异常 response.raise_for_status() data = json.loads(response.content) #检查API响应中是否有路由信息 if data.get(“路线”;) 和 len(data[“路线”;]) gt; 0: Driving_distance_meters = data[quot;routesquot;][0]['distance'] # 将米转换为英里 (1 英里 = 1609.34 米) Driving_distance_miles = Driving_distance_meters / 1609.34 return moving_distance_miles else: print(fquot;API响应未包含有效路由信息: {data}quot;) return None except requests.exceptions.RequestException as e: print(fquot;API 请求失败: {e}quot;) return None except json.JSONDecodeError as e: print(fquot;JSON 解析失败: {e}quot;) return None except KeyError as e: print(fquot;API 响应结构异常,缺失键: {e}quot;) return None 登录后复制

注意事项:坐标顺序: OSRM API通常要求经度在前,纬度在后(lon,lat)。请务必核对您的数据顺序。overview=false: 参数可以减少API响应中路由这个几何信息的详细程度,从而减少响应体大小,提高效率。 错误处理:response.raise_for_status()是一个非常重要的错误处理机制。

如果HTTP请求返回的状态码表示错误(如4xx或5xx),它会自动引发requests.exceptions.HTTPError异常,避免程序在处理无效响应时崩溃。2. 实现API请求限流机制

当需要进行大量API调用时,为了避免对API服务器造成过大压力或影响API服务成功的调用,实现请求限流(Rate Limiting)至关重要。我们利用Python的下游管理器(contextlib.contextmanager)来优雅地实现这一功能。#定义一个全局变量来跟踪API调用次数api_calls = 0@contextmanagerdefrate_limited(limit=500,delay=5): quot;quot;quot;一个上下文管理器,用于API调用频率。当API调用次数达到指定限制时,暂停指定时间。参数: limit (int):在暂停前允许的最大API调用次数。秒...quot;) sleep(delay) # 暂停后,重置增量(或减少已处理的批次) api_calls = 0 # 简单重置,也可以 api_calls -= limit api_calls = 1 Yield # 执行被包装的代码 # 上下文退出时,补充额外操作# 更新 get_driven_distance 函数以集成限流def get_drive_distance_with_rate_limit(lat1, lon1, lat2, lon2): quot;quot;quot;通过OSRM API 计算两点间的行驶距离,并集成请求限流。 quot;quot;quot; withrate_limited(): # 在这里应用限流 return get_drive_distance(lat1, lon1, lat2, lon2) 登录后复制

工作原理:api_calls:一个全局总量,记录当前批量的 API 调用次数。rate_limited 管理器:在进入 with 块之前,会检查 api_calls 是否接近limit。如果接近,则调用 time.sleep(delay) 暂停执行。暂停后,api_calls 被重置(或相应调整),以便新的批次可以开始统计。api_calls 渐进随着时间块都会递增。yield 关键字使得被包装的代码(即 get_driven_distance 的内容)才能执行。通过将 get_driven_distance 函数转发在 withrate_limited():语句中,每次调用该函数时都会自动触发限流逻辑。

3.数据整合至Pandas DataFrame

最终目标是将原始的地理坐标数据与计算出的驾驶距离整合到一个重构的Pandas DataFrame中,方便后续的数据分析和可视化。

立即学习“Python学习笔记(深入)”;我们

假设有四个列表组数据:起点纬度、起点经度、终点纬度、终点经度。#尾端数据location_latitudes = [51.5074, 40.7128, 34.0522]location_longitudes = [-0.1278, -74.0060, -118.2437]station_latitudes = [51.5154, 40.7580, 34.0522]station_longitudes = [-0.0920, -73.9855, -118.2437]# 存储计算出的距离 Driving_distances = []# 遍历数据并计算距离 for i in range(len(location_latitudes)): lat1 = location_latitudes[i] lon1 = location_longitudes[i] lat2 = station_latitudes[i] lon2 = station_longitudes[i] distance = get_driven_distance_with_rate_limit(lat1, lon1, lat2, lon2) Driving_distances.append(distance) #打印细节(任选) print(fquot;处理第 {i 1} 对坐标: ({lat1},{lon1}) -gt; ({lat2},{lon2}), 距离: {distance:.2f} 英里quot;)#创建DataFramedata = { 'Location_Lat': location_latitudes, 'Location_Lon': location_longitudes, 'Station_Lat': station_latitudes, '站_Lon': station_longitudes, 'Driving_Distance_Miles': Driving_distances}df = pd.DataFrame(data)print(quot;\n最终生成的DataFrame:quot;)print(df)登录后复制

代码说明:准备数据:示例中创建了四个列表,分别代表起点和终点的经纬度。在实际应用中,这些数据可能来自CSV文件、数据库或其他数据源。迭代计算:通过循环遍历这些列表,对每一对坐标调用 get_drive_distance_with_rate_limit 函数,将返回的距离存储在 moving_distances 列表中。 构建DataFrame:使用一个字典来组织所有相关数据(原始坐标和计算出的距离),然后将其传递给 pd.DataFrame() 构造函数,即可生成一个格式化的DataFrame。

4.总结与最佳实践

本教程高效地展示了如何结合Python的请求库、上下文管理器以及Pandas库,且稳定地处理地理距离计算任务。以下是一些额外的最佳实践和考虑事项:更健壮的处理错误:对于生产环境应用,除了raise_for_status()外,还实现重试机制(例如使用坚韧库),尤其是在面对临时性网络问题或API服务转变时。持久化数据:对于大量API调用,建议将中间结果定期保存到文件(如CSV、JSON),程序中断或网络问题导致数据丢失,避免重复昂贵的API请求。API密钥管理:如果您使用的是需要API密钥的商业地图服务(如Google Maps API),请务必叙利亚管理您的密钥,不要将其硬编码在代码中。可以使用环境标记或配置文件来存储。 异步请求:对于复杂庞大的数据集,可以考虑使用异步请求库(如aiohttp)来发送API请求,进一步提高效率,但会增加代码的复杂性。忽略API服务条款: 请务必阅读并遵守您所使用的API服务的条款和条件,包括请求限制、使用范围等。不当使用可能导致IP被封禁或账户被禁用。选择合适的API: OSRM是一个优秀的选择,但对于需要更高级功能(如交通信息、路线优化、地理编码等)或更高请求限制的关注场景,需要考虑商业API服务。

通过遵循这些指导原则,您可以构建出稳定、且符合规范的地理空间数据处理应用程序。

以上就是Python中通过API获取地理距离:请求限流与数据集成实践的详细内容,更多请请乐哥常识网相关其他文章!

Python中通过A
java如何匹配字符串 java匹配任意字符
相关内容
发表评论

游客 回复需填写必要信息