Pythonで天気予報をLINEに通知するスクリプト

元々公開するつもりだったけど,Twitterで知りたいと直に言われたので今回はコードも載せときます.

ちなみにこんな感じで通知が出来ます.(まだまだ改善の余地あり)

既存記事との比較 (兼参考文献)

LINE Notify + Pythonで天気情報を取得する方法

【Yahoo!天気リプレース版】LINE Notify + Pythonで天気情報を取得する方法

本記事と上記二つの違いは本記事では ウェザーニュース を使うこと,それに付随してそのサイトの様にRSSが存在しないサイトで力業でスクレイピングをする,みたいなところです.サイトの方でRSSが見当たらなかったので取得・検出サイト使ってもみたいんですけどまあ見つからず.

※僕の個人的な嗜好によるものですが,1時間おきの天気の推移が知りたかったのでこのサイトを選びました.

で,RSS無くても当たり前だけど力業でスクレイピングは出来るべっていうのをやりたくて記事執筆しました.

以下から具体的な作業説明をします.

LINE Notify のトークン取得

こちらのページでQRを読み取ってLINE Notifyを友達追加します.

追加後,同ページの右上のログインから自分のLINEアカウントにログインします.

ログイン出来たら,こちらの箇所からアクセストークンを発行します.まあ当たり前ですがこちらのトークンは公に公開してはいけません.コピーして適当に保管しといてください.以上でLINE側の処理は終わり.

ウェブスクレイピング前の準備

ここからが本題です.とりあえず引き抜きたいページを覗いてみます.今回は例として東京都港区の天気を参考にしますが,このページは自分で見たい場所の天気のページにしてください.

東京都港区の天気のhtml

ぱっと覗いた感じ,こちらの表にあるデータが欲しいですね.これを意識してこちらのページのソースを覗いてみます.とりあえず表の部分を見つけるのに使えそうなワード「7月27日」でソース内を検してみますと

要素の個数,書いてある事的にもこちらに書いてある情報を引っこ抜ければ良さそうですね.今回は時刻,降水量,温度を表から抽出してみましょう.

Python スクリプト

import os
import re
import requests
import urllib.request
 
### Weather News ###
Weather_URL = 'https://weathernews.jp/onebox/35.658990/139.745698/q=%E6%9D%B1%E4%BA%AC%E9%83%BD%E6%B8%AF%E5%8C%BA&v=5d22dc1cae237f1a949a02b09390e3847769adb2fb4cf30b0ff004e9b12e7f50&temp=c&lang=ja'
msg = '\n'+'今日の天気予報です.' + '\n' + '\n' #r'\n'では改行不可なので癖がついてる人は注意
 
with urllib.request.urlopen(Weather_URL) as response:
    html = response.read().decode()
    seiki = r'<div class="weather-day__head">(.|\s)*?<div class="weather-day">'
    reseiki = re.search(seiki, html).group()
    time = re.findall(r'<p class="weather-day__time">((?:.|\s)*?)</p>', reseiki) # <p class="weather-day__time">と</p>の間の要素を抽出する
    rain = re.findall(r'<p class="weather-day__r">((?:.|\s)*?)</p>', reseiki)
    temp = re.findall(r'<p class="weather-day__t">((?:.|\s)*?)</p>', reseiki)

for i in range (0,len(time)): 
    if i == len(time)-1:
        msg = msg + time[i]+' ' + rain[i]+ ' ' + temp[i]
    else:
        msg = msg + time[i]+' ' + rain[i]+ ' ' + temp[i] + '\n'
 
### LINE Notify ###
line_notify_token = YOUR TOKEN # 自分のトークンを設定する 例) '227ONGAKUNOJIKANHAKUSOGE'
line_notify_api = 'https://notify-api.line.me/api/notify'
payload = {'message': msg}
headers = {'Authorization': 'Bearer ' + line_notify_token}  
line_notify = requests.post(line_notify_api, data=payload, headers=headers)


いつもはSyntax highlighter使ってるんですけど,Wordpressのエディタの仕様で上手く貼れなかったので今回だけはgitgistにします,すみません.
暫定処理ですが直しました.

基本的にはWeather_URLを自分の調べたい地域のURL,アクセストークンを自分のに差し替えれば動きます.pyinstallerで.exe化してWindowsのタスクスケジューラで定時起動させても良し,.batで.pyのまま動かしても良し,Linuxのcronで定時起動させても良しです.

力業~って銘打ってるので「with urllib.request.urlopen(Weather_URL) as response: #URLを読み込む」の箇所でどんな風にソースから情報抜いてるんだいって言うのを説明したいんですが,正規表現で挟んで抜きたいところを抜いてるだけです.それだけです.結構単純なんですけどこれだけで何でも抜けます.

一応 github でも公開していますが,こちらは僕用なのでsettings.iniを使って読み込むタイプになっています(コードにアクセストークンや僕の地元職場の情報をコードに直書きできないので...).サンプル用作るのがめんどくさいんです...

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください