十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Python天气查询工具开发:从API调用到打包发布

Python天气查询工具开发:从API调用到打包发布 1. 项目概述Python天气查询工具开发指南最近在整理Python实战小项目时发现天气查询是个非常适合练手的案例。这个py天气查询器不仅能帮助初学者掌握Python基础语法还能学习API调用、数据处理等实用技能。我自己在开发过程中踩过不少坑今天就把完整实现过程和经验总结分享给大家。这个工具的核心功能很简单输入城市名称返回实时天气数据。但麻雀虽小五脏俱全它涉及了以下几个关键技术点第三方天气API的调用与认证用户输入的处理与验证JSON数据的解析与格式化输出异常处理机制的实现可执行文件的打包发布2. 开发环境准备2.1 Python环境配置推荐使用Python 3.8版本这个项目不需要特别新的特性。安装时务必勾选Add Python to PATH选项这样可以直接在命令行使用python和pip命令。验证安装是否成功python --version pip --version2.2 必要库安装我们需要以下几个第三方库requests用于HTTP请求prettytable美化输出格式pyinstaller打包工具可选安装命令pip install requests prettytable pyinstaller3. 核心功能实现3.1 获取天气API接口我测试了几个免费的天气API最终选择了和风天气它提供免费的开发版套餐每天1000次调用。注册后获取API Key我们主要使用它的实时天气接口。接口文档示例https://devapi.qweather.com/v7/weather/now?location101010100key你的KEY3.2 基础代码框架先搭建基础结构我习惯把功能拆分成独立函数import requests from prettytable import PrettyTable class WeatherQuery: def __init__(self, api_key): self.api_key api_key self.base_url https://devapi.qweather.com/v7/weather/now def get_city_code(self, city_name): 将城市名转换为地理位置ID pass def fetch_weather(self, location_id): 获取天气数据 pass def display_weather(self, data): 格式化输出天气信息 pass def run(self): 主运行逻辑 pass3.3 完整实现代码经过几次迭代优化最终的核心代码如下import requests import json from prettytable import PrettyTable class WeatherQuery: def __init__(self, api_key): self.api_key api_key self.base_url https://devapi.qweather.com/v7/weather/now self.geo_url https://geoapi.qweather.com/v2/city/lookup def get_city_code(self, city_name): try: params { location: city_name, key: self.api_key, range: cn } response requests.get(self.geo_url, paramsparams) data response.json() if data[code] 200: return data[location][0][id] return None except Exception as e: print(f获取城市代码失败: {e}) return None def fetch_weather(self, location_id): try: params { location: location_id, key: self.api_key } response requests.get(self.base_url, paramsparams) data response.json() if data[code] 200: return data[now] return None except Exception as e: print(f获取天气数据失败: {e}) return None def display_weather(self, data): if not data: print(无有效天气数据) return table PrettyTable() table.field_names [项目, 数值] table.add_row([温度, f{data[temp]}°C]) table.add_row([体感温度, f{data[feelsLike]}°C]) table.add_row([天气状况, data[text]]) table.add_row([风向, data[windDir]]) table.add_row([风力等级, data[windScale]]) table.add_row([相对湿度, f{data[humidity]}%]) table.add_row([降水量, f{data[precip]}mm]) print(table) def run(self): city input(请输入要查询的城市名称: ) if not city: print(城市名称不能为空) return location_id self.get_city_code(city) if not location_id: print(未找到该城市信息) return weather_data self.fetch_weather(location_id) self.display_weather(weather_data) if __name__ __main__: # 替换为你的API Key api_key 你的API_KEY app WeatherQuery(api_key) app.run()4. 关键技术与优化点4.1 API请求优化天气API通常有调用频率限制我们可以通过以下方式优化添加请求缓存避免重复查询相同城市实现简单的本地存储保存最近查询记录添加重试机制应对网络波动缓存实现示例from functools import lru_cache lru_cache(maxsize100) def get_city_code(self, city_name): # 原有代码4.2 异常处理完善健壮的程序需要处理各种异常情况网络连接问题API返回错误用户输入无效JSON解析失败改进后的异常处理def fetch_weather(self, location_id): try: response requests.get(self.base_url, paramsparams, timeout5) response.raise_for_status() data response.json() if data.get(code) ! 200: raise ValueError(fAPI返回错误: {data.get(message)}) return data[now] except requests.exceptions.RequestException as e: print(f网络请求异常: {e}) except json.JSONDecodeError as e: print(f数据解析失败: {e}) except Exception as e: print(f未知错误: {e}) return None4.3 用户交互增强基础版只能单次查询我们可以添加循环查询功能历史记录查看多城市同时查询交互增强示例def run(self): while True: print(\n1. 查询天气) print(2. 查看历史记录) print(3. 退出) choice input(请选择操作: ) if choice 1: city input(请输入城市名称: ) # 查询逻辑 elif choice 2: # 显示历史记录 elif choice 3: break else: print(无效输入)5. 打包发布为可执行文件5.1 使用PyInstaller打包将Python脚本打包成exe方便分享使用pyinstaller -F -w weather_query.py常用参数说明-F打包成单个文件-w不显示控制台窗口GUI程序使用-i添加图标文件5.2 打包常见问题解决文件体积过大pyinstaller -F --exclude-moduleunnecessary_module weather_query.py运行时缺少依赖pyinstaller --hidden-importmodule_name weather_query.py防病毒软件误报使用代码签名证书在Virustotal提交检测6. 项目扩展方向这个基础版本还可以进一步扩展6.1 图形界面开发使用Tkinter或PyQt添加GUIfrom tkinter import * class WeatherApp(Tk): def __init__(self): super().__init__() self.title(天气查询工具) self.geometry(400x300) Label(self, text城市名称:).pack() self.city_entry Entry(self) self.city_entry.pack() Button(self, text查询, commandself.query).pack() self.result_text Text(self) self.result_text.pack() def query(self): city self.city_entry.get() # 调用查询逻辑 self.result_text.delete(1.0, END) self.result_text.insert(END, result) app WeatherApp() app.mainloop()6.2 天气预报功能扩展增加多天预报添加天气预警信息实现天气数据可视化6.3 多平台支持开发Web版Flask/Django开发移动端应用Kivy/BeeWare开发命令行工具Click库7. 开发经验与避坑指南在实际开发中我总结了以下经验教训API调用频率限制免费API通常有严格的调用限制建议添加延时避免频繁调用考虑使用多个API Key轮询城市名称匹配问题中文城市可能有多种称呼如北京/北京市建议实现模糊匹配功能可以预加载城市列表提高匹配准确率网络请求优化设置合理的超时时间建议5-10秒添加重试机制最多3次使用Session保持连接数据缓存策略内存缓存适合短期重复查询文件缓存适合长期保存数据数据库存储适合大量历史数据用户输入处理去除输入首尾空格处理中英文标点差异实现拼音输入支持这个项目虽然不大但涵盖了Python开发的多个核心技能点。建议初学者可以按照这个思路先实现基础功能再逐步添加高级特性。我在开发过程中最大的体会是好的异常处理能让程序健壮性提升一个档次而细致的用户交互设计则能大大提升使用体验。
返回列表