LoginSignup
1
5

More than 1 year has passed since last update.

Google Colaboratoryで 気象庁データをwebスクレイピング後 pandasに変換 [python]

Last updated at Posted at 2022-05-23

Google Colaboratory(グーグル・コラボラトリー、あるいは略式の呼称でGoogle Colabと呼ばれる。)とは、
教育機関や研究機関において機械学習の普及を目的としたGoogleの研究プロジェクトの一つとなっています

Google Colaboratoryは
環境構築といった学習コストがかからないため
初めての方にとても魅力的です

とりあえず機械学習を使用してみたい人には
pycaret が個人的にはお勧めです

今臨床工学技士の方々と共同研究をしているのですが
AI時代を見据えて医療現場でDXを実施してきた
臨床工学技士の歴史を作られてきた有名な方は 強力な自作データベースがあるのですが

転職したばかりなど理由がある方は
特徴量が足りないという問題点に直面します

そこで気象庁のデータが活用できると思いました

気象庁のデータは一部自由に利用できることのできる魅力的なデータです

気象庁ホームページで公開している情報(以下「コンテンツ」といいます。)は、
どなたでも以下の(1)~(7)に従って、複製、公衆送信、翻訳・変形等の翻案等、自由に利用できます
商用利用も可能です
また、数値データ、簡単な表・グラフ等は著作権の対象ではありませんので、
これらについては本利用ルールの適用はなく、自由に利用できます

と記載されています 気象庁のデータを
効率よく自動で取得する仕組みが必要と思いました

そこで重要なのが
webスクレイピングです!
webスクレイピングとは、ウェブサイトから情報を抽出するコンピュータソフトウェア技術のことをいいます

上記のサイトのソースコードを一部調整し
札幌だけの気象庁データをスクレイピングするソースコードを書きます

place_codeA = [14]
place_codeB = [47412]
place_name = ["札幌"]   

import requests
from bs4 import BeautifulSoup #ダウンロードしてなかったらpipでできるからやってね。
import csv

# URLで年と月ごとの設定ができるので%sで指定した英数字を埋め込めるようにします。
base_url = "http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?prec_no=%s&block_no=%s&year=%s&month=%s&day=1&view=p1"

#取ったデータをfloat型に変えるやつ。(データが取れなかったとき気象庁は"/"を埋め込んでいるから0に変える)
def str2float(str):
  try:
    return float(str)
  except:
    return 0.0


if __name__ == "__main__":
  #都市を網羅します
  for place in place_name:
    #最終的にデータを集めるリスト (下に書いてある初期値は一行目。つまり、ヘッダー。)
    All_list = [['年月日', '陸の平均気圧(hPa)', '海の平均気圧(hPa)', '降水量(mm)', '平均気温(℃)', '平均湿度(%)', '平均風速(m/s)', '日照時間(h)']]
    print(place)
    index = place_name.index(place)
    # for文で2016年~2021年までの11回。
    for year in range(2016,2021):
      print(year)
      # その年の1月~12月の12回を網羅する。
      for month in range(1,13):
        #2つの都市コードと年と月を当てはめる。
        r = requests.get(base_url%(place_codeA[index], place_codeB[index], year, month))
        r.encoding = r.apparent_encoding

        # まずはサイトごとスクレイピング
        soup = BeautifulSoup(r.text)
        # findAllで条件に一致するものをすべて抜き出します。
        # 今回の条件はtrタグでclassがmtxになってるものです。
        rows = soup.findAll('tr',class_='mtx')

        # 表の最初の1~4行目はカラム情報なのでスライスする。(indexだから初めは0だよ)
        # 【追記】2020/3/11 申し訳ございません。間違えてました。
        rows = rows[4:]

        # 1日〜最終日までの1行を網羅し、取得します。
        for row in rows:
          # 今度はtrのなかのtdをすべて抜き出します
          data = row.findAll('td')

          #1行の中には様々なデータがあるので全部取り出す。
          # ★ポイント
          rowData = [] #初期化
          rowData.append(str(year) + "/" + str(month) + "/" + str(data[0].string))
          rowData.append(str2float(data[1].string))
          rowData.append(str2float(data[2].string))
          rowData.append(str2float(data[3].string))
          rowData.append(str2float(data[6].string))
          rowData.append(str2float(data[9].string))
          rowData.append(str2float(data[11].string))
          rowData.append(str2float(data[16].string))

          #次の行にデータを追加
          All_list.append(rowData)

    #都市ごとにデータをファイルを新しく生成して書き出す。(csvファイル形式。名前は都市名)
    with open(place + '.csv', 'w') as file:
      writer = csv.writer(file, lineterminator='\n')
      writer.writerows(All_list)

その後 リストをpandas にします
pandasについては以下の記事がわかりやすいです

スクレイピングした気象庁データをpandas.DataFrameに変換

import pandas as pd
All_df=pd.DataFrame(data=All_list)
#0行目をcolumns用に取り出し
col=All_df.loc[0,:]

#0行目をcolumnsにしたDataFrame
all_data_df_p=pd.DataFrame(data=All_list, columns=col)
df=all_data_df_p

#DataFrameの作成と確認
all_data_df=df.drop(df.index[[0]])
all_data_df
1
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5