Edited at

Pythonで天気予報APIを叩いてデータ取得&DB保存までやってみた


はじめに

運営しているWEBサイトで、毎日の東京の天気を表示しようということになり、まずは無料のAPIで試してみました。

イメージとしては www.japantimes.co.jp のヘッダーをイメージしてもらえれば近いと思います。


やりかた

ユーザーからアクセスがある度にAPIを叩いていると大変なので、1日1回Pythonでデータを取得してDBに保存、WEBサイトからはDBを参照してその天気を表示する形にしました。


利用するAPI

Livedoor天気情報サービスWeather Hacksを使います。

http://weather.livedoor.com/weather_hacks/webservice

全国142カ所の3日間(今日/明日/明後日)の天気予報・予想気温がjson形式で取得できます。


コード

当日の最低気温、最高気温、テロップ(曇り時々晴れ、みたいな情報)を取得してDBに保存するまでのコードです。

# -*- coding: utf-8 -*-


import requests
import mysql.connector

def output_weather():
datas = []
url = 'http://weather.livedoor.com/forecast/webservice/json/v1?city='+city
api_data = requests.get(url).json()
if len(api_data) > 0:
if api_data['forecasts'][0]['temperature']['min'] is not None:
min_temp = api_data['forecasts'][0]['temperature']['min']['celsius']
else:
min_temp = '-'
if api_data['forecasts'][0]['temperature']['max'] is not None:
max_temp = api_data['forecasts'][0]['temperature']['max']['celsius']
else:
max_temp = '-'
datas.append([ api_data['forecasts'][0]['date'], api_data['location']['city'], min_temp, max_temp, api_data['forecasts'][0]['telop'] ])
else:
print('failed')

sqtbl = 'jd_api_weather' #テーブル名

#DB接続情報
conn = mysql.connector.connect(host = '{host_server_url}', db = '{database}', user = '{user_name}', password = '{passwd}', charset = 'utf8mb4')
c = conn.cursor()

#過去の天気情報は不要なので都度初期化
c.execute('drop table if exists ' + sqtbl) #初期化
c.execute('create table ' + sqtbl + '(Date date, City text, Min text, Max text, Telop text)')

#テーブルにINSERT処理
c.executemany('insert into ' + sqtbl + ' values (%s,%s,%s,%s,%s)',datas)

#施した変更を保存
conn.commit()

#確認用に結果を取得してコンソールに表示。
c.execute('select * from ' + sqtbl + ' order by Date desc limit 10;')
for rowsql in c.fetchall():
print(rowsql)

#接続終了
conn.close()

#Weather Hackで指定された地域ごとのIDを入れる。ちなみに130010は東京です
output('130010')

厳密に言えば上記のPythonコードを少し修正してAWSのLAMBDAに置いてあり、1日1回自動で実行するようになっています。それぐらいなら無料枠で使えます。


最後に

今回は地域IDが固定で良かったのですが、ここを引数にしたり、あとはエラーのハンドリング方法など、もっと上手くやりたいなと思っています。

Pythonの書き方は自己流で学んだのでツッコミやより良い書き方があればコメントをいただけると嬉しいです。