※以前はコードと注意報等の紐づけするファイルを作っていましたが必要がなくなったため削除しました。
コメントに書いてくださいました皆様、ありがとうございます。
初めに
現在出ている注意報・警報を取得したいと思うことは無いでしょうか?
現状、それらの情報を取得できる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データが取得できる件
気象庁 全国の警報・注意報