HTML应用指南:利用GET请求获取MSN 天气数据并可视化
随着数字化服务的深入发展,精准、实时的天气信息已成为人们日常生活和出行决策的重要参考。MSN天气作为广受欢迎的综合性天气服务平台,依托微软强大的技术实力,持续为用户提供全面、可靠的气象数据服务。平台不仅提供基础的温度、降水、风力等实时天气状况,还整合了未来多日天气预报、生活指数、极端天气预警等丰富信息,满足用户多样化的气象需求。
在确保数据准确性与服务稳定性的同时,MSN天气也注重信息呈现的直观性与交互体验的流畅性。其服务通过统一的数据接口(API)进行标准化输出,返回结构清晰的JSON格式数据,便于各类应用集成与二次开发。这些数据广泛应用于新闻资讯、生活服务、交通出行、农业生产等多个领域,覆盖城市中心、居民社区及各类人流密集区域,形成了广泛而便捷的数据服务网络,有效提升了气象信息的可及性与应用价值。
本文将探讨如何通过GET请求从MSN天气平台获取详细的气象数据,并展示使用Python的requests库发送HTTP请求的方法,以提取特定地理位置的天气信息。这些信息涵盖目标区域的气温、降雨量、湿度、风速等关键字段。通过解析返回的JSON数据,实现对气象信息的结构化采集。此类数据有助于分析特定区域的气候变化特征、极端天气事件的发生规律及其对社会活动的影响。通过对气象数据的整理与分析,可为后续的出行规划、活动安排、农业生产、能源调度及城市应急管理提供有力的数据支持。
MSN天气平台网站:上海市 天气趋势 | MSN 天气
首先,我们找到门店数据的存储位置,然后看3个关键部分标头、负载、 预览;
标头:通常包括URL的连接,也就是目标资源的位置;
负载:对于GET请求:负载通常包含了传递的参数,有些网页负载可能为空,或者没有负载,因为所有参数都通过URL传递,这里我们可以看到当前坐标、查询天气的开始和结束日期,还是明文,没有进行加密;
预览:指的是对响应内容的快速查看或摘要显示,可以帮助用户快速了解返回的数据结构或内容片段;
接下来就是数据获取部分,先讲一下方法思路,一共三个步骤;
方法思路
- 找到对应数据存储位置,获取所有天气的相关标签数据;
- 我们通过requests库发送HTTP请求,来遍历一定日期范围内的天气数据;
- 通过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公里/小时左右,气候稳定。春秋季过渡季节,风速波动频繁,受冷暖空气交替影响明显,当前每日平均风速与历史同期水平基本吻合,蓝线所示的历史平均风速显示出良好的稳定性,表明近年来风速模式未发生系统性偏移,仍处于长期气候波动范围内。
文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。