Python之emt-madrid包语法、参数和实际应用案例

Python之emt-madrid包语法、参数和实际应用案例 一、包概述emt-madridPyPI 包名emt-madrid是异步 Python 客户端用于访问西班牙马德里市政交通公司EMT Madrid的公开 API提供公交实时到站、站点信息、线路规划、停车场状态等数据。最新版本1.0.12025-07-19支持 Python≥3.8依赖aiohttp异步 HTTP、pydantic数据模型二、安装1. 稳定版推荐pipinstallemt-madrid2. 开发版GitHub 最新pipinstallgithttps://github.com/fermartv/EMTMadrid.git3. 验证安装importemt_madridprint(emt_madrid.__version__)# 输出 1.0.1三、前提获取 EMT 账号使用前必须在 EMT 官网注册账号免费访问https://opendata.emtmadrid.es/Formulario填写邮箱、密码验证邮箱记录EMAIL和PASSWORD用于认证四、核心语法与参数1. 核心类EMTClient主客户端封装认证与所有 API 调用异步EMTAPIAuthenticator独立认证器底层EMTAPIBusStop公交站点数据管理底层2. EMTClient 初始化参数fromemt_madridimportEMTClientfromaiohttpimportClientSession clientEMTClient(email:str,# 你的 EMT 邮箱必填password:str,# 你的 EMT 密码必填stop_id:strNone,# 默认公交站点 ID可选session:ClientSessionNone,# 异步会话可选默认自动创建timeout:int10# 请求超时秒默认10)3. 常用方法异步方法功能返回值await client.get_arrivals(stop_idNone)获取站点实时公交到站信息列表[dict]线路、到站时间、目的地等await client.get_stop_info(stop_idNone)获取站点详情地址、坐标、线路dict站点元数据await client.get_routes(line_id)获取公交线路轨迹经纬度、站点list[dict]路线坐标点await client.get_parking_status(parking_id)获取停车场实时空位dict停车场状态五、8 个实际应用案例案例1查询单个站点实时公交最常用importasynciofromaiohttpimportClientSessionfromemt_madridimportEMTClientasyncdefmain():EMAILyour-emailexample.comPASSWORDyour-passwordSTOP_ID72# 示例站点 ID可在 EMT 官网查询asyncwithClientSession()assession:clientEMTClient(EMAIL,PASSWORD,STOP_ID,session)arrivalsawaitclient.get_arrivals()print(实时到站,arrivals)if__name____main__:asyncio.run(main())案例2获取站点详细信息# 接案例1在 async with 块内添加stop_infoawaitclient.get_stop_info()print(站点详情,stop_info)# 输出{id: 72, name: Cibeles, address: Plaza de Cibeles, lines: [2, 5, 10]}案例3查询某条线路的所有站点asyncdefget_line_stops():EMAILyour-emailexample.comPASSWORDyour-passwordLINE_ID2# 公交线路 2 号线asyncwithClientSession()assession:clientEMTClient(EMAIL,PASSWORD,sessionsession)routesawaitclient.get_routes(LINE_ID)print(线路轨迹,routes)# 提取站点列表stops[point[stop_name]forpointinroutesifstop_nameinpoint]print(站点列表,stops)案例4实时监控多个站点异步并发asyncdefmonitor_multiple_stops():EMAILyour-emailexample.comPASSWORDyour-passwordSTOP_IDS[72,123,456]# 多个站点 IDasyncwithClientSession()assession:clientEMTClient(EMAIL,PASSWORD,sessionsession)# 并发查询所有站点tasks[client.get_arrivals(stop_id)forstop_idinSTOP_IDS]resultsawaitasyncio.gather(*tasks)forstop_id,arrivalsinzip(STOP_IDS,results):print(f站点{stop_id},arrivals)案例5获取停车场实时空位asyncdefget_parking():EMAILyour-emailexample.comPASSWORDyour-passwordPARKING_IDP001# 停车场 ID官网查询asyncwithClientSession()assession:clientEMTClient(EMAIL,PASSWORD,sessionsession)parkingawaitclient.get_parking_status(PARKING_ID)print(停车场状态,parking)# 输出{id: P001, name: Cibeles, free_slots: 15, total_slots: 50}案例6公交到站提醒简易版asyncdefbus_reminder(stop_id,target_line,threshold2): 当目标线路公交≤threshold分钟到站时提醒 EMAILyour-emailexample.comPASSWORDyour-passwordasyncwithClientSession()assession:clientEMTClient(EMAIL,PASSWORD,stop_id,session)whileTrue:arrivalsawaitclient.get_arrivals()forbusinarrivals:ifbus[line]target_lineandbus[minutes]threshold:print(f提醒{target_line}路公交{bus[minutes]}分钟后到站)returnawaitasyncio.sleep(30)# 30秒轮询一次案例7数据可视化结合 matplotlib 绘制到站时间分布importmatplotlib.pyplotaspltasyncdefplot_arrivals():EMAILyour-emailexample.comPASSWORDyour-passwordSTOP_ID72asyncwithClientSession()assession:clientEMTClient(EMAIL,PASSWORD,STOP_ID,session)arrivalsawaitclient.get_arrivals()lines[bus[line]forbusinarrivals]minutes[bus[minutes]forbusinarrivals]plt.bar(lines,minutes)plt.xlabel(公交线路)plt.ylabel(预计到站时间分钟)plt.title(站点72公交到站时间分布)plt.show()案例8构建简单 Web 接口FastAPIfromfastapiimportFastAPIimportasynciofromemt_madridimportEMTClientfromaiohttpimportClientSession appFastAPI()EMAILyour-emailexample.comPASSWORDyour-passwordapp.get(/arrivals/{stop_id})asyncdefread_arrivals(stop_id:str):asyncwithClientSession()assession:clientEMTClient(EMAIL,PASSWORD,stop_id,session)arrivalsawaitclient.get_arrivals()return{stop_id:stop_id,arrivals:arrivals}# 运行uvicorn main:app --reload# 访问http://localhost:8000/arrivals/72六、常见错误与解决1. 认证错误最常见错误AuthenticationError: Invalid credentials原因邮箱/密码错误、未验证邮箱、账号未激活解决核对邮箱密码区分大小写登录 EMT 官网确认邮箱已验证重新注册账号2. 站点 ID 无效错误ValueError: Stop ID not found原因stop_id不存在或格式错误解决在 EMT 官网查询有效站点 ID如 “72”确保 ID 为字符串类型3. 网络超时错误TimeoutError: Request timed out原因网络不稳定、EMT 服务器响应慢解决延长超时EMTClient(timeout20)检查网络连接换用异步会话ClientSession4. 依赖缺失错误ModuleNotFoundError: No module named aiohttp原因未安装依赖包解决pipinstallaiohttp pydantic5. 同步代码中调用异步方法错误RuntimeError: This event loop is already running原因在非异步环境直接调用await解决使用asyncio.run()包装异步函数Python 3.7或在 Jupyter 中使用%asyncio魔法命令七、使用注意事项异步优先包基于aiohttp所有 API 方法必须用await调用同步环境需用asyncio.run()包装。账号安全不要硬编码账号密码建议通过环境变量或配置文件读取importos EMAILos.getenv(EMT_EMAIL)PASSWORDos.getenv(EMT_PASSWORD)频率限制EMT API 限制每分钟≤60次请求高频查询需加间隔如asyncio.sleep(1)。数据格式返回数据为JSON 字典/列表字段名如line、minutes为英文需自行适配中文展示。异常处理生产环境需添加异常捕获避免单站点查询失败导致整个程序崩溃try:arrivalsawaitclient.get_arrivals()exceptExceptionase:print(f查询失败{e})八、总结emt-madrid是访问马德里公交数据的高效异步工具核心价值在于简化 EMT API 认证与数据解析支持实时公交、站点信息、线路规划、停车场状态等场景。《动手学PyTorch建模与应用:从深度学习到大模型》是一本从零基础上手深度学习和大模型的PyTorch实战指南。全书共11章前6章涵盖深度学习基础包括张量运算、神经网络原理、数据预处理及卷积神经网络等后5章进阶探讨图像、文本、音频建模技术并结合Transformer架构解析大语言模型的开发实践。书中通过房价预测、图像分类等案例讲解模型构建方法每章附有动手练习题帮助读者巩固实战能力。内容兼顾数学原理与工程实现适配PyTorch框架最新技术发展趋势。