台风数据采集全攻略:从数据源到实操落地
台风数据采集是很多项目的基础——不管是做台风路径可视化、灾害预警系统,还是气象数据分析,都离不开精准、高效的台风数据支撑。最近刚好做了相关需求,整理了一套完整的台风数据采集方案,涵盖权威数据源、实操方法,话不多说,直接上干货!
在开始采集前,先理清核心需求,避免做无用功。台风数据的核心维度主要分为3类,覆盖从实时监测到历史回溯的全场景:
- 基础信息:台风名称(中文名+英文名)、编号、生成时间、生成海域、强度等级(热带低压、热带风暴、强热带风暴等);
- 动态数据:实时位置(经纬度)、移动方向、移动速度、中心气压、最大风速、风圈半径;
- 延伸数据:历史路径、未来预报路径(多时段预测)、影响区域、卫星云图关联数据。
根据需求选择采集维度,比如做实时预警,重点抓动态数据;做历史分析,重点采集历史路径和基础信息。
数据的准确性是核心,优先选择官方机构或权威平台的数据源,避免使用非正规渠道的数据(易出错、易失效)。整理了5个常用且免费的数据源,各有侧重,按需选择:
中国气象局(最权威,国内台风首选)
中国气象局是国内台风监测的核心机构,不仅提供实时台风数据,还有完整的历史数据归档,同时涵盖多源观测设备(风云卫星、天气雷达、北斗探空等)的协同观测数据,数据可信度拉满。
- 核心数据:实时台风动态、历史路径、强度变化、卫星云图、雷达观测数据;
- 获取方式:① 网页爬取(中央气象台台风网:http://typhoon.nmc.cn/web.html);② 官方API(需申请密钥,适合批量采集);
- 优势:数据全面、更新及时(每1-3小时更新一次),覆盖西北太平洋及南海区域台风;
爬取中央气象台台风网(无API限制,适合批量采集)
中央气象台台风网没有公开API,但网页数据结构清晰,可通过爬虫解析获取实时台风和历史路径数据,适合需要大量数据且不想受API调用限制的场景。
代码示例(爬取当前台风列表及实时信息):
import requests
import re
import json
import pandas as pd
import time
# 1. 配置请求头(模拟浏览器,避免被反爬)
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
}
# 2. 获取当前台风列表
def get_current_typhoon_list():
t = int(round(time.time() * 1000)) # 13位时间戳(网页动态加载需要)
url = f"http://typhoon.nmc.cn/weatherservice/typhoon/jsons/list_default?t={t}&callback=typhoon_jsons_list_default"
response = requests.get(url, headers=headers, verify=False)
# 解析JSON数据(处理网页回调格式)
data_str = re.match(".*?({.*}).*", response.text, re.S).group(1)
data = json.loads(data_str)
typhoon_list = data["typhoonList"]
# 筛选当前活跃的台风(state为start)
active_typhoon = []
for typhoon in typhoon_list:
if typhoon[7] == "start": # state字段,start表示活跃,stop表示结束
item = {
"台风ID": typhoon[0],
"英文名": typhoon[1],
"中文名": typhoon[2],
"编号": typhoon[4],
"名字含义": typhoon[6]
}
active_typhoon.append(item)
return active_typhoon
# 3. 获取单个台风的实时动态和路径数据
def get_typhoon_detail(typhoon_id):
t = int(round(time.time() * 1000))
url = f"http://typhoon.nmc.cn/weatherservice/typhoon/jsons/view_{typhoon_id}?t={t}&callback=typhoon_jsons_view_{typhoon_id}"
response = requests.get(url, headers=headers, verify=False)
data_str = re.match(".*?({.*}).*", response.text, re.S).group(1)
data = json.loads(data_str)
typhoon_data = data["typhoon"]
# 解析实时动态
detail = {
"台风ID": typhoon_id,
"当前状态": typhoon_data[3],
"中心经度": typhoon_data[8][-1][4],
"中心纬度": typhoon_data[8][-1][5],
"中心气压": typhoon_data[8][-1][6],
"最大风速": typhoon_data[8][-1][7],
"更新时间": typhoon_data[8][-1][1]
}
return detail
# 4. 批量采集并保存
if __name__ == "__main__":
active_typhoons = get_current_typhoon_list()
if active_typhoons:
all_detail = []
for typhoon in active_typhoons:
detail = get_typhoon_detail(typhoon["台风ID"])
# 合并基础信息和详细信息
all_detail.append({**typhoon, **detail})
time.sleep(1) # 延迟1秒,避免反爬
# 保存数据
df = pd.DataFrame(all_detail)
df.to_csv("中央气象台台风实时数据.csv", index=False, encoding="utf-8-sig")
print(f"共采集到{len(all_detail)}个活跃台风数据,已保存")
else:
print("当前无活跃台风")
数据处理与避坑指南
1. 数据清洗(必做步骤)
采集到的原始数据可能存在缺失值、格式不一致、异常值等问题,需进行清洗:
- 缺失值处理:中心气压、风速等关键字段缺失时,可通过相邻时间点数据插值补充,或剔除无效数据;
- 格式统一:将经纬度、风速、气压等单位统一(如风速统一为m/s,气压统一为hPa);
- 异常值过滤:根据物理约束筛选异常数据,如台风移动速度不超过100km/h,中心气压与最大风速满足特定关联关系。
2. 避坑要点(新手必看)
- 反爬问题:爬取网页时,一定要添加请求头(User-Agent),控制爬取频率,避免短时间内大量请求;
- API密钥:使用和风天气、NOAA等API时,妥善保管密钥,避免泄露,免费版注意调用频率限制;
- 数据更新:台风数据实时变化,需定时采集(如每1-3小时),确保数据时效性;
- 数据版权:官方数据源的台风数据可用于非商业用途,商业项目需提前联系相关机构获取授权;
- 多源校验:单一数据源可能存在误差,可结合多个权威数据源(如中国气象局+和风天气)交叉校验,提高数据准确性。
3. 数据保存与可视化
- 保存方式:少量数据可保存为CSV/Excel,大量数据(如历史数据)建议保存到MySQL、MongoDB等数据库;
- 可视化:采集完成后,可使用Matplotlib、ECharts等工具绘制台风路径图、强度变化曲线,更直观地展示数据(后续会单独写一篇台风数据可视化教程)。
总结
台风数据采集的核心是“选对数据源+用对方法”:新手优先用和风天气API,简单高效;需要大量数据或定制化采集,用爬虫爬取中央气象台台风网;
另外,随着气象观测技术的发展,多源协同观测(卫星+雷达+无人机+探空)的数据越来越丰富,合理结合这些数据,能让台风监测和分析更精准。



浙公网安备 33010602011771号