当前位置: 首页 > article >正文

手把手教你用Python调用免费天气API,5分钟搞定城市代码查询与数据解析

Python实战5分钟快速集成天气API与智能城市代码查询系统最近在开发一个社区服务小程序时需要添加实时天气功能模块。原本以为调用个API就能轻松搞定结果发现光是处理城市代码匹配就耗费了大半天时间。相信很多开发者都遇到过类似困扰——面对陌生的API接口文档和冗长的城市代码列表不知从何下手。本文将分享一套经过实战检验的解决方案让你在5分钟内完成从城市名查询到天气数据获取的全流程实现。1. 环境准备与基础配置在开始编码前我们需要确保开发环境就绪。推荐使用Python 3.6版本这个项目只需要安装最基本的requests库即可pip install requests为了后续开发方便建议新建一个weather_api.py文件作为主程序文件。这个文件将包含我们所有的功能实现。先创建一个基础类结构import requests import json class WeatherAPI: def __init__(self): self.base_url http://t.weather.itboy.net/api/weather/city/ self.city_code_map {} # 用于存储城市代码映射关系 def get_weather(self, city_name): pass关键点说明使用类封装可以更好地组织代码base_url是API的基础地址city_code_map将用于缓存城市代码查询结果2. 智能城市代码查询系统原始的城市代码列表过于庞大直接硬编码在程序中既不优雅也难以维护。我们可以设计一个智能查询系统通过以下步骤实现2.1 构建城市代码数据库首先创建一个独立的city_codes.json文件存储城市代码数据。这样做的优势是数据与代码分离便于维护更新可以随时扩展新的城市数据减少内存占用按需加载文件结构示例{ 北京: { 北京: 101010100, 海淀: 101010200, 朝阳: 101010300 }, 上海: { 上海: 101020100, 闵行: 101020200, 宝山: 101020300 } }2.2 实现智能查询功能在WeatherAPI类中添加以下方法def load_city_codes(self, filepathcity_codes.json): with open(filepath, r, encodingutf-8) as f: self.city_code_map json.load(f) def find_city_code(self, city_name): for province, cities in self.city_code_map.items(): if city_name in cities: return cities[city_name] raise ValueError(f未找到城市{city_name}对应的代码)优化技巧添加模糊匹配功能处理用户输入误差实现缓存机制避免重复加载文件支持省市区三级查询3. 完整API调用与数据处理现在我们可以实现完整的天气查询功能了。更新get_weather方法def get_weather(self, city_name): try: city_code self.find_city_code(city_name) response requests.get(f{self.base_url}{city_code}) response.raise_for_status() return self._parse_weather_data(response.json()) except Exception as e: return {error: str(e)} def _parse_weather_data(self, data): return { city: data[cityInfo][city], update_time: data[time], weather: data[data][forecast][0][type], temperature: f{data[data][forecast][0][low]} ~ {data[data][forecast][0][high]}, humidity: data[data][shidu], air_quality: data[data][quality] }错误处理要点网络请求超时设置API响应状态检查JSON解析异常捕获数据字段缺失处理4. 实战应用与性能优化4.1 实际调用示例创建一个简单的命令行交互界面if __name__ __main__: weather_api WeatherAPI() weather_api.load_city_codes() while True: city input(请输入查询城市名称(输入q退出): ) if city.lower() q: break result weather_api.get_weather(city) if error in result: print(f查询失败: {result[error]}) else: print(f\n{city}天气信息:) for key, value in result.items(): print(f{key}: {value}) print()4.2 性能优化策略缓存机制from functools import lru_cache lru_cache(maxsize100) def get_weather(self, city_name): # 原有实现异步请求import aiohttp import asyncio async def async_get_weather(self, city_name): async with aiohttp.ClientSession() as session: async with session.get(f{self.base_url}{city_code}) as response: data await response.json() return self._parse_weather_data(data)批量查询支持def batch_get_weather(self, city_list): with ThreadPoolExecutor() as executor: results list(executor.map(self.get_weather, city_list)) return results5. 扩展功能与异常场景处理实际项目中我们还需要考虑更多边界情况5.1 城市别名支持很多城市有常用别名如帝都指北京可以通过扩展city_codes.json实现{ 北京: { 北京: 101010100, 帝都: 101010100, 京城: 101010100 } }5.2 天气数据可视化使用matplotlib添加简单的数据可视化def plot_temperature_trend(self, city_name, days7): weather_data self.get_week_forecast(city_name) dates [d[date] for d in weather_data] highs [int(d[high].split( )[1]) for d in weather_data] lows [int(d[low].split( )[1]) for d in weather_data] plt.plot(dates, highs, label最高气温) plt.plot(dates, lows, label最低气温) plt.fill_between(dates, highs, lows, alpha0.1) plt.title(f{city_name}未来{days}天气温趋势) plt.legend() plt.show()5.3 常见错误代码处理ERROR_MAP { 404: 城市代码不存在, 500: 服务器内部错误, 502: 网关错误, 503: 服务不可用 } def get_weather(self, city_name): try: city_code self.find_city_code(city_name) response requests.get(f{self.base_url}{city_code}, timeout5) if response.status_code ! 200: error_msg ERROR_MAP.get(response.status_code, 未知错误) return {error: fAPI请求失败: {error_msg}} return self._parse_weather_data(response.json()) except requests.exceptions.Timeout: return {error: 请求超时请稍后重试} except requests.exceptions.RequestException as e: return {error: f网络请求异常: {str(e)}}在最近的一个电商项目中这套天气查询系统帮助我们在用户地址页面集成了实时天气展示功能。最初版本没有城市别名支持导致部分用户输入榕城福州别称时查询失败。后来通过扩展城市代码数据库增加了常见城市别名的映射用户体验得到了显著提升。

相关文章:

手把手教你用Python调用免费天气API,5分钟搞定城市代码查询与数据解析

Python实战:5分钟快速集成天气API与智能城市代码查询系统 最近在开发一个社区服务小程序时,需要添加实时天气功能模块。原本以为调用个API就能轻松搞定,结果发现光是处理城市代码匹配就耗费了大半天时间。相信很多开发者都遇到过类似困扰——…...

告别官方手册!i.MX6ULL SD卡启动盘制作保姆级教程(含dd命令详解与分区避坑)

i.MX6ULL SD卡启动盘制作实战指南:从原理到避坑全解析 引言 第一次拿到i.MX6ULL开发板时,很多开发者都会面临一个看似简单却暗藏玄机的任务——制作SD卡启动盘。官方文档虽然提供了步骤,但往往缺乏对底层原理的解释,导致新手在遇到…...

基于NCD的轻量级分类方法:隐私保护与高效计算

1. 项目概述在当今机器学习领域,我们正面临一个根本性矛盾:模型性能与用户隐私之间的拉锯战。传统机器学习方法依赖海量用户数据进行集中训练,这不仅引发严重的隐私担忧,还要求昂贵的计算资源。而本文介绍的基于归一化压缩距离&am…...

如何免费下载30+文档平台内容:终极浏览器脚本指南

如何免费下载30文档平台内容:终极浏览器脚本指南 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您…...

别再死记硬背了!用Python手把手实现Pareto前沿的三种经典算法(附代码对比)

用Python实战解析Pareto前沿:三大算法代码实现与性能对比 在资源分配、参数调优等实际场景中,我们常面临多个相互冲突的目标需要同时优化。传统单目标优化方法难以应对这种复杂需求,而Pareto最优解集理论为我们提供了科学框架。本文将用Pyth…...

STM32 SSD1306 OLED驱动完整教程:5分钟快速上手嵌入式显示

STM32 SSD1306 OLED驱动完整教程:5分钟快速上手嵌入式显示 【免费下载链接】stm32-ssd1306 STM32 library for working with OLEDs based on SSD1306, SH1106, SH1107 and SSD1309, supports I2C and SPI 项目地址: https://gitcode.com/gh_mirrors/st/stm32-ssd1…...

PvZ Tools终极指南:如何高效使用植物大战僵尸1.0.0.1051辅助工具

PvZ Tools终极指南:如何高效使用植物大战僵尸1.0.0.1051辅助工具 【免费下载链接】pvztools 植物大战僵尸原版 1.0.0.1051 修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztools 植物大战僵尸PvZ Tools是一款专为原版《植物大战僵尸》1.0.0.1051版本…...

淘宝自动化脚本taojinbi:解放双手的智能任务管理方案

淘宝自动化脚本taojinbi:解放双手的智能任务管理方案 【免费下载链接】taojinbi 淘宝淘金币自动执行脚本,包含蚂蚁森林收取能量,芭芭农场全任务,解放你的双手 项目地址: https://gitcode.com/gh_mirrors/ta/taojinbi 淘宝自…...

告别手动开终端!用Python写ROS2 Launch文件一键启动小海龟(附完整代码)

用Python自动化ROS2节点启动:小海龟仿真实战指南 每次调试ROS2项目都要反复敲命令开终端?作为过来人,我完全理解这种低效操作带来的烦躁。还记得第一次跑小海龟仿真时,我同时开了五个终端窗口,手忙脚乱地切换&#xff…...

九大网盘直链下载工具LinkSwift完整配置指南

九大网盘直链下载工具LinkSwift完整配置指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / 迅雷云盘 / 夸…...

微信聊天记录永久保存指南:WeChatMsg让珍贵对话永不消失

微信聊天记录永久保存指南:WeChatMsg让珍贵对话永不消失 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeC…...

TranslucentTB终极指南:3分钟掌握Windows任务栏透明美化技巧

TranslucentTB终极指南:3分钟掌握Windows任务栏透明美化技巧 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB TranslucentTB是…...

5分钟学会使用image2cpp:让Arduino图像显示变得前所未有的简单 [特殊字符]

5分钟学会使用image2cpp:让Arduino图像显示变得前所未有的简单 🚀 【免费下载链接】image2cpp 项目地址: https://gitcode.com/gh_mirrors/im/image2cpp 还在为Arduino项目中的图像显示问题而烦恼吗?每次想要在OLED屏幕上显示一个简单…...

手把手教你用IPMI远程搞定ESXi 8.0实体机安装(附BIOS避坑指南)

手把手教你用IPMI远程搞定ESXi 8.0实体机安装(附BIOS避坑指南) 当你面对机房里的服务器却无法亲临现场时,远程安装ESXi 8.0可能看起来像是一项不可能完成的任务。但借助IPMI的远程控制能力,这一切变得轻而易举。本文将带你深入探索…...

SD-PPP:免费AI绘画插件完整指南 - 5步开启Photoshop智能创作新时代

SD-PPP:免费AI绘画插件完整指南 - 5步开启Photoshop智能创作新时代 【免费下载链接】sd-ppp A Photoshop AI plugin 项目地址: https://gitcode.com/gh_mirrors/sd/sd-ppp 在数字艺术和设计领域,AI绘画技术正在彻底改变创作方式。然而&#xff0c…...

32Gb NAND闪存供应趋紧:产业升级下的供需失衡与应对策略

1. 市场动态深度解析:当32Gb NAND闪存供应趋紧最近和几个做消费电子和工控方案的朋友聊天,大家不约而同地都在吐槽同一件事:一些老型号、小容量的存储芯片,不仅交期拉得老长,价格还蹭蹭往上涨。这感觉就像你去五金店买…...

告别Vivado卡顿:用Docker+Jupyter在Ubuntu上丝滑搭建FINN FPGA加速器开发环境

告别Vivado卡顿:用DockerJupyter在Ubuntu上丝滑搭建FINN FPGA加速器开发环境 当FPGA遇上神经网络加速,开发环境配置往往成为第一道门槛。传统Vivado安装动辄消耗数十GB磁盘空间,版本依赖复杂如迷宫,而FINN框架作为Xilinx生态中的量…...

LoongArch CPU流水线设计避坑指南:同步RAM时序、握手信号与复位值那些事儿

LoongArch CPU流水线设计避坑指南:同步RAM时序、握手信号与复位值那些事儿 第一次在LoongArch架构上实现五级流水线CPU时,我盯着仿真波形里那些莫名其妙的时序错位整整两天。明明每个模块单独测试都正常,组合起来却总在跳转指令和访存操作时出…...

Android Studio中文界面终极指南:5分钟轻松搞定界面汉化

Android Studio中文界面终极指南:5分钟轻松搞定界面汉化 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 还在为Androi…...

别再手动算点了!STM32F103 DAC内置三角波发生器实战(附CubeMX配置)

解放CPU算力:STM32F103 DAC硬件三角波生成全攻略 在嵌入式系统开发中,波形生成是常见的需求场景。无论是工业控制中的测试信号注入,还是医疗设备中的基准波形模拟,传统做法往往依赖软件计算逐点输出。这种方式的弊端显而易见——…...

从网页视频到本地文件:VideoDownloadHelper插件完全指南

从网页视频到本地文件:VideoDownloadHelper插件完全指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾遇到这样的情况&…...

稀疏自编码器性能验证与工程实践

1. 稀疏自编码器性能验证的核心命题 在机器学习领域,稀疏自编码器(SAE)作为一种特殊的神经网络结构,长期以来被宣称具有优于传统方法的特征提取能力。但一个根本性问题始终存在:这种优势是算法本身的特性,还是随机初始化带来的偶然…...

八大网盘直链下载助手终极指南:告别繁琐客户端,轻松获取真实下载链接

八大网盘直链下载助手终极指南:告别繁琐客户端,轻松获取真实下载链接 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云…...

终极网盘下载加速指南:9大平台直链解析全攻略

终极网盘下载加速指南:9大平台直链解析全攻略 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / 迅…...

import_3dm:5个关键步骤解决Blender与Rhino间的数据鸿沟

import_3dm:5个关键步骤解决Blender与Rhino间的数据鸿沟 【免费下载链接】import_3dm Blender importer script for Rhinoceros 3D files 项目地址: https://gitcode.com/gh_mirrors/im/import_3dm 你是否曾经花费数小时在Rhino中精心设计的模型,…...

从RTD 4.0.0 Demo到量产:S32K3 MCAL配置中那些‘手册没细说’的细节

从RTD 4.0.0 Demo到量产:S32K3 MCAL配置中那些‘手册没细说’的细节 当工程师第一次拿到NXP官方提供的S32K3开发套件时,往往会被RTD(Real-Time Drivers)中完善的Demo工程所震撼——所有外设时钟默认开启,PLL配置保守稳…...

从数据垃圾到黄金数据集:手把手教你用rosbag filter和脚本高效清洗机器人日志

从数据垃圾到黄金数据集:工程化清洗机器人日志的进阶实践 当你的硬盘里堆满了数百GB的rosbag文件,每次打开都像在垃圾堆里翻找钥匙——这种体验机器人工程师都不陌生。真正的问题不在于数据收集,而在于如何从这些杂乱的时间序列中提取出算法…...

Spring Boot启动慢?5个优化技巧让你的应用秒启动(附实战代码)

Spring Boot启动慢?5个优化技巧让你的应用秒启动(附实战代码) 每次等待Spring Boot应用启动时,看着控制台不断刷新的日志,你是否也感到焦虑?特别是在微服务架构下,频繁的重启和部署让启动时间成…...

从四线制蜂窝模块到全球物联网连接:SparqEE Cell v1.0的极简开发实践

1. 项目缘起与核心痛点:为什么我们需要一个“简单”的蜂窝模块?做硬件开发的朋友,尤其是玩过Arduino、树莓派的,大概都经历过一个阶段:想让自己的小项目“上网”,而且是那种不受Wi-Fi范围限制、真正能随时随…...

如何构建个人技能知识库:从零到一打造结构化技术档案

1. 项目概述:一个技能库的诞生与价值 在技术领域,尤其是软件开发、运维和数据分析等岗位,我们常常面临一个困境:如何系统性地管理、展示和迭代自己的技能树?简历上的“精通Java”、“熟悉Docker”显得苍白无力&#xf…...