批量下载IGS气象文件(利用python爬虫下载igs的气象数据)

下载数据地址:https://cddis.nasa.gov/archive/gnss/data/dailyhttps://cddis.nasa.gov/archive/gnss/data/daily

首先先确认气象文件:

  • Meteorological data file(气象数据)

数据文件可以从 ftp://cddis.nasa.gov/gnss/data/ 下载。该路径下有 daily 和 hourly 两个路径,分别是按天的数据和按小时的数据。再进入下一层,则是按年份建立的目录。再下一层,是按一年的第多少天(Day of Year)为目录名建立的目录。比如想找2020年3月15日的数据按天的数据,经过计算知道那一天是2020年的第75天,所以进入ftp://cddis.nasa.gov/gnss/data/daily/2020/075目录下去寻找下载相应数据。

气象数据文件实例解析:

下面是 WUH200CHN_R_20200751000_01H_05M_MM.rnx 文件的内容。由文件名可知其为中国WUH2站点2020年3月15日10点的气象数据。从文件内容第一行也能看出是气象文件,第四行能看出地点。文件头中"# / TYPES OF OBSERV"这一行表示的本文件中有7个观测类型。观测类型的具体含义可参考 RINEX 标准的附录 A 20 Meteorological Data File -Header Section Description。"SENSOR POS XYZ/H"这一行指定了传感器所在的位置,"SENSOR MOD/TYPE/ACC"这些行指定了传感器的厂商、类型和精度。

数据部分是按时间顺序,每一个观测时间,采样"# / TYPES OF OBSERV"这一行对应的观测类型的数据值。比如数据的第一行表示2020年3月15日10点的气象数据,按顺序分别表示没有冰雹、相对湿度为26.3%,气压值为1013.5 mbar、从上次测量到现在没有累积降雨、干温度为20.7°、风向角327.4°、风速 0.2m/s。

cpp 复制代码
     3.04           METEOROLOGICAL DATA                     RINEX VERSION / TYPE
meteo_read 1.5.1    GFZ ODC             15-Mar-2020 10:02   PGM / RUN BY / DATE
gfzrnx-3078         FILE MERGE          20200315 105747 UTC COMMENT             
WUH200CHN                                                   MARKER NAME         
21602M007                                                   MARKER NUMBER       
     7    HI    HR    PR    RI    TD    WD    WS            # / TYPES OF OBSERV
        0.0000        0.0000        0.0000       25.1262 PR SENSOR POS XYZ/H    
Vaisala             wxt520                        0.3    TD SENSOR MOD/TYPE/ACC
Vaisala             wxt520                        0.5    PR SENSOR MOD/TYPE/ACC
Vaisala             wxt520                        3.0    HR SENSOR MOD/TYPE/ACC
Vaisala             wxt520                        3.0    WD SENSOR MOD/TYPE/ACC
Vaisala             wxt520                        0.3    WS SENSOR MOD/TYPE/ACC
Vaisala             wxt520                        5.0    RI SENSOR MOD/TYPE/ACC
Vaisala             wxt520                        0.1    HI SENSOR MOD/TYPE/ACC
gnss@gfz-potsdam.de WHU/GFZ                                 OBSERVER / AGENCY   
INITIAL_RINEX_VERSION: 2.1                                  COMMENT             
meteo_read 1.5.1    GFZ Potsdam         15-Mar-2020 10:02   COMMENT             
                           Sensor ID: G4540043              COMMENT             
Warning: the value -999.9 indicates no measurement at all   COMMENT             
Info   : Rain as increment of 1/10 mm                       COMMENT             
meteo_read 1.5.1    GFZ Potsdam         15-Mar-2020 10:17   COMMENT             
meteo_read 1.5.1    GFZ Potsdam         15-Mar-2020 10:32   COMMENT             
meteo_read 1.5.1    GFZ Potsdam         15-Mar-2020 10:47   COMMENT             
                                                            END OF HEADER      
 2020 03 15 10 00 00    0.0   26.3 1013.5    0.0   20.7  327.4    0.2
 2020 03 15 10 05 00    0.0   26.7 1013.6    0.0   20.6  304.5    0.1
 2020 03 15 10 10 00    0.0   27.6 1013.6    0.0   20.4  147.4    0.1
 2020 03 15 10 15 00    0.0   27.8 1013.6    0.0   20.2  330.8    0.1
 2020 03 15 10 20 00    0.0   27.8 1013.7    0.0   20.0  350.2    0.2
 2020 03 15 10 25 00    0.0   29.2 1013.7    0.0   19.7  184.4    0.2
 2020 03 15 10 30 00    0.0   29.2 1013.7    0.0   19.4  177.7    0.2
 2020 03 15 10 35 00    0.0   29.4 1013.7    0.0   19.2  168.7    0.1
 2020 03 15 10 40 00    0.0   30.0 1013.8    0.0   19.0  104.8    0.1
 2020 03 15 10 45 00    0.0   30.5 1013.8    0.0   18.7  144.6    0.1
 2020 03 15 10 50 00    0.0   31.1 1013.9    0.0   18.6  345.0    0.1
 2020 03 15 10 55 00    0.0   32.7 1013.9    0.0   18.4  223.2    0.1

批下载气象文件:首先要清楚自己的cddis.nasa.gov账号与密码

首先在自己电脑的c盘下建立一个文件**_netrc** 这个文件存储网站的账号与密码,例如

地址:C:\Users\ylx

cpp 复制代码
machine urs.earthdata.nasa.gov
login xxxxxxxxxxx
password **********

然后利用py进行数据批下载:

python 复制代码
import os
import time
import requests
import subprocess

start_year = 2020
end_year = 2025
station = "zimm"
save_dir = r"H:\zimm_met"

os.makedirs(save_dir, exist_ok=True)

session = requests.Session()

def is_leap_year(year):
    return (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)

for year in range(start_year, end_year + 1):

    yy = str(year)[-2:]
    folder = f"{yy}m"
    days = 366 if is_leap_year(year) else 365

    for doy in range(1, days + 1):

        doy_str = f"{doy:03d}"

        filename_z = f"{station}{doy_str}0.{yy}m.Z"
        filename_out = f"{station}{doy_str}0.{yy}m"

        url = f"https://cddis.nasa.gov/archive/gnss/data/daily/{year}/{doy_str}/{folder}/{filename_z}"

        z_path = os.path.join(save_dir, filename_z)
        out_path = os.path.join(save_dir, filename_out)

        # 已经下载过
        if os.path.exists(out_path):
            continue

        try:

            # ===== 先检测文件是否存在 =====
            head = session.head(url, timeout=20)

            if head.status_code != 200:
                print(year, doy_str, "不存在")
                continue

            # ===== 再下载 =====
            r = session.get(url, stream=True, timeout=60)

            with open(z_path, "wb") as f:
                for chunk in r.iter_content(65536):
                    if chunk:
                        f.write(chunk)

            # ===== 解压 =====
            subprocess.run(
                ["7z", "x", z_path, f"-o{save_dir}", "-y"],
                stdout=subprocess.DEVNULL,
                stderr=subprocess.DEVNULL
            )

            if os.path.exists(out_path):
                os.remove(z_path)
                print(year, doy_str, "完成")

        except Exception as e:
            print(year, doy_str, "错误", e)

        time.sleep(0.2)

print("\n全部完成")
相关推荐
biter down5 小时前
从 0 到 1 搭建 Python 接口自动化测试框架(博客系统实战)
开发语言·python
肖永威6 小时前
Python多业务并行计算框架插件化演进:从硬编码到动态注册
python·插件化·并行计算·动态注册
yz_aiks6 小时前
Linux Jar包配置Systemd自启动实战:从排查到配置全流程
linux·python·jar·自启动·systemd
不知名的老吴6 小时前
线程的生命周期之线程“插队“
java·开发语言·python
xsc6996757 小时前
从零搭建大模型与智能体平台 - 完整技术详解
python
无风听海9 小时前
多租户系统中的 OIDC:Discovery 端点与联合登录的深度实践
后端·python·flask
CTA终结者9 小时前
期货量化主力换月程序怎么移仓:天勤 underlying_symbol 与任务切换
python·区块链
马士兵教育9 小时前
Java还有前景吗?Java+AI大模型学习路线及项目?
java·人工智能·python·学习·机器学习
KaMeidebaby10 小时前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
Cloud_Shy61810 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第五章 Item 30 - 32)
开发语言·人工智能·笔记·python·学习方法