17
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

現在出ている気象警報・注意報を取得する

Last updated at Posted at 2021-08-07

※以前はコードと注意報等の紐づけするファイルを作っていましたが必要がなくなったため削除しました。
コメントに書いてくださいました皆様、ありがとうございます。

初めに

現在出ている注意報・警報を取得したいと思うことは無いでしょうか?
現状、それらの情報を取得できるAPIはたいてい有料なことが多いです。
そこで今回は気象庁のWebAPI(?)を利用して取得しようかと思います。

事前準備

このページから地方エリアのコードと市町村区のコードを取得しておきます。
例えば東京都千代田区の場合、関東甲信地方の東京都東京地方を選択した後、千代田区を選択した際URLのclass20s&area_code=""の部分が市町村区のコードとなります。

実装

warninginfo.py
#!/usr/bin/env python3
# -*- coding:utf-8 -*-

import json
import urllib.request
import re
from bs4 import BeautifulSoup as bs


CLASS_AREA_CODE = "1310100" #市町村区のコード
AREA_URL = "https://www.jma.go.jp/bosai/common/const/area.json"
warning_info_url = "https://www.jma.go.jp/bosai/warning/#area_type=class20s&area_code=%s&lang=ja" % (CLASS_AREA_CODE)
url = "https://www.jma.go.jp/bosai/warning/data/warning/%s.json"

def warnings():
        #コードと名称の取得
        warnings_soup = bs(urllib.request.urlopen(warning_info_url).read(), 'html.parser')
        warnings_contents = warnings_soup.find_all('script')[10]
        warnings_text_list = str(warnings_contents).split("},")
        warnings_list = [re.findall(r'\w+', warning) for warning in warnings_text_list if ':{name1:"' in warning]
        trans_warning = {}
        for warning_datas in warnings_list:
                warning_text = ''
                for warning_data in warning_datas:
                        if warning_data in 'elem':
                                break
                        if warning_data in ['c', 'name1', 'name2']:
                                continue
                        if warning_data.isdecimal():
                                warning_code = warning_data
                                continue
                        warning_text += '\\' + warning_data
                trans_warning[warning_code] = warning_text.encode('ascii').decode('unicode-escape')
        #情報の取得
        area_data = urllib.request.urlopen(url=AREA_URL)
        area_data = json.loads(area_data.read())
        area = area_data["class20s"][CLASS_AREA_CODE]["name"]
        class15s_area_code = area_data['class20s'][CLASS_AREA_CODE]['parent']
        class10s_area_code = area_data['class15s'][class15s_area_code]['parent']
        offices_area_code = area_data['class10s'][class10s_area_code]['parent']
        warning_info = urllib.request.urlopen(url=url % (offices_area_code))
        warning_info = json.loads(warning_info.read())
        warning_codes = [warning["code"]
                        for class_area in warning_info["areaTypes"][1]["areas"]
                        if class_area["code"] == CLASS_AREA_CODE
                        for warning in class_area["warnings"]
                        if warning["status"] != "解除" and warning["status"] != "発表警報・注意報はなし"]
        warning_texts = [trans_warning[code] for code in warning_codes]
        return (warning_texts,area)

def main():
        warning_texts,area = warnings()
        print("https://www.jma.go.jp/bosai/warning/#area_type=class20s&area_code=%s&lang=ja" % (CLASS_AREA_CODE))
        print("%sの気象警報・注意報" % area)
        if warning_texts:
                print("\n".join(warning_texts))
        else:
                print("現在発表警報・注意報はありません。")

if __name__ == "__main__":
        main()

前回作ったこれと組み合わせたり、新たに警報・注意報が発表されたときLine等に送信するようにすれば有効活用できるかと思います。
#参考文献
JSONファイルにデータを追加する方法は?
新しい気象庁サイトからJSONデータが取得できる件
気象庁 全国の警報・注意報

17
18
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?