# coding: utf-8
place_codeA = [48,46]
place_codeB = [404,392]
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_a1.php?prec_no=%a&block_no=0%a&year=%a&month=%a&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 =
[['年月日', '降水計(mm)', '1Hr雨(mm)','10Min雨(mm)','平均気温(℃)', '最高気温(℃)', '最低気温(℃)', '平均風速(m/s)', '最大風速(m/s)', '最大風向', '最大瞬間風速(m/s)', '最大瞬間風向','最多風向','日照時間(h)','降雪(cm)','最深積雪(cm)']]
print(place)
index = place_name.index(place)
# for文で2020年~2021年までの2回、つまり2年間廻す。
for year in range(2020,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)
# print(BeautifulSoup(r.text))
# 上記のプリントも途中からおかしい → place_codeは3桁でもblock_noの %aの前に 0 を置くことで解決
rows = soup.findAll('tr',class_='mtx') #タグ指定してclass名を指定するみたい。
# print(soup.findAll('tr',class_='mtx'))
# 上記のプリントがおかしい? → place_codeは3桁でもblock_noの %aの前に 0 を置くことで解決
# 表の最初の1~3行目はカラム情報なのでスライスする。(indexだから初めは0だよ)
# 【追記】2020/3/11
申し訳ございません。間違えてました。
rows = rows[3:]
# 1日〜最終日までの1行を網羅し、取得します。
for row in rows:
data = row.findAll('td')
# print(row.findAll('td'))
# 上記はprintエラーとなる
#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(data[9].string)
rowData.append(str2float(data[10].string))
rowData.append(data[11].string)
rowData.append(data[12].string)
rowData.append(str2float(data[13].string))
rowData.append(str2float(data[14].string))
rowData.append(str2float(data[15].string))
#次の行にデータを追加
All_list.append(rowData)
#都市ごとにデータをファイルを新しく生成して書き出す。(csvファイル形式。名前は都市名)
with open(place
+ '.csv', 'w') as file:
writer = csv.writer(file, lineterminator='\n')
writer.writerows(All_list)