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

HTML应用指南:利用GET请求获取MSN 天气数据并可视化

随着数字化服务的深入发展,精准、实时的天气信息已成为人们日常生活和出行决策的重要参考。MSN天气作为广受欢迎的综合性天气服务平台,依托微软强大的技术实力,持续为用户提供全面、可靠的气象数据服务。平台不仅提供基础的温度、降水、风力等实时天气状况,还整合了未来多日天气预报、生活指数、极端天气预警等丰富信息,满足用户多样化的气象需求。

在确保数据准确性与服务稳定性的同时,MSN天气也注重信息呈现的直观性与交互体验的流畅性。其服务通过统一的数据接口(API)进行标准化输出,返回结构清晰的JSON格式数据,便于各类应用集成与二次开发。这些数据广泛应用于新闻资讯、生活服务、交通出行、农业生产等多个领域,覆盖城市中心、居民社区及各类人流密集区域,形成了广泛而便捷的数据服务网络,有效提升了气象信息的可及性与应用价值。

本文将探讨如何通过GET请求从MSN天气平台获取详细的气象数据,并展示使用Python的requests库发送HTTP请求的方法,以提取特定地理位置的天气信息。这些信息涵盖目标区域的气温、降雨量、湿度、风速等关键字段。通过解析返回的JSON数据,实现对气象信息的结构化采集。此类数据有助于分析特定区域的气候变化特征、极端天气事件的发生规律及其对社会活动的影响。通过对气象数据的整理与分析,可为后续的出行规划、活动安排、农业生产、能源调度及城市应急管理提供有力的数据支持。

MSN天气平台网站:上海市 天气趋势 | MSN 天气

首先,我们找到门店数据的存储位置,然后看3个关键部分标头、负载、 预览;

标头:通常包括URL的连接,也就是目标资源的位置;

负载:对于GET请求:负载通常包含了传递的参数,有些网页负载可能为空,或者没有负载,因为所有参数都通过URL传递,这里我们可以看到当前坐标、查询天气的开始和结束日期,还是明文,没有进行加密;

预览:指的是对响应内容的快速查看或摘要显示,可以帮助用户快速了解返回的数据结构或内容片段;

接下来就是数据获取部分,先讲一下方法思路,一共三个步骤;

方法思路

  1. 找到对应数据存储位置,获取所有天气的相关标签数据;
  2. 我们通过requests库发送HTTP请求,来遍历一定日期范围内的天气数据;
  3. 通过python脚本进行数据可视化包括气温、降雨量、湿度等;

第一步:我们直接在"Fetch/XHR"先找到对应数据存储位置,获取所有店铺列表, 我们可以看到有效的响应请求只有一个,那么直接观察结构,其中1、3、4、5、6、8...这些的编码是和温度数值是有一定对应关系的,但具体如何对应的,我们暂不知情;

那我们直接从数值观测相似性,可以发现1、3、6、8分别对应着每日最高温、历史每日最高温、每日最低温、历史每日最低温,而且数值是经过四舍五入的;

第二步:利用GET请求获取所有日期温度数据,并根据标签进行保存,另存为csv;

完整代码#运行环境 Python 3.11(气温版)

import requests
import csv# 定义请求URL
url = "https://assets.msn.cn/service/weather/weathertrends"# 请求参数
params = {"apiKey": "替换成自己当前访问的apiKey","cm": "zh-cn","locale": "zh-cn","lon": "121.52481079101562","lat": "31.08510398864746","units": "C","user": "替换成自己当前访问的user编码","ocid": "msftweather","includeWeatherTrends": "true","includeCalendar": "false","fdhead": "PRG-1SW-WXAQEPP,PRG-1SW-WXAQOFF,PRG-1SW-WXNCVF,PRG-1SW-WXTRLOG,PRG-1SW-WXOMGHDEU","weatherTrendsScenarios": "TemperatureTrend,OverviewSummary,Summary,ClimateSummary","days": "30","insights": "1","startDate": "20240101","endDate": "20241231"
}# 发送GET请求
try:response = requests.get(url, params=params)# 检查请求是否成功if response.status_code == 200:# 解析响应的JSON内容data = response.json()# 提取并整理需要的数据weather_data = []for item in data.get('value', []):for resp in item.get('responses', []):trend_chart = resp.get('trendChart', {})for date_str, values in trend_chart.items():trend_days = values.get('trendDays', {})# 提取1、3、6、8对应的值daily_high = trend_days.get('1')historical_high = trend_days.get('3')daily_low = trend_days.get('6')historical_low = trend_days.get('8')# 提取日期部分(去掉时间)date_only = date_str.split('T')[0]weather_data.append({'日期': date_only,'每日最高温': daily_high,'历史每日最高温': historical_high,'每日最低温': daily_low,'历史每日最低温': historical_low})# 保存为CSV文件csv_file = 'weather_trends.csv'with open(csv_file, mode='w', newline='', encoding='utf-8-sig') as f:writer = csv.DictWriter(f,fieldnames=['日期', '每日最高温', '历史每日最高温', '每日最低温', '历史每日最低温'])writer.writeheader()writer.writerows(weather_data)print(f"数据已成功保存到 {csv_file}")else:print(f"请求失败,状态码:{response.status_code}")print(f"响应内容:{response.text}")except requests.exceptions.RequestException as e:print(f"请求过程中发生错误:{e}")

获取数据标签如下:日期、每日最高温、历史每日最高温、每日最低温、历史每日最低温;

这里有三个tips:1、如果需要替换成其他城市,就替换成查询城市的坐标(理论上拾取的坐标在对应城市的行政区内即可)。2、需要调整查询的日期就修改查询开始和结束日期即可,日期最早可以查询到1951年。3、apiKey和user的值替换成自己当前查询页面的值,可以在负载里找到;

    "lon": "121.52481079101562",  # 查询位置lon坐标"lat": "31.08510398864746",  # 查询位置lat坐标"startDate": "20240101",  # 查询开始日期"endDate": "20241231"  # 查询结束日期

接下来,我们绘制成可视化的效果来观察气温变化情况,这里以2024年一整年(2024-01-01—2024-12-31)的上海市气温变化数据为例;

上海地区温度变化呈现出显著的季节性特征,整体趋势与历史规律基本吻合。从全年来看,气温在夏季(6月至8月)达到峰值,每日最高温一度接近40°C,而从10月开始至12月,则明显下降,最低可降至-10°C左右,表现出典型的温带气候特点。每日最高温和最低温之间的日较差较大,尤其在春秋季表现突出,温差常超过20°C,反映出过渡季节昼夜冷暖交替明显的特点。当前气温波动基本处于历史同期水平,历史每日最高温和最低温作为参考线,显示出较强的稳定性,说明近年来气候整体未出现系统性偏移

 完整代码#运行环境 Python 3.11(降雨版)

import requests
import csv# 定义请求URL
url = "https://assets.msn.cn/service/weather/weathertrends"# 请求参数
params = {"apiKey": "替换成自己当前访问的apiKey","cm": "zh-cn","locale": "zh-cn","lon": "121.52481079101562","lat": "31.08510398864746","units": "C","user": "替换成自己当前访问的user编码","ocid": "msftweather","includeWeatherTrends": "true","includeCalendar": "false","fdhead": "PRG-1SW-WXAQEPP,PRG-1SW-WXAQOFF,PRG-1SW-WXNCVF,PRG-1SW-WXTRLOG,PRG-1SW-WXOMGHDEU","weatherTrendsScenarios": "PrecipitationTrend","days": "30","insights": "1","startDate": "20240101","endDate": "20241231"
}# 发送GET请求
try:response = requests.get(url, params=params)# 检查请求是否成功if response.status_code == 200:# 解析响应的JSON内容data = response.json()# 提取并整理需要的数据precipitation_data = []for item in data.get('value', []):for resp in item.get('responses', []):trend_chart = resp.get('trendChart', {})for date_str, values in trend_chart.items():trend_days = values.get('trendDays', {})# 提取21和71对应的值,代表每日降水概率和来自历史记录的降水概率daily_precip_prob = trend_days.get('21')  # 每日降水(毫米)historical_precip_prob = trend_days.get('74')  # 降水(来自历史记录)的概率 (%)# 提取日期部分(去掉时间)date_only = date_str.split('T')[0]precipitation_data.append({'日期': date_only,'每日降水(毫米)': daily_precip_prob,'降水(来自历史记录)的概率(%)': historical_precip_prob})# 保存为CSV文件csv_file = 'precipitation_trends.csv'with open(csv_file, mode='w', newline='', encoding='utf-8-sig') as f:writer = csv.DictWriter(f, fieldnames=['日期', '每日降水(毫米)', '降水(来自历史记录)的概率(%)'])writer.writeheader()writer.writerows(precipitation_data)print(f"✅ 数据已成功保存到 {csv_file}")else:print(f"请求失败,状态码:{response.status_code}")print(f"响应内容:{response.text}")except requests.exceptions.RequestException as e:print(f"请求过程中发生错误:{e}")

获取数据标签如下:日期、每日降水(毫米)、降水(来自历史记录)的概率(%);

接下来,我们绘制成可视化的效果来观察降雨量和降雨概率的变化情况;

上海地区降雨变化呈现出显著的季节性特征,整体趋势与历史规律高度吻合。从全年来看,夏季(6月至8月)是降雨高峰期,每日降水量多次接近或超过50毫米,尤其是在梅雨季和台风影响期间,强降雨频发,导致城市排水系统面临考验;而10月开始,则明显干燥,降水量大幅减少,平均每日降水不足10毫米,空气干燥,降水稀少,体现出典型的亚热带季风气候下干湿分明的特点。春秋季作为过渡季节,降雨量波动较大,受冷暖空气交替影响,降雨在短时间内可能从微量到中雨甚至大雨不等,昼夜差异明显,增加了天气预报的复杂性。值得注意的是,当前每日降水量的波动基本处于历史同期水平,历史每日降水量曲线作为长期参考基准,表现出良好的稳定性,说明近年来上海地区的降雨变化未出现系统性偏离,整体仍维持在长期气候波动格局之中。

完整代码#运行环境 Python 3.11(湿度版)

import requests
import csv# 定义请求URL
url = "https://assets.msn.cn/service/weather/weathertrends"# 请求参数
params = {"apiKey": "替换成自己当前访问的apiKey","cm": "zh-cn","locale": "zh-cn","lon": "121.52481079101562","lat": "31.08510398864746","units": "C","user": "替换成自己当前访问的user编码","ocid": "msftweather","includeWeatherTrends": "true","includeCalendar": "false","fdhead": "PRG-1SW-WXAQEPP,PRG-1SW-WXAQOFF,PRG-1SW-WXNCVF,PRG-1SW-WXTRLOG,PRG-1SW-WXOMGHDEU","weatherTrendsScenarios": "HumidityTrend","days": "30","insights": "1","startDate": "20240101","endDate": "20241231"
}# 发送GET请求
try:response = requests.get(url, params=params)# 检查请求是否成功if response.status_code == 200:# 解析响应的JSON内容data = response.json()# 提取并整理需要的数据humidity_data = []for item in data.get('value', []):for resp in item.get('responses', []):trend_chart = resp.get('trendChart', {})for date_str, values in trend_chart.items():trend_days = values.get('trendDays', {})# 提取58和60对应的值,代表每日平均湿度和历史每日平均湿度daily_avg_humidity = trend_days.get('58')historical_avg_humidity = trend_days.get('60')# 提取日期部分(去掉时间)date_only = date_str.split('T')[0]humidity_data.append({'日期': date_only,'每日平均湿度(%)': daily_avg_humidity,'历史每日平均湿度(%)': historical_avg_humidity})# 保存为CSV文件csv_file = 'humidity_trends.csv'with open(csv_file, mode='w', newline='', encoding='utf-8-sig') as f:writer = csv.DictWriter(f, fieldnames=['日期', '每日平均湿度(%)', '历史每日平均湿度(%)'])writer.writeheader()writer.writerows(humidity_data)print(f"数据已成功保存到 {csv_file}")else:print(f"请求失败,状态码:{response.status_code}")print(f"响应内容:{response.text}")except requests.exceptions.RequestException as e:print(f"请求过程中发生错误:{e}")

获取数据标签如下:日期、每日平均湿度(%)、历史每日平均湿度(%);

接下来,我们绘制成可视化的效果来观察湿度变化情况;

上海地区湿度变化具有显著季节性,整体趋势与历史规律高度一致。夏季(6月至8月),每日平均湿度(红线)常接近或超过90%,尤其在梅雨季和台风影响下,空气潮湿闷热;而冬季(12月开始),湿度明显下降,最低可至60%左右,气候干燥。春秋季为过渡期,湿度波动较大,昼夜温差明显,受冷暖空气交替影响,湿度变化频繁。当前湿度水平与历史同期基本吻合,历史平均湿度(蓝线)表现出良好稳定性,表明近年来未出现系统性偏移。通过对比红线与蓝线可知,上海湿度变化仍处于长期气候波动范围内,这对城市运行、居民生活及农业生产具有重要参考价值。

完整代码#运行环境 Python 3.11(风速版)

import requests
import csv# 定义请求URL
url = "https://assets.msn.cn/service/weather/weathertrends"# 请求参数
params = {"apiKey": "替换成自己当前访问的apiKey","cm": "zh-cn","locale": "zh-cn","lon": "121.52481079101562","lat": "31.08510398864746","units": "C","user": "替换成自己当前访问的user编码","ocid": "msftweather","includeWeatherTrends": "true","includeCalendar": "false","fdhead": "PRG-1SW-WXAQEPP,PRG-1SW-WXAQOFF,PRG-1SW-WXNCVF,PRG-1SW-WXTRLOG,PRG-1SW-WXOMGHDEU","weatherTrendsScenarios": "WindTrend","days": "30","insights": "1","startDate": "20240101","endDate": "20241231"
}# 发送GET请求
try:response = requests.get(url, params=params)# 检查请求是否成功if response.status_code == 200:# 解析响应的JSON内容data = response.json()# 提取并整理需要的数据wind_data = []for item in data.get('value', []):for resp in item.get('responses', []):trend_chart = resp.get('trendChart', {})for date_str, values in trend_chart.items():trend_days = values.get('trendDays', {})# 提取41和43对应的值,代表每日平均风速和历史每日平均风速(单位:公里/小时)daily_avg_wind_speed = trend_days.get('41')  # 每日平均值 (公里/小时)historical_avg_wind_speed = trend_days.get('43')  # 历史每日平均值 (公里/小时)# 提取日期部分(去掉时间)date_only = date_str.split('T')[0]wind_data.append({'日期': date_only,'每日平均风速(公里/小时)': daily_avg_wind_speed,'历史每日平均风速(公里/小时)': historical_avg_wind_speed})# 保存为CSV文件csv_file = 'wind_trends.csv'with open(csv_file, mode='w', newline='', encoding='utf-8-sig') as f:writer = csv.DictWriter(f, fieldnames=['日期', '每日平均风速(公里/小时)', '历史每日平均风速(公里/小时)'])writer.writeheader()writer.writerows(wind_data)print(f"数据已成功保存到 {csv_file}")else:print(f"请求失败,状态码:{response.status_code}")print(f"响应内容:{response.text}")except requests.exceptions.RequestException as e:print(f"请求过程中发生错误:{e}")

获取数据标签如下:日期、每日平均风速(公里/小时)、历史每日平均风速(公里/小时);

接下来,我们绘制成可视化的效果来观察风速的变化情况;

上海地区风速变化显著,整体趋势与历史规律高度一致。全年来看,红线代表的每日平均风速在夏季(6月至8月)偶尔出现强风天气,风速可达25公里/小时以上;而冬季(12月开始)风速较低,通常维持在10公里/小时左右,气候稳定。春秋季过渡季节,风速波动频繁,受冷暖空气交替影响明显,当前每日平均风速与历史同期水平基本吻合,蓝线所示的历史平均风速显示出良好的稳定性,表明近年来风速模式未发生系统性偏移,仍处于长期气候波动范围内。

文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。

http://www.xdnf.cn/news/1366111.html

相关文章:

  • [系统架构设计师]应用数学(二十一)
  • list容器的使用
  • GNN:用MPNN(消息传递神经网络)落地最短路径问题模型训练全流程
  • 用 GSAP + ScrollTrigger 打造沉浸式视频滚动动画
  • 【Day 33】Linux-Mysql日志
  • DDR3入门系列(二)------DDR3硬件电路及Xilinx MIG IP核介绍
  • linux 正则表达式学习
  • 使用 gemini 来分析 github 项目
  • 安卓11 12系统修改定制化_____修改固件 默认给指定内置应用系统级权限
  • 大模型的思考方式
  • Java全栈开发实战:从Spring Boot到Vue3的项目实践
  • ZKmall开源商城多端兼容实践:鸿蒙、iOS、安卓全平台适配的技术路径
  • 8.25作业
  • [MH22D3开发笔记]2. SPI,QSPI速度究竟能跑多快,双屏系统的理想选择
  • Linux笔记9——shell编程基础-3
  • Tesseract OCR之页面布局分析
  • Linux系统的网络管理(一)
  • c# 读取xml文件内的数据
  • 网络编程-HTTP
  • zookeeper-znode解析
  • 【动态规划】309. 买卖股票的最佳时机含冷冻期及动态规划模板
  • 深入浅出 ArrayList:从基础用法到底层原理的全面解析(中)
  • 【C语言16天强化训练】从基础入门到进阶:Day 11
  • 信号处理的核心机制:从保存、处理到可重入性与volatile
  • 系统架构设计师-计算机系统存储管理的模拟题
  • 【数据结构】栈和队列——队列
  • AR远程协助:能源电力行业智能化革新
  • 数据库迁移幂等性介绍(Idempotence)(Flyway、Liquibase)ALTER、ON DUPLICATE
  • 05 开发环境和远程仓库Gitlab准备
  • coze工作流200+源码,涵盖AI文案生成、图像处理、视频生成、自动化脚本等多个领域