点进去要下载的话只能手动一个一个点;
在网上搜索批量下载方法,有公众号提到:
结合自己的需要(比如我需要在月末获得一直到9月的预报数据),参考以上代码,大部分寻求CHATGPT帮助,完成代码:其中,非常感谢师兄帮我解决一个大问题,因为最开始直接复制的网址
其中,“index.html#”未删掉,导致下载下来的grb一直打不开,师兄说是wget和request不识别#,所以下载不成功都是因为下载的是index.html,而不是数据;最终删掉可以下载并且正常打开了!
import os,sys
from datetime import datetime,timedelta
import bisect
import pandas as pd
import requests
def get_dates(year):
dates = []
# 5月31日
date_1 = datetime(year, 5, 31)
dates.append(date_1)
# 6月30日
date_2 = datetime(year, 6, 30)
dates.append(date_2)
# 7月30日
date_3 = datetime(year, 7, 30)
dates.append(date_3)
# 8月29日
date_4 = datetime(year, 8, 29)
dates.append(date_4)
return dates
def generate_monthly_intervals(start_year_month, end_year_month):
date_format = "%Y%m"
date_intervals = []
# 将起始日期和结束日期转换为 datetime 对象
start_date = datetime.strptime(start_year_month, date_format)
end_date = datetime.strptime(end_year_month, date_format)
# 按照每隔一个月的间隔生成日期,并添加到日期间隔列表中
current_date = start_date
while current_date <= end_date:
date_intervals.append(current_date.strftime(date_format))
year = current_date.year
month = current_date.month
if month == 12:
year += 1
month = 1
else:
month += 1
current_date = datetime(year, month, 1)
return date_intervals
def download_file(url, save_path):
try:
response = requests.get(url)
response.raise_for_status() # Check for any error in the response
with open(save_path, 'wb') as file:
file.write(response.content)
print(f"File downloaded successfully to: {save_path}")
except requests.exceptions.RequestException as e:
print(f"Error downloading the file: {e}")
def download_cfs_his(init,date_interval):
'''
下载历史数据
'''
YYYY = init[:4]
YYYYMM = init[:6]
YYYYMMDD = init[:8]
YYYYMM_pre = date_interval
url_root = "https://www.ncei.noaa.gov/oa/prod-cfs-reforecast/high-priority-subset/monthly-means-9-month"
#url_sfc = f"{url_root}/6-hourly-flux/{YYYY}/{YYYYMM}/{YYYYMMDD}/{init}"
valid = YYYYMMDD+'00'
url_sfc = f"{url_root}/{YYYY}/{YYYYMM}/{YYYYMMDD}/flxf{valid}.01.{YYYYMM_pre}.avrg.grb2"
#url_sfc = f"{url_root}/{YYYY}/{YYYYMM}/{YYYYMMDD}"
#os.system(f"wget {url_sfc}/flxf{valid}.01.{YYYYMM_pre}.avrg.grb2")
wrk_dir = f"E:/seasonyield_predict_2/datapre/cfs_hindcast/grib_his2"
if not os.path.exists(wrk_dir):
os.makedirs(wrk_dir)
os.chdir(wrk_dir)
filename = f"flxf{valid}.01.{YYYYMM_pre}.avrg.grb2"
download_file(url_sfc, filename)
if __name__ == "__main__":
for year in range(1987,2011):
result_dates = get_dates(year)
for date in result_dates:
#date=result_dates[1]
init=date.strftime("%Y%m%d")
###预报月份
start_year_month = init[:6]
end_year_month = str(year)+'09'
# 生成日期列表
result_intervals = generate_monthly_intervals(start_year_month, end_year_month)
# 输出日期列表
for i in range(1,len(result_intervals)):
date_interval=result_intervals[i]
download_cfs_his(init,date_interval)