##やりたいこと(BEFORE)
気象庁の警報情報を取得して指定する地域に警報が出ていればSlackで通知する
こちらの記事がやりたいことドンピシャだ!
と思い記事の通りに進めていましたが、気象庁のデータが更新される度にZapier(作業を自動化できるツール)のタスクを動かしていると自分のプランの上限タスクを超えてしまう...
そこでやりたいことの範囲を狭めました。
##やりたいこと(AFTER)
気象庁の警報情報を「毎朝7時」に取得して指定する地域に警報が出ていればSlackで通知する
▼こんな感じ(動かした時に警報が出ていなかったので代わりに注意報を取得した様子)
毎朝7時に1回だけ情報を取得してタスク実行回数を1回/日にしました。
##Zap全体図
- Every Day:ここで毎朝7時にタスクを実行するように設定
- Run Python:気象庁の情報を取得・抽出(下にコードを記載)
- Only continue if...:2で出力があれば(警報が出ていれば)次に進む
- Send Channel Message in Slack:Slackの指定するチャンネルで通知
##Pythonコード
やりたいことが若干変わったので勉強せねば...と思いスクレイピングの方法を調べて書きました。初Python!
調べているとどうやらBeautifulSoupというものを使うのか〜ということを知りましたがZapierのヘルプにこんなことが書いてありました。
お"ぉぉおおおんBeautifulSoupが使えない!
ということで無理矢理感ありますがBeautifulSoup使わずにほしい箇所(警報部分)だけ抽出します。
import re
import requests
import time
code_list = [['札幌市', '0110000'], ['仙台市東部', '0410001'], ['さいたま市', '1110000']]
output = {'text': ''}
for code in code_list:
html = requests.get('https://www.jma.go.jp/jp/warn/f_' + code[1] + '.html').text
data_list = re.findall('<span style="color:#FF2800">(.*?)</span>', html)
if len(data_list) == 0:
continue
text = '【' + code[0] + '】'
i = 1
for data in data_list:
if i == len(data_list):
text += data
else:
data = re.sub('警報', '', data)
text += data + ','
i += 1
output['text'] += text + '\n'
time.sleep(1)
各地域のページで警報部分のフォントカラーは#FF2800
なので、<span style="color:#FF2800">〜</span>
で囲まれた部分を全て抽出しています。
また、複数ページをスクレイピングするのでtime.sleep(1)
で1秒休ませます。
##参考
気象庁から情報を取得して東京23区の気象警報をSlackに通知する
Zapierの使い方も含めてとても参考にさせていただきました。