
前提
広島の気象データを月ごとに自動取得したいのですが、サンプルが日毎しかない
ここに質問の内容を詳しく書いてください。
(例)
広島の気象データを月ごとに自動取得したいのですが、サンプルが日ごとしかなく月ごとのプログラミングに変更したいのですがなぜかうまくいかず原因が分かりません。
実現したいこと
2016から2021年までの'年月日', '平均気圧(hPa)', '降水量合計(mm)', '平均気温(℃)', '平均湿度(%)', '平均風速(m/s)', '日照時間(h)', '全天日射量(MJ/㎡)','降雪量合計(cm)','平均雲量','雪日数','霧日数','雷日数'が取得したい
ここに実現したいことを箇条書きで書いてください。
- ▲▲機能を動作するようにする
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
place_codeA = [67]
place_codeB = [47765]
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文で2007年2017年までの11回。12月の12回を網羅する。
for year in range(2007,2018):
print(year)
# その年の1月
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)
ソースコード
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー