■概要と目的
Yahooの天気サイトから、1週間の天気情報を取得し、結果をcsvファイルに出力する機能を実装する。
以降、本処理を「1週間の天気情報取得ツール」と呼ぶ。
■機能設計
本項では、「入出力一覧」および「制約事項・前提条件」を記載する。
▼入出力一覧
「1週間の天気情報取得処理」にて使用する入出力一覧を以下に示す。
項目名 | 区分 | 内容 |
---|---|---|
天気情報サイト | 入力 | Yahooの天気サイトを使用する。 |
1週間の天気情報 | 出力 | 1週間の天気情報のみをサイトから抽出し、 csvファイルとして出力する。 |
▼制約事項・前提条件
1週間の天気情報を取得するにあたり、以下に制約事項および前提条件を示す。
- 天気情報を取得するサイトはYahooの天気サイトを使用する。
- 取得する地域は東京(コード:4410)とする。
- 取得する1週間の天気情報は、翌々日から6日間とする。
- 取得する方法は、あらかじめ天気サイトのHTMLの構成要素を確認し、取得するタグ要素のクラスを確認しておく。(tableタグのクラス「yjw_table」を使用する)
※GoogleChromeの場合、「F12」を押下することで、表示しているサイトのHTMLを確認することが可能。 - csvファイルに出力する際は、上書きモードで出力する。
■プログラム設計
「1週間の天気情報取得ツール」にて使用する処理は、「1週間の天気情報取得処理」および「csvファイル出力処理」である。
本項では、各処理の概要および定数の値設定について示す。
▼処理概要
各処理の処理概要を以下に示す。
処理名 | 処理概要 |
---|---|
1週間の天気情報取得処理 | Yahooの天気サイトから、1週間の天気情報を取得する処理。 |
csvファイル出力処理 | 取得した天気情報をcsvファイルに出力する処理。 |
・1週間の天気情報取得処理
Yahooの天気サイトから、1週間の天気情報を取得する。
・プログラム処理フロー図
「1週間の天気情報取得処理」のプログラム処理フロー図を以下に示す。
・プログラム仕様
「1週間の天気情報取得処理」のプログラム仕様を以下の表に示す。
区分 | 型 | 概要 |
---|---|---|
引数 | – | 引数なし |
戻り値 | List | 1週間の天気情報 |
入力 | 処理内容 | 出力 |
---|---|---|
【Webサイト】 Yahoo天気 | Yahoo天気サイトへ接続する。 | – |
– | BeautifulSoupをインスタンスする。 第1引数:Webサイトの情報 第2引数:html.parser | – |
– | HTMLの週間天気classをセットし、 1週間の天気情報を取得する。 値:yjw_table ▼参考 | – |
– | 1週間の天気情報をListに格納する。 ★取得結果についてリスト内包表記を使用する。 ループ:取得結果分繰り返し 抽出条件:値が空文字「”」ではない場合 | – |
・csvファイル出力処理
取得した1週間の天気情報をcsvファイルに出力する処理。
・プログラム処理フロー図
「csvファイル出力処理」のプログラム処理フロー図を以下に示す。
・プログラム仕様
「csvファイル出力処理」について、プログラム仕様を以下の表に示す。
区分 | 型 | 概要 |
---|---|---|
引数 | List | 1週間の天気情報 |
戻り値 | – | なし |
入力 | 処理内容 | 出力 | |
---|---|---|---|
– | 出力用のcsvファイルを開く。 ファイル名:week_weather.csv モード:書き込みモード(w) | – | |
– | csv.writerをインスタンスする。 | – | |
– | 1週間の天気情報をcsvファイルに出力する。 | 【csvファイル】 1週間の天気情報 |
▼定数
「1週間の天気情報取得ツール」にて使用する定数を以下に示す。
定数名 | 値 | 型 | 内容 |
---|---|---|---|
DATA_NO | 4410 | String | 東京の天気情報コード |
URL | Yahoo天気のURL+<DATA_NO>+.html | String | 接続時に使用するURL |
■サンプルコード
「1週間の天気情報取得ツール」のサンプルコードを以下に示す。
import csv
import requests
from bs4 import BeautifulSoup
# データNo(東京)
DATA_NO = '4410'
# Yahooの天気URL
URL = 'https://weather.yahoo.co.jp/weather/jp/13/' + DATA_NO + '.html'
def get_week_weather():
'''
1週間の天気を取得する
Parameters
----------
なし
Returns
-------
1週間の天気(List)
'''
# Yahooの天気サイトへ接続
r = requests.get(URL)
# BeautifulSoupのインスタンス
bs = BeautifulSoup(r.text, 'html.parser')
# HTMLの週間天気classをセット
temperature_data = bs.find(class_='yjw_table')
# 1週間の天気を配列に格納
week_data = [
i.strip() for i in temperature_data.text.splitlines() if i.strip() != ''
]
return week_data
def output_csv(week_weather_data):
'''
CSVファイルに出力する処理
Parameters
----------
1週間の天気(List)
Returns
-------
なし
Output File
-----------
week_weather.csv
'''
# 出力用csvファイルを開く
with open('week_weather.csv', 'w') as f:
# csv.writerをインスタンス
output = csv.writer(f)
# 1週間の天気情報をcsvファイルに出力
output.writerow(week_weather_data)
# メイン処理
if __name__ == '__main__':
# 1週間の天気情報を取得
week_weather_data = get_week_weather()
# csvファイルに出力
output_csv(week_weather_data)
■実行結果
取得した1週間の天気情報(week_weather.csv)の内容を以下に示す。
※2023年2月23日(木)実行
日付,2月25日(土),2月26日(日),2月27日,(月),2月28日,(火),3月1日,(水),3月2日,(木),天気,晴時々曇,晴れ,晴れ,晴れ,晴時々曇,曇一時雨,気温(℃),11,4,11,2,13,3,18,6,19,6,15,7,降水確率(%),20,10,0,0,20,50
日付については、土曜日および日曜日は、「日付+曜日」で取得するが、平日は「日付」と「曜日」が別々(カンマ区切り)で取得する。
■参考
「1週間の天気情報取得」作成にあたり、参考とさせていただいた外部リンクおよび内部リンクを以下に示す。
▼外部リンク
・Yahoo天気(東京)
・Yahoo天気の地域コード
・BeautifulSoupの使用方法
・csvライブラリの使用方法
▼内部リンク
・GitHub