Pi Pico W调用NASA NeoW API时出现挂起问题求助
问题排查与修复方案
1. 日期格式不符合API要求
NASA NeoW API要求日期参数必须是YYYY-MM-DD格式,月份、日期需为两位数字(比如1月要写01而非1)。你的代码直接将整数转为字符串,生成的日期格式不符合要求,会导致API返回异常数据甚至请求失败。
修复代码:
# 格式化日期为标准格式,自动补零 date_today = f"{y:04d}-{m:02d}-{d:02d}" date_yesterday = f"{y:04d}-{m:02d}-{d-1:02d}" url = f'https://api.nasa.gov/neo/rest/v1/feed?start_date={date_yesterday}&end_date={date_today}&api_key={api_key}'
2. 未处理异常情况导致挂起
你的代码默认每天都有至少3个近地天体,且每个天体数据结构完整,但实际某天可能没有这么多数据,直接访问索引([0]/[1]/[2])会触发IndexError;同时链式调用.get()后直接访问属性,若某个节点不存在会触发AttributeError,这些未捕获的异常会导致Pi Pico W挂起。
另外,requests.get可能因网络波动、API限流抛出异常,同样需要捕获处理。
修复代码(添加异常捕获+安全数据访问):
try: neodata = requests.get(url, timeout=10) # 检查请求是否成功(比如401密钥错误、400参数错误都会触发) neodata.raise_for_status() neo_json = neodata.json() date_today = f"{y:04d}-{m:02d}-{d:02d}" # 安全获取当天的天体列表,默认空数组 today_objects = neo_json.get('near_earth_objects', {}).get(date_today, []) # 最多处理3个天体,避免索引越界 for idx, obj in enumerate(today_objects[:3]): # 逐层安全获取数据,不存在则返回默认值 max_diameter = obj.get('estimated_diameter', {}).get('kilometers', {}).get('estimated_diameter_max', 'N/A') is_hazardous = obj.get('is_potentially_hazardous_asteroid', False) miss_distance = obj.get('close_approach_data', [{}])[0].get('miss_distance', {}).get('kilometers', 'N/A') asteroid_name = obj.get('name', 'Unknown') print(f"天体{idx+1}: {asteroid_name}, 最大直径: {max_diameter}km, 危险等级: {is_hazardous}, 错过距离: {miss_distance}km") except requests.exceptions.RequestException as e: print(f"API请求失败: {str(e)}") except (KeyError, IndexError) as e: print(f"数据解析错误: {str(e)}")
3. 内存优化(适配Pi Pico W)
Pi Pico W内存有限,你的代码多次重复调用neodata.json()会重复解析JSON数据,占用额外内存。建议先将JSON数据存入变量neo_json,再从中读取数据,减少内存消耗。
额外验证步骤
- 直接在浏览器中访问生成的
url,确认是否能返回正常JSON数据,排查API密钥是否正确、日期参数是否有效。 - 检查Pi Pico W的WiFi信号强度,避免因网络不稳定导致请求超时挂起。
内容的提问来源于stack exchange,提问作者AtomicUnleashed
相关产品推荐
相关产品推荐

