在自然灾害监测与预警领域,台风作为一种极具破坏力的自然现象,其路径预测和强度评估对于减少潜在损失至关重要。随着互联网技术的发展,国家气象中心等专业机构提供了详尽的台风历史数据和实时跟踪服务,通过网络接口可便捷地访问这些信息。
最近江浙沪地区,“贝碧嘉”和“普拉桑”台风接连登陆,门窗紧闭的情况下屋内一度都渗进雨水了。故想看下怎么实现从气象中心等专业机构采集台风路径数据。参考github项目(项目地址https://github.com/SQYQianYe/scraping-cma-typhoon-data)并对代码进行简单整理。
代码主要利用Python编程语言和相关库(如requests, json, re, datetime, 和 pandas)从中国国家气象中心(NMC)获取台风数据,并对其进行解析、处理和存储。
代码实现
导入相关库
# -*- coding: UTF-8 -*-
# 导入相关库
import requests
import json
import re
import time
import pandas as pd
import datetime
获取特定台风的详细信息
定义函数获取特定台风的详细信息:
# 定义函数获取特定台风的详细信息
def get_tc_info(item):# 创建13位时间戳t = int(round(time.time() * 1000))# 构建URL并发送GET请求url = 'http://typhoon.nmc.cn/weatherservice/typhoon/jsons/view_%s?t=%s&callback=typhoon_jsons_view_%s' % (item['id'], t, item['id'])html_obj = requests.get(url, headers=headers, verify=False).text# 提取JSON数据data = json.loads(re.match(".*?({.*}).*", html_obj, re.S).group(1))['typhoon']# 创建字典存储台风信息info_dicts = { 'tc_num':item['tc_num'], # 台风编号'name_cn':item['name_cn'], # 中文名称'name_en':item['name_en'], # 英文名称'dateUTC':[], # UTC日期'dateCST':[], # CST日期'vmax':[], # 最大风速 m/s'grade':[], # 强度等级'lat':[], # 纬度'lon':[], # 经度'mslp':[], # 中心气压 hPa'attr':[] # 属性:预报或分析}# 遍历分析数据for v in data[8]:info_dicts['dateUTC'].append(v[1])info_dicts['dateCST'].append(date_pred(v[1], 8)) # 将UTC时间转换为CST时间info_dicts['vmax'].append(v[7])info_dicts['grade'].append(get_type(v[3]))info_dicts['lon'].append(v[4])info_dicts['lat'].append(v[5])info_dicts['mslp'].append(v[6])info_dicts['attr'].append('analysis')# 获取最新预报时间dateUTC0 = info_dicts['dateUTC'][-1]# 处理最新预报if len(data[8][-1]) > 11 and data[8][-1][11] is not None and 'BABJ' in data[8][-1][11]:BABJ_list = data[8][-1][11]['BABJ']for i in range(len(BABJ_list)):# 获取预报前置时间(小时)pred_hour = int(BABJ_list[i][0])# 预测UTC时间dateUTC_pred = date_pred(dateUTC0, pred_hour)info_dicts['dateUTC'].append(dateUTC_pred)info_dicts['dateCST'].append(date_pred(dateUTC_pred, 8))info_dicts['vmax'].append(BABJ_list[i][5])info_dicts['grade'].append(get_type(BABJ_list[i][7]))info_dicts['lon'].append(BABJ_list[i][2])info_dicts['lat'].append(BABJ_list[i][3])info_dicts['mslp'].append(BABJ_list[i][4])info_dicts['attr'].append('forecast')# 将字典转换为DataFrametc_info = pd.DataFrame(info_dicts)# 返回DataFramereturn tc_info
主函数
# 主程序入口
if __name__ == "__main__":# 设置请求头(重复,应避免)headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}# 输入年份year = input("请输入年份: ")# 显示该年份的台风编号和名称show_tc_nums_and_names_by_year(year)# 输入台风TC编号(四位数字)num = input("请输入台风TC编号(TC后面四位数字): ")# 获取台风信息data = get_tc_info_by_year_and_num(year, num)# 如果数据存在,则打印并保存到CSV和Excel文件if data is not None:print(data)# 可以按需保存为xlsxdata.to_csv(rf'{year}_TC{num}.csv', index=False)print(f"台风{num}的数据已保存到文件{year}_TC{num}.csv")# 如果未找到数据,则打印提示else:print(f"在{year}年未找到台风{num}的数据。")
结果展示
台风“贝碧嘉”路径
如下,以贝碧嘉为例,输入年份与台风编码后4位,可以获取相应台风路径数据。由于篇幅有限,只展示了部分代码,完整代码可以回复关键词获取或者参考原项目。
推荐阅读
- 【可视化】用pyecharts绘制我国人口分布
- 【爬虫】软科2024中国大学榜爬取
- 【可视化】绘制中国标准行政区划地图(2024版)
欢迎关注我的公众号“AI拾贝”,原创技术文章第一时间推送。后台发送typhoon,自动回复源码和数据。