【Python】Webスクレイピング:1週間の天気情報を取得し、csvファイルに出力する

■概要と目的

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週間の天気情報取得処理」のプログラム仕様を以下の表に示す。

区分概要
引数引数なし
戻り値List1週間の天気情報
入力処理内容出力
【Webサイト】
Yahoo天気
Yahoo天気サイトへ接続する。
BeautifulSoupをインスタンスする。
第1引数:Webサイトの情報
第2引数:html.parser
HTMLの週間天気classをセットし、
1週間の天気情報を取得する。
値:yjw_table

▼参考
1週間の天気情報をListに格納する。
★取得結果についてリスト内包表記を使用する。
ループ:取得結果分繰り返し
抽出条件:値が空文字「”」ではない場合

・csvファイル出力処理

取得した1週間の天気情報をcsvファイルに出力する処理。

・プログラム処理フロー図

「csvファイル出力処理」のプログラム処理フロー図を以下に示す。


・プログラム仕様

「csvファイル出力処理」について、プログラム仕様を以下の表に示す。

区分概要
引数List1週間の天気情報
戻り値なし
入力処理内容出力
出力用のcsvファイルを開く。
ファイル名:week_weather.csv
モード:書き込みモード(w)
csv.writerをインスタンスする。
1週間の天気情報をcsvファイルに出力する。【csvファイル】
1週間の天気情報

▼定数

「1週間の天気情報取得ツール」にて使用する定数を以下に示す。

定数名内容
DATA_NO4410String東京の天気情報コード
URLYahoo天気のURL+<DATA_NO>+.htmlString接続時に使用する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

コメント