python爬取中央气象台台风网当前台风实况和预报数据

台风的历史最佳路径数据集可以从中国气象局热带气旋资料中心下载,但是每年3/4月份左右才会发布上一年的数据,如果需要使用当年的数据,可以爬取中央气象台台风网(http://typhoon.nmc.cn/web.html)的数据。同时,在日常业务工作中,可能需要获取中央气象台的台风预报数据,进行一些其他处理。本篇介绍如何爬取中央气象台台风网的正在发展的台风数据,包括台风的历史实况分析和预报数据,以2021年的“查帕卡”和“烟花”为例。

图片

中央气象台台风网,图中为2106烟花和2107查帕克的信息(2021年7月20日20点)

一 确认当前正在发展的台风

使用Chrome浏览器开发者工具解析当前网页的元素。首先根据当前默认列表(默认当年的台风列表)的URL,爬取得到我们需要的台风id,台风名和编号以及是否是当前正在发展的台风。

图片

代码说明:


# 获取目前存在的西北太平洋台风,包括未编号但是给出路径预报的
def get_current_tc_list(url):
    html_obj = requests.get(url, headers=headers, verify=False).text

    data = json.loads(re.match(".*?({.*}).*", html_obj, re.S).group(1))['typhoonList']
    item_list = []
    for v in data:
    state = v[7] # stop or start
    if state == "start": # 只保留当前台风
        item = {}
        item['id']      = v[0]
        item['tc_num']  = '%s' % v[4]   # 编号
        item['name_cn'] = '%s' % v[2]   # 中文名
        item['name_en'] = '%s' % v[1]   # 英文名
        item['dec']     = '%s' % v[6]   # 名字含义
        item_list.append(item)
    return item_list
t = int(round(time.time() * 1000)) # 13位时间戳
url = 'http://typhoon.nmc.cn/weatherservice/typhoon/jsons/list_default?t=%s&callback=typhoon_jsons_list_default'%t
item_list = get_current_tc_list(url)

二 爬取目标台风的历史实况和预报信息

根据上个步骤得到的台风id等信息,爬取目标台风的URL,然后解析得到台风的历史位置和强度等信息和未来的预报信息。

图片

代码说明

#获取目标台风
def get_tc_info(item):
    #根据获取的时间戳和台风id,确定要请求的URL,得到typhoon列表
    t = int(round(time.time() * 1000)) # 13位时间戳
    # callback: typhoon_jsons_view_ + 台风的id
    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
    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':[],      #等级
                   'latTC':[],      #位置deg
                   'lonTC':[],
                   'mslp':[],    #中心气压hPa
                   'attr':[]}   #属性,预报forecast,实况analysis
    #先遍历所有实况
    for v in data[8]:
    info_dicts['dateUTC'].append(v[1])
    info_dicts['dateCST'].append(date_pred(v[1], 8)) # UTC to CST
    info_dicts['vmax'].append(v[7])
    info_dicts['grade'].append(get_type(v[3]))
    info_dicts['lonTC'].append(v[4])
    info_dicts['latTC'].append(v[5])
    info_dicts['mslp'].append(v[6])
    info_dicts['attr'].append('analysis')
    #最新预报时刻
    dateUTC0 = info_dicts['dateUTC'][-1]
    #获取最新的一次预报
    BABJ_list = data[8][-1][11]['BABJ']
    for i in range(len(BABJ_list)):
    pred_hour = int(BABJ_list[i][0]) #预报时效,hour
    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['lonTC'].append(BABJ_list[i][2])
    info_dicts['latTC'].append(BABJ_list[i][3])
    info_dicts['mslp'].append(BABJ_list[i][4])
    info_dicts['attr'].append('forecast')
    tc_info = pd.DataFrame(info_dicts)
    return tc_info

三 获取到的台风信息

2021-07-020:20左右爬取到的台风信息如下,以烟花为例,analysis表示历史实况分析,forecast表示预报数据。

图片

扫描下方二维码关注气海同途公号,回复“台风路径”关键字即可获取。

图片

  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您想了解如何用 Python 爬取历史天气数据,是吗? 首先,需要确定您想要爬取哪个地区的历史天气数据。一般来说,可以通过查询该地区的气象局或气象站获取历史天气数据。 接着,可以使用 Python 中的 requests 库来发送 HTTP 请求,获取页源代码。然后,可以使用 BeautifulSoup 库来解析页源代码,提取出所需的天气数据。 以下是一个简单的示例代码,用于爬取中国天气上北京市 2019 年 1 月份的历史天气数据: ``` python import requests from bs4 import BeautifulSoup url = 'http://www.weather.com.cn/weather/101010100.shtml#dt' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} r = requests.get(url, headers=headers) r.encoding = 'utf-8' soup = BeautifulSoup(r.text, 'html.parser') weather_list = soup.select('.t li') for weather in weather_list: date = weather.select('.time')[0].text weather_detail = weather.select('.temp')[0].text.strip() print(date, weather_detail) ``` 以上代码中,我们首先通过 requests 库发送了一个 GET 请求,获取了北京市天气页源代码。然后,使用 BeautifulSoup 库解析页源代码,提取出了 2019 年 1 月份的天气数据,并打印输出了日期和天气详情。 需要注意的是,不同的页结构不同,需要根据具体情况修改代码。同时,需要注意站的 robots.txt 文件,不要过度访问站,以免被封 IP 或其他限制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值