OpenSky航班追踪API请求报错:连接错误与数据帧列不匹配
解决航班追踪器的连接错误与数据列不匹配问题
错误原因分析与修复步骤
1. 连接错误(ConnectionError)
你直接将用户名密码硬编码在URL的https://后方,导致requests错误地将wvzack识别为主机名,进而触发域名解析失败。正确的HTTP基本认证应该使用requests内置的auth参数传递,而非拼接在URL中。
2. 列长度不匹配错误(ValueError)
当请求失败或API返回的states为空列表时,你创建的DataFrame没有任何列,此时强行赋值17个列名就会出现长度不匹配。需要先校验请求状态与数据是否存在,再进行后续处理。
另外注意:你代码中lat_min=-49.082514是明显笔误,温哥华周边纬度为北纬49度左右,需改为正数,否则区域范围错误会导致无数据返回。
修改后的完整代码
import requests import pandas as pd # 修正区域坐标(修复纬度负数笔误) lon_min = -123.063498 lat_min = 49.082514 lon_max = -123.295758 lat_max = 49.308148 # 请求配置 user_name = "wvzack" password = "########" url_data = "https://opensky-network.org/api/states/all" params = { 'lamin': lat_min, 'lomin': lon_min, 'lamax': lat_max, 'lomax': lon_max } try: # 使用auth参数传递认证信息,避免URL拼接错误 response = requests.get(url_data, auth=(user_name, password), params=params) response.raise_for_status() # 主动抛出HTTP状态码错误 data = response.json() col_names = [ 'icao24','callsign','origin_country','time_position','last_contact', 'long','lat','baro_altitude','on_ground','velocity','true_track', 'vertical_rate','sensors','geo_altitude','squawk','spi','position_source' ] # 安全获取states数据,默认空列表 states = data.get('states', []) if not states: print("当前区域没有航班数据") else: flight_df = pd.DataFrame(states) # 动态匹配列数,避免硬编码范围出错 flight_df = flight_df.iloc[:, :len(col_names)] flight_df.columns = col_names flight_df = flight_df.fillna('No Info') print(flight_df.head()) except requests.exceptions.ConnectionError as e: print(f"连接错误: {e}") except requests.exceptions.HTTPError as e: print(f"HTTP请求错误: {e}") except ValueError as e: print(f"数据处理错误: {e}")
内容的提问来源于stack exchange,提问作者wvzack
相关产品推荐
相关产品推荐

