如何从Flightradar24 API获取航班计划与实际到达时间?代码报错求助
解决Flightradar24 Python API调用中KeyError: 'time'及获取实际到达时间的问题
错误原因
你遇到的KeyError: 'time'是因为flight_data字典中不存在'time'键——第三方flightradar24库的get_flight方法返回的数据结构会因航班状态(未起飞、飞行中、已完成)或数据完整性而变化,且官方文档未明确说明结构细节。
修复步骤与优化代码
1. 先确认返回数据的实际结构
在调用get_flight后添加打印语句,输出完整的flight_data,明确所有可用字段:
flight_data = fr24.get_flight(flight_number) print(flight_data) # 打印完整结构,用于排查字段位置
2. 安全访问嵌套字段,避免KeyError
替换直接索引字典键的方式,改用dict.get()逐层安全访问,即使字段不存在也不会抛出错误。
3. 定位实际到达时间字段
实际到达时间通常藏在status或time的嵌套结构中,比如可能是flight_data.get('status', {}).get('real', {}).get('arrival')或flight_data.get('time', {}).get('real', {}).get('arrival'),需根据打印的结构确认。
修改后的完整代码
import asyncio import flightradar24 from datetime import datetime from dateutil import parser fr24 = flightradar24.Api() async def get_flight_status(**kwargs) -> dict[str, object]: flight_number: str | None = kwargs.get('flight_number', None) flight_date: str | None = kwargs.get('flight_date', None) if not flight_date: flight_date = datetime.now().strftime("%Y-%m-%d") else: try: parsed_date = parser.parse(flight_date) flight_date = parsed_date.strftime("%Y-%m-%d") except ValueError: return {"final_answer": "Invalid date format. Please use a valid date format."} try: flight_data = fr24.get_flight(flight_number) if not flight_data: return {"final_answer": f"No flight data found for {flight_number} on {flight_date}."} # 打印结构用于排查(调试完成后可删除) print("Flight data structure:", flight_data) # 安全获取计划时间 time_data = flight_data.get('time', {}) scheduled_departure = time_data.get('scheduled', {}).get('departure', 'No data') scheduled_arrival = time_data.get('scheduled', {}).get('arrival', 'No data') # 安全获取实际到达时间 status_data = flight_data.get('status', {}) real_arrival = status_data.get('real', {}).get('arrival', 'No actual arrival data') # 获取航班状态文本 status_text = status_data.get('generic', {}).get('status', {}).get('text', 'No status available') result = { "flight_number": flight_number, "scheduled_departure": scheduled_departure, "scheduled_arrival": scheduled_arrival, "actual_arrival": real_arrival, "status": status_text } return {"result_data": [result]} except Exception as e: return {"final_answer": f"Failed to retrieve flight status. Error: {str(e)}"} async def main(): flight_info = await get_flight_status(flight_number='EK148') print(flight_info) if __name__ == "__main__": asyncio.run(main())
额外提示
- 如果
get_flight无法返回实际到达时间,可尝试用fr24.get_flights()方法,结合航班号、出发/到达机场及日期进行筛选,部分航班的实际数据会在该接口中返回。 - 若第三方库的接口无法满足需求,可查看
flightradar24库的源码(比如api.py中的get_flight实现),了解其调用的官方API端点,直接构造请求获取更完整的数据(需遵守Flightradar24的服务条款)。
内容的提问来源于stack exchange,提问作者Aleksandr Demianov
相关产品推荐
相关产品推荐

