読者です 読者をやめる 読者になる 読者になる

シコウノキロク

思考・志向・試行・嗜好の記録

過去の気温から今日の服装をおすすめ [pythonで初プログラミング]

前回の記事で簡単に作れそうなプログラミングを試行錯誤する宣言していました。今回は、その中で最もハードルが低そうなアイデアのプロトタイプを作成してみました。
shikouno.hatenablog.com
Djangoをかじってプログラミングという大海の広さに絶望してから数日、なんとか動くものができました。ほんの数十行の短いコードですが、できあがると嬉しくなっちゃいますね。
以下、コード・勉強になった点・ドはまりした点・今後の目標を書いていきたいと思います。

〇コード

#!/usr/bin/env python
# coding: "uft-8"

import requests
from bs4 import BeautifulSoup
import re
from datetime import datetime, timedelta

#使用するdatetimeオブジェクトを作成
today = datetime.now()
tommorow = today + timedelta(1)
someday = today - timedelta(1)
tempday = today

#予報データ取得:URLから取得・beuatifulsoupで気象データ取り出し
if 23 <= today.hour <4:
    fore_select = 0
else:
    fore_select = 1
html_fore = requests.get('http://www.jma.go.jp/jp/yoho/331.html')   #予報データ
soup = BeautifulSoup(html_fore.text,"lxml")
fore_max = soup.find_all('td',{'class':'max'})[fore_select]   #最高気温
fore_max = float(fore_max.string.split('度')[0])
fore_min = soup.find_all('td',{'class':'min'})[fore_select]   #最低気温
fore_min = float(fore_min.string.split('度')[0])

#過去データ取得:同上
def html_past(req_day):
    html = requests.get(
    "http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?prec_no=62&block_no=47772&year={}&month={}&day=&view="
    .format(req_day.year,req_day.month))
    html.encoding='utf-8'      #なぜかISO-8859-1で取得されるのでutf-8でエンコード
    soup = BeautifulSoup(html.text,"lxml")
    return(soup.find('table',{'class':'data2_s'})) #気象データのテーブルを戻り値として指定

#過去5日分の最高気温・最低気温合計
max_total , min_total = 0.0 , 0.0

for i in range(5):
    if someday.month != tempday.month:
        past_data = html_past(someday)
    else:
        pass
    someday_data = past_data.find_all('tr')[someday.day+3]  #1日分のtrデータを取り出し。気象データは5段目から。
    #someday_data_day = someday_data.find('td')     #日付チェック用
    #print(int(someday_data_day.string))
    max_temp = someday_data.find_all('td')[7]   #リストの8番目が最高気温
    max_total += float(max_temp.string)
    min_temp = someday_data.find_all('td')[8]   #リストの9番目が最低気温
    min_total += float(min_temp.string)
    tempday = someday
    someday -= timedelta(1)

max_average = round(max_total/5,1)
min_average = round(min_total/5,1)

#結果出力
if 0 <= today.hour <4:
    print("本日:{}.{}.{}の気温".format(today.year,today.month,today.day))
else:
    print("明日:{}.{}.{}の気温".format(tommorow.year,tommorow.month,tommorow.day))

print("予報:最高{} 最低{}".format(fore_max, fore_min))
print("過去:最高{} 最低{}".format(max_average, min_average))

if (fore_min < min_average-3):
    print('冷え込むので厚着しましょう')
elif (fore_min > min_average+3):
    print('暑いので薄着しましょう')
elif (fore_max < max_average-3):
    print('日中に寒くなるので羽織もので調整しましょう')
elif (fore_max > max_average+3):
    print('日中に暑くなるので羽織もので調整しましょう')
else:
    print('昨日までと同じ服装が良いでしょう')

〇勉強になった点

pythonの基本的な文法の使い方が以前よりも習得できたんじゃないでしょうか。上のコードを書きながら、基本を見返しつつあーでもこーでもないというのをやりながら使い方を意識すると身についてくるような気がしますね。プログラミングは言語だから体で覚えるのです!
他にはhtml関連のrequestとbeautifulsoupも勉強になりました。特にbeautifulsoupを色々と調べていて感じたのは、めちゃくちゃ便利!ってことです。ほぼ使いこなせていない状態の私でも少しいじっただけで作りたいものがかなり増えてしまいました。お決まりのタグから取得してデータ整形させてうまく活用して…こういう定型的な単純処理はプログラミングの得意分野ですしね。当然のことを書いてしまっていますが、その魅力を改めて感じたので書いています。1つのモジュールでこれだけワクワクするというのはプログラミング凄すぎです。

〇ドはまりした点

データ型の種類指定でドはまりしました。過去データから最高気温を取り出す際、気温データは小数点表示であるためfloat型で指定すべきにも関わらず、最初はint型で指定していました。基本中の基本で躓いて悲しい。型指定の際のエラーが、変換する前のbeautifulsoup型の取り扱い方がまずいことに起因すると思って色々調べていたためです。1時間くらい浪費してしまったかな。

〇今後の目標

このプロトタイプ、実用しようとしたときに問題点があります。コンセプトがそもそも…という話はなしです。
まず、当日の気温を判定しようとした場合5時までに起動しなくてはいけないという点です。これは、気象庁の予報データの更新が5,17,23時に更新されるためです。5時になると本日の(朝の)最低気温が表示されなくなります。
次に、このプログラムを起動するためには、パソコンON→モジュール読み込み→パソコンOFFという操作が必要である点です。朝の忙しい時間帯ではこの動作は致命的ですよね。
上記の2つを解消しつつ私の興味がある勉強もできる目標として仮想専用サーバ(VPS)かと考えています。VPSを使えば、早朝(5時まで)にデータ取得・SNS(twitter・LINEetc)投稿の二つができますよね。恐らくできると踏んでいます。とりあえず、その辺りの検討も含めてVPSを勉強してみます!

広告を非表示にする