プロが教えるわが家の防犯対策術!

pythonで気象庁の気象データを1年分ずつDLしたいです。以下のコードでDLはできるのですが、複数年DLするのに、毎回出力ファイル名やデータ取得開始・終了日を書き換えなければいけません。数十年分のデータを自動で、年毎にファイルを分けてDLできるようなコードに書き換えたいです。よろしくお願いします。

# -*- coding: utf-8 -*-
import os
import datetime
import csv
import urllib.request
from bs4 import BeautifulSoup

def str2float(weather_data):
try:
return float(weather_data)
except:
return 0

def scraping(url, date):

# 気象データのページを取得
html = urllib.request.urlopen(url).read()
soup = BeautifulSoup(html)
trs = soup.find("table", { "class" : "data2_s" })

data_list = []
data_list_per_hour = []

# table の中身を取得
for tr in trs.findAll('tr')[2:]:
tds = tr.findAll('td')

if tds[1].string == None:
break;

data_list.append(date)
data_list.append(tds[0].string)
data_list.append(str2float(tds[3].string))

data_list_per_hour.append(data_list)

data_list = []

return data_list_per_hour

def create_csv():
# CSV 出力先ディレクトリ
output_dir = r"C:\Users\taro\Desktop"

# 出力ファイル名
output_file = "2019.csv"

# データ取得開始・終了日
start_date = datetime.date(2019, 1, 1)
end_date = datetime.date(2019, 12, 31)

# CSV の列
fields = ["年月日", "時間", "降水量"]

with open(os.path.join(output_dir, output_file), 'w') as f:
writer = csv.writer(f, lineterminator='\n')
writer.writerow(fields)

date = start_date
while date != end_date + datetime.timedelta(1):

# 対象url(今回は東京)
url = "http://www.data.jma.go.jp/obd/stats/etrn/view/ho … \
"prec_no=44&block_no=47662&year=%d&month=%d&day=%d&view="%(date.year, date.month, date.day)

data_per_day = scraping(url, date)

for dpd in data_per_day:
writer.writerow(dpd)

date += datetime.timedelta(1)

if __name__ == '__main__':
create_csv()

質問者からの補足コメント

  • うーん・・・

    Ogre7077様
    ありがとうございます。すみません、試行錯誤していますがなかなか上手くいきません。具体的に修正したコードを教えていただけないでしょうか。よろしくお願いします。

    No.2の回答に寄せられた補足コメントです。 補足日時:2023/06/22 17:52

A 回答 (2件)

関数 create_csv の引数に対象年を追加して、


出力ファイル名とデータ取得開始・終了日を編集する元ネタとする
例)
def create_csv(target_year):
_ output_file = '%d.csv'%target_year

関数 create_csv の呼び出しを数十年分繰り返す
例)
for y in range(2001,2023):
_ create_csv(y)
この回答への補足あり
    • good
    • 0

インデントがメチャクチャで読むに耐えない。


ideoneとか使って欲しい。

ideone:
https://www.ideone.com/
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!