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

别再到处找天气预报接口了!这个免费API(JSON格式)我用Python爬虫实测可用

用Python玩转免费天气API从接口调用到数据可视化的完整指南最近在开发个人天气小程序时我几乎翻遍了全网所有的免费天气接口要么限制调用次数要么返回数据格式混乱直到发现这个稳定可靠的JSON格式API。它不仅完全免费而且响应速度快数据结构清晰特别适合个人开发者和小型项目使用。本文将带你从零开始用Python实现完整的天气数据获取、解析和应用流程。1. 环境准备与接口初探在开始之前确保你的开发环境已经安装了Python 3.6版本和requests库。如果没有安装requests可以通过以下命令快速安装pip install requests这个天气API的基本调用格式非常简单只需要在URL末尾加上城市代码即可。例如获取北京天气数据的接口地址是http://t.weather.itboy.net/api/weather/city/101010100其中101010100就是北京的城市代码。我们先来写一个最简单的请求函数测试一下接口import requests def get_weather(city_code): url fhttp://t.weather.itboy.net/api/weather/city/{city_code} response requests.get(url) return response.json() # 测试获取北京天气 beijing_weather get_weather(101010100) print(beijing_weather)运行这段代码你应该能看到返回的JSON数据包含了丰富的天气信息从实时温度到未来几天预报一应俱全。2. 深入解析API返回数据结构理解返回数据的结构对于后续处理至关重要。让我们仔细看看这个API返回的主要字段cityInfo: 包含城市基本信息如城市名称、ID等data: 核心天气数据shidu: 湿度百分比pm25: PM2.5数值wendu: 当前温度(摄氏度)forecast: 未来15天预报列表date: 日期high/low: 最高/最低温度type: 天气类型(晴、雨等)fx/fengli: 风向/风力下面是一个典型返回数据的简化示例{ cityInfo: { city: 北京市, cityId: 101010100 }, data: { shidu: 32%, pm25: 35, wendu: 26, forecast: [ { date: 2023-07-20, high: 高温 30℃, low: 低温 22℃, type: 晴, fengxiang: 南风, fengli: 3级 } ] } }3. 构建健壮的天气查询工具基础的请求功能实现后我们需要考虑实际应用中的各种异常情况。以下是几个常见的处理点网络请求超时添加合理的超时设置城市代码不存在处理404或其他错误响应API限流添加适当的重试机制数据解析错误验证JSON格式和关键字段改进后的完整代码如下import requests import time from typing import Dict, Optional class WeatherAPI: def __init__(self, max_retries3, timeout5): self.base_url http://t.weather.itboy.net/api/weather/city/ self.max_retries max_retries self.timeout timeout def get_weather(self, city_code: str) - Optional[Dict]: url f{self.base_url}{city_code} for attempt in range(self.max_retries): try: response requests.get(url, timeoutself.timeout) response.raise_for_status() data response.json() # 验证必要字段是否存在 if not all(key in data for key in [cityInfo, data]): raise ValueError(Invalid API response structure) return data except requests.exceptions.RequestException as e: print(fAttempt {attempt 1} failed: {str(e)}) if attempt self.max_retries - 1: return None time.sleep(1) # 简单的退避策略 return None # 使用示例 weather_api WeatherAPI() result weather_api.get_weather(101010100) if result: print(f当前温度: {result[data][wendu]}℃) else: print(获取天气信息失败)4. 城市代码管理与自动补全手动查找和输入城市代码很不方便我们可以构建一个本地城市代码数据库。原始数据中的城市代码是JSON格式我们可以将其保存为本地文件import json # 保存城市代码到本地 city_codes { 城市代码: [ { 省: 北京, 市: [ {市名: 北京, 编码: 101010100}, # 其他城市... ] } # 其他省份... ] } with open(city_codes.json, w, encodingutf-8) as f: json.dump(city_codes, f, ensure_asciiFalse, indent2)然后创建一个城市代码查询工具class CityCodeFinder: def __init__(self, data_filecity_codes.json): with open(data_file, encodingutf-8) as f: self.city_data json.load(f)[城市代码] def find_code(self, city_name: str) - Optional[str]: for province in self.city_data: for city in province[市]: if city[市名] city_name: return city[编码] return None def search(self, keyword: str) - List[Dict]: results [] for province in self.city_data: for city in province[市]: if keyword in city[市名]: results.append({ province: province[省], city: city[市名], code: city[编码] }) return results # 使用示例 finder CityCodeFinder() print(finder.find_code(北京)) # 输出: 101010100 print(finder.search(海)) # 搜索包含海字的城市5. 数据可视化与实用功能扩展获取到天气数据后我们可以进行各种有趣的可视化和实用功能开发。以下是几个可能的扩展方向5.1 温度趋势图表使用matplotlib绘制未来几天温度变化曲线import matplotlib.pyplot as plt from datetime import datetime def plot_temperature_forecast(weather_data): dates [] highs [] lows [] for day in weather_data[data][forecast][:7]: # 取未来7天数据 dates.append(day[date]) highs.append(int(day[high].split( )[1].replace(℃, ))) lows.append(int(day[low].split( )[1].replace(℃, ))) plt.figure(figsize(10, 6)) plt.plot(dates, highs, label最高温度, markero) plt.plot(dates, lows, label最低温度, markero) plt.fill_between(dates, highs, lows, alpha0.1) plt.title(f{weather_data[cityInfo][city]}未来7天温度预报) plt.xlabel(日期) plt.ylabel(温度(℃)) plt.legend() plt.grid(True) plt.xticks(rotation45) plt.tight_layout() plt.show() # 使用示例 weather_data weather_api.get_weather(101010100) if weather_data: plot_temperature_forecast(weather_data)5.2 天气预警通知我们可以编写一个简单的天气预警系统当出现极端天气时发送通知def check_weather_alert(weather_data): alerts [] today weather_data[data][forecast][0] # 检查高温预警 high_temp int(today[high].split( )[1].replace(℃, )) if high_temp 35: alerts.append(f高温预警: 今日最高温度{high_temp}℃) # 检查降雨 if 雨 in today[type]: alerts.append(f降雨预警: 今日天气{today[type]}) # 检查大风 if 风 in today[type] or any(x in today[fengli] for x in [4级, 5级]): alerts.append(f大风预警: {today[fengxiang]}{today[fengli]}) return alerts # 使用示例 alerts check_weather_alert(weather_data) if alerts: print(天气预警:) for alert in alerts: print(f- {alert})5.3 将天气数据存入数据库对于需要历史天气数据的应用我们可以将获取的数据保存到SQLite数据库import sqlite3 from contextlib import contextmanager contextmanager def weather_db_connection(db_fileweather.db): conn sqlite3.connect(db_file) try: yield conn finally: conn.close() def init_weather_db(): with weather_db_connection() as conn: conn.execute( CREATE TABLE IF NOT EXISTS weather_records ( id INTEGER PRIMARY KEY AUTOINCREMENT, city_code TEXT NOT NULL, city_name TEXT NOT NULL, temperature INTEGER, humidity TEXT, pm25 INTEGER, weather_type TEXT, record_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ) def save_weather_record(weather_data): if not weather_data: return record { city_code: weather_data[cityInfo][cityId], city_name: weather_data[cityInfo][city], temperature: weather_data[data][wendu], humidity: weather_data[data][shidu], pm25: weather_data[data][pm25], weather_type: weather_data[data][forecast][0][type] } with weather_db_connection() as conn: conn.execute( INSERT INTO weather_records (city_code, city_name, temperature, humidity, pm25, weather_type) VALUES (:city_code, :city_name, :temperature, :humidity, :pm25, :weather_type) , record) # 使用示例 init_weather_db() save_weather_record(weather_data)6. 构建完整的天气查询命令行工具将上述功能整合我们可以创建一个功能完善的命令行天气查询工具import argparse def main(): parser argparse.ArgumentParser(description命令行天气查询工具) subparsers parser.add_subparsers(destcommand, requiredTrue) # 查询天气命令 query_parser subparsers.add_parser(query, help查询城市天气) query_parser.add_argument(city, help城市名称) # 搜索城市命令 search_parser subparsers.add_parser(search, help搜索城市代码) search_parser.add_argument(keyword, help搜索关键词) args parser.parse_args() finder CityCodeFinder() api WeatherAPI() if args.command query: city_code finder.find_code(args.city) if not city_code: print(f找不到城市: {args.city}) return weather api.get_weather(city_code) if weather: print(f\n{weather[cityInfo][city]}天气情况:) print(f当前温度: {weather[data][wendu]}℃) print(f湿度: {weather[data][shidu]}) print(fPM2.5: {weather[data][pm25]}) print(\n今日预报:) today weather[data][forecast][0] print(f{today[date]} {today[type]}) print(f温度: {today[low]} ~ {today[high]}) print(f风向: {today[fengxiang]} {today[fengli]}) elif args.command search: results finder.search(args.keyword) if results: print(\n搜索结果:) for city in results: print(f{city[province]} {city[city]}: {city[code]}) else: print(没有找到匹配的城市) if __name__ __main__: main()使用示例python weather_tool.py query 北京 python weather_tool.py search 海7. 性能优化与最佳实践在实际项目中我们还需要考虑一些性能优化和最佳实践缓存机制天气数据不需要实时更新可以添加缓存减少API调用异步请求使用aiohttp实现异步请求提高效率配置管理将API地址、超时设置等提取到配置文件中日志记录添加详细的日志记录方便调试单元测试编写测试用例确保核心功能稳定缓存实现示例from functools import lru_cache import time class CachedWeatherAPI(WeatherAPI): lru_cache(maxsize100) def get_weather(self, city_code: str, expiry3600) - Optional[Dict]: # 简单实现缓存1小时 return super().get_weather(city_code) # 使用示例 cached_api CachedWeatherAPI() # 第一次调用会请求API weather1 cached_api.get_weather(101010100) # 第二次调用会直接返回缓存结果 weather2 cached_api.get_weather(101010100)异步请求示例import aiohttp import asyncio class AsyncWeatherAPI: def __init__(self, max_retries3, timeout5): self.base_url http://t.weather.itboy.net/api/weather/city/ self.max_retries max_retries self.timeout aiohttp.ClientTimeout(totaltimeout) async def get_weather(self, city_code: str) - Optional[Dict]: url f{self.base_url}{city_code} async with aiohttp.ClientSession(timeoutself.timeout) as session: for attempt in range(self.max_retries): try: async with session.get(url) as response: response.raise_for_status() data await response.json() if not all(key in data for key in [cityInfo, data]): raise ValueError(Invalid API response structure) return data except Exception as e: print(fAttempt {attempt 1} failed: {str(e)}) if attempt self.max_retries - 1: return None await asyncio.sleep(1) return None # 使用示例 async def main(): api AsyncWeatherAPI() weather await api.get_weather(101010100) print(weather) asyncio.run(main())通过本文介绍的方法你可以轻松地将这个免费天气API集成到你的各种项目中无论是开发微信小程序、个人网站还是制作自动化天气通知脚本。这个API的稳定性和数据完整性在实际使用中表现相当出色完全能够满足个人开发者和小型项目的需求。

相关文章:

别再到处找天气预报接口了!这个免费API(JSON格式)我用Python爬虫实测可用

用Python玩转免费天气API:从接口调用到数据可视化的完整指南 最近在开发个人天气小程序时,我几乎翻遍了全网所有的免费天气接口,要么限制调用次数,要么返回数据格式混乱,直到发现这个稳定可靠的JSON格式API。它不仅完全…...

3步快速上手:免费游戏资源编辑器完全指南

3步快速上手:免费游戏资源编辑器完全指南 【免费下载链接】ExtractorSharp Game Resources Editor 项目地址: https://gitcode.com/gh_mirrors/ex/ExtractorSharp 你是否曾经为修改游戏资源文件而烦恼?面对复杂的NPK、IMG格式束手无策&#xff1f…...

告别黑屏!Ubuntu 22.04 LTS远程桌面XRDP连接后花屏的3种排查思路与终极配置

Ubuntu 22.04 LTS远程桌面XRDP花屏问题深度排查与解决方案 远程桌面连接是现代IT环境中不可或缺的功能,尤其对于Linux服务器管理员和开发者而言。Ubuntu 22.04 LTS作为长期支持版本,其稳定性备受推崇,但在使用XRDP进行远程连接时,…...

如何在5分钟内用roop-unleashed制作专业级AI换脸视频:零基础完整教程

如何在5分钟内用roop-unleashed制作专业级AI换脸视频:零基础完整教程 【免费下载链接】roop-unleashed Evolved Fork of roop with Web Server and lots of additions 项目地址: https://gitcode.com/gh_mirrors/ro/roop-unleashed 你是否曾经想制作惊艳的AI…...

观察Taotoken在多模型轮询调用下的延迟与稳定性表现

观察Taotoken在多模型轮询调用下的延迟与稳定性表现 1. 测试环境与任务设计 我们设计了一个Java后台服务,通过Taotoken平台以轮询方式调用多个大模型供应商的API。该服务使用标准的OpenAI兼容HTTP接口,基础URL配置为https://taotoken.net/api&#xff…...

Openpose预处理器参数传递故障:从缺失参数到稳健加载的技术解决方案

Openpose预处理器参数传递故障:从缺失参数到稳健加载的技术解决方案 【免费下载链接】comfyui_controlnet_aux ComfyUIs ControlNet Auxiliary Preprocessors 项目地址: https://gitcode.com/gh_mirrors/co/comfyui_controlnet_aux 在ComfyUI ControlNet Aux…...

终极指南:如何用BepInEx构建专业的游戏插件框架生态系统

终极指南:如何用BepInEx构建专业的游戏插件框架生态系统 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是一个功能强大的Unity Mono、IL2CPP和.NET框架游戏插件…...

为什么 Rust 没有空指针?

文章目录为什么 Rust 没有空指针?空指针的问题Rust 的选择设计哲学:把不可靠性转化为显式设计总结为什么 Rust 没有空指针? 在许多编程语言中,默认都是有空指针(null pointer)类型的,而 Rust 参…...

LSF 10.1安装后必做的几件事:配置开机自启、验证集群状态与日常管理命令

LSF 10.1安装后必做的几件事:配置开机自启、验证集群状态与日常管理命令 当你终于完成了LSF集群的基础安装,看着屏幕上滚动的安装日志停在"Installation completed successfully"时,那种成就感可能很快会被新的困惑取代——"接…...

别再手写if-else了!用Gin+validator搞定API参数校验,保姆级配置教程

告别if-else炼狱:用Ginvalidator实现声明式参数校验 每次看到满屏的if-else参数校验代码,就像看到厨房里堆满的脏碗碟——明明知道必须处理,却又提不起兴致。作为Go开发者,我们经常陷入这样的困境:一个简单的用户注册接…...

别再被libarchive.so.19卡住了!手把手教你用conda update搞定conda-libmamba-solver报错

彻底解决conda-libmamba-solver报错:从原理到实践的完整指南 当你在终端看到Error while loading conda entry point: conda-libmamba-solver (libarchive.so.19: cannot open shared object file)这样的错误时,是否感到既熟悉又无奈?这个看似…...

【2026年最新600套毕设项目分享】基于微信小程序的汽车销售系统(30225)

有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告/任务书)远程调试控屏包运行一键启动项目&…...

集成cursor高效工作流,用快马一键生成效率提升工具库

作为一名长期与代码打交道的开发者,我一直在寻找能提升日常工作效率的工具。最近尝试将Cursor的智能编码能力与InsCode(快马)平台结合,搭建了一个开箱即用的效率工具库,分享下具体实现思路和使用体验。 项目核心设计 代码片段管理器采用自然语…...

实战集成:将visio流程图变为可交互看板,快马ai生成项目管理系统

今天想和大家分享一个很实用的开发经验:如何把静态的Visio流程图变成可交互的项目管理看板。这个需求其实来源于我们团队的实际痛点——每次开会都要反复打开Visio文件查看流程,特别不方便。 需求分析 首先明确核心功能:需要一个三列看板&…...

避坑指南:CloudCompare点云切片时,轮廓提取模糊、切片错位怎么办?

CloudCompare点云切片实战:精准轮廓提取与错位修复全攻略 当你在深夜对着屏幕上的点云数据皱眉,发现精心提取的轮廓线像醉酒般歪歪扭扭,或是切片位置莫名其妙地偏离目标区域时,那种挫败感我深有体会。作为处理过上千个点云项目的工…...

从零构建知识图谱:基于Neo4j与NLP的个人知识库增强实践

1. 项目概述:当知识图谱遇上个人知识库最近在整理个人笔记和项目文档时,我常常感到一种无力感。手头积累了大量的Markdown文件、代码片段、论文摘要和零散的想法,它们散落在不同的文件夹和笔记软件里。当我想找某个概念的具体实现&#xff0c…...

3个颠覆性应用场景:AVIF插件如何重塑Photoshop图像工作流

3个颠覆性应用场景:AVIF插件如何重塑Photoshop图像工作流 【免费下载链接】avif-format An AV1 Image (AVIF) file format plug-in for Adobe Photoshop 项目地址: https://gitcode.com/gh_mirrors/avi/avif-format 当你面对数百张高分辨率产品图需要上传到电…...

基于安卓的智能穿戴设备数据同步平台毕业设计

博主介绍:✌ 专注于Java,python,✌关注✌私信我✌具体的问题,我会尽力帮助你。一、研究目的本研究旨在设计并实现一种基于安卓操作系统的智能穿戴设备数据同步平台以解决当前智能穿戴生态系统中存在的数据孤岛现象与跨设备协同效率低下问题。随着可穿戴技…...

告别CentOS后,我为什么选择Rocky Linux 9.3作为我的主力开发环境?

告别CentOS后,我为什么选择Rocky Linux 9.3作为我的主力开发环境? 当CentOS官方宣布将重心转向Stream版本时,整个开源社区仿佛经历了一场小型地震。作为长期依赖CentOS稳定性的开发者,我不得不重新评估手头十几个项目的运行环境。…...

实战指南:基于快马平台为微服务集群构建openclaw滚动更新方案

实战指南:基于快马平台为微服务集群构建openclaw滚动更新方案 在微服务架构下,服务更新是个技术活。最近我们团队用InsCode(快马)平台搭建了一套openclaw滚动更新方案,特别适合处理多节点、有依赖关系的微服务集群。下面分享下我们的实战经验…...

Notepad++ 6.6.9安装步骤详解(附Notepad++离线安装教程)

在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...

Taotoken 的用量看板让模型调用开销一目了然

Taotoken 的用量看板让模型调用开销一目了然 1. 多维度用量观测能力 Taotoken 平台为每个账户提供了实时更新的用量看板,支持从项目、模型、API Key 三个维度进行数据筛选与聚合。在控制台的「用量分析」页面,管理者可以直观看到选定时间范围内各项目的…...

终极解决方案:Windows一键安装苹果USB网络共享驱动指南

终极解决方案:Windows一键安装苹果USB网络共享驱动指南 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/gh_mi…...

硬件性能突破:AMD Ryzen调试工具如何实现85%系统稳定性提升

硬件性能突破:AMD Ryzen调试工具如何实现85%系统稳定性提升 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https…...

Python 实时监控 A 股行情并自动筛选强势股(REST + WebSocket 两种方案)

Python 实时监控 A 股行情并自动筛选强势股(REST WebSocket 两种方案) 盘中实时监控全市场行情,自动筛选涨停、放量上涨、突破均线的股票 – 这是很多量化交易者的刚需。本文用 Python 实现两种方案:REST 轮询方案(简…...

XCOM 2模组管理器终极指南:5步掌握AML启动器使用技巧

XCOM 2模组管理器终极指南:5步掌握AML启动器使用技巧 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc…...

R 4.5正式版发布72小时内首发:基因组CNV检出准确率提升37.2%的5个关键配置(附Benchmark原始代码)

更多请点击: https://intelliparadigm.com 第一章:R 4.5正式版发布核心特性与CNV分析范式演进 R 4.5.0(2025年4月发布)标志着统计计算生态在基因组结构变异研究中的关键跃迁。该版本原生强化了大矩阵稀疏存储支持、并行化内存管理…...

为Windows 11瘦身:tiny11builder打造你的专属精简系统

为Windows 11瘦身:tiny11builder打造你的专属精简系统 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 你是否曾为Windows 11的臃肿而烦恼?…...

如何快速掌握Blender插件:PSK/PSA格式高效工作流的完整指南

如何快速掌握Blender插件:PSK/PSA格式高效工作流的完整指南 【免费下载链接】io_scene_psk_psa A Blender extension for importing and exporting Unreal PSK and PSA files 项目地址: https://gitcode.com/gh_mirrors/io/io_scene_psk_psa 你是否正在为Ble…...

TPFanCtrl2终极指南:如何在Windows上完美控制ThinkPad风扇噪音与散热

TPFanCtrl2终极指南:如何在Windows上完美控制ThinkPad风扇噪音与散热 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 你是否曾被ThinkPad风扇的噪音困扰&am…...