place_codeA = [44, 62]
place_codeB = [47662, 47772]
place_name = ["東京", "大阪"]
import requests
from bs4 import BeautifulSoup
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 False
if __name__ == "__main__":
#都市を網羅します
for
place in place_name:
#最終的にデータを集めるリスト (下に書いてある初期値は一行目。つまり、ヘッダー。)
All_list = [['年月日','現地気圧(hPa)','海面平均気圧(hPa)','降水量(mm)','1Hr雨(mm)','1Min雨(mm)','平均気温(℃)','最高気温(℃)','最低気温(℃)','平均湿度(%)','最低湿度(%)','平均風速(m/s)','最大風速(m/s)','最大風向','最大瞬間風速(m/s)','最大瞬間風向','日照時間(h)','降雪(cm)','最深積雪(cm)','天気概要(昼)','天気概要(夜)']]
print(place)
index = place_name.index(place)
#
for文で2000年~2021年までの12年間。
for year in range(2000,2022):
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だよ)
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[4].string))
rowData.append(str2float(data[5].string))
rowData.append(str2float(data[6].string))
rowData.append(str2float(data[7].string))
rowData.append(str2float(data[8].string))
rowData.append(str2float(data[9].string))
rowData.append(str2float(data[10].string))
rowData.append(str2float(data[11].string))
rowData.append(str2float(data[12].string))
rowData.append(data[13].string)
rowData.append(str2float(data[14].string))
rowData.append(data[15].string)
rowData.append(str2float(data[16].string))
rowData.append(str2float(data[17].string))
rowData.append(str2float(data[18].string))
rowData.append(data[19].string)
rowData.append(data[20].string)
#次の行にデータを追加
All_list.append(rowData)
#都市ごとにデータをファイルを新しく生成して書き出す。(csvファイル形式。名前は都市名)
with open(place + '.csv', 'w') as file:
writer = csv.writer(file,
lineterminator='\n')
writer.writerows(All_list)