微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用 Python 访问 NOAA FTP 服务器

如何解决用 Python 访问 NOAA FTP 服务器

我正在尝试访问 NOAA FTP 服务器以下载多个数据集。日常数据每年有365个文件,手动下载有点麻烦。我尝试使用 ftplib,但得到了:

gaierror: [Errno 11001] getaddrinfo 失败

以下是我的代码片段:

from ftplib import FTP
ftp = FTP("https://gml.noaa.gov/aftp/data/radiation/surfrad/Boulder_CO/2020/")
ftp.login()

# Get all files
files = ftp.nlst()

# Print out the files:
for file in files:
    print("Downloading..." + file)
    ftp.retrbinary("RETR" + file,open("..../NOAA/surfrad/Boulder_CO/2020/" + file,'wb').write)
ftp.close()

对此的任何帮助将不胜感激。 我也尝试 ping 服务器,它只在使用时返回信号:

ping gml.noaa.gov

当我尝试 ping 完整的 ftp 链接时:

ping https://gml.noaa.gov/aftp/data/radiation/surfrad/Boulder_CO/2020

它没有。 不知道为什么会这样。

完整的回溯是:

---------------------------------------------------------------------------
gaierror                                  Traceback (most recent call last)
<ipython-input-102-ea6ae149ac16> in <module>
      1 start = datetime.Now()
----> 2 ftp = FTP("ftp://aftp.cmdl.noaa.gov/data/radiation/surfrad/Boulder_CO/2020")
      3 # ftp.login('your-username','your-passwor')
      4 ftp.login()
      5 

c:\users\smnge\anaconda3\envs\dlgpu\lib\ftplib.py in __init__(self,host,user,passwd,acct,timeout,source_address)
    115         self.timeout = timeout
    116         if host:
--> 117             self.connect(host)
    118             if user:
    119                 self.login(user,acct)

c:\users\smnge\anaconda3\envs\dlgpu\lib\ftplib.py in connect(self,port,source_address)
    150             self.source_address = source_address
    151         self.sock = socket.create_connection((self.host,self.port),self.timeout,--> 152                                              source_address=self.source_address)
    153         self.af = self.sock.family
    154         self.file = self.sock.makefile('r',encoding=self.encoding)

c:\users\smnge\anaconda3\envs\dlgpu\lib\socket.py in create_connection(address,source_address)
    705     host,port = address
    706     err = None
--> 707     for res in getaddrinfo(host,SOCK_STREAM):
    708         af,socktype,proto,canonname,sa = res
    709         sock = None

c:\users\smnge\anaconda3\envs\dlgpu\lib\socket.py in getaddrinfo(host,family,type,flags)
    750     # and socket type values to enum constants.
    751     addrlist = []
--> 752     for res in _socket.getaddrinfo(host,flags):
    753         af,sa = res
    754         addrlist.append((_intenum_converter(af,AddressFamily),gaierror: [Errno 11001] getaddrinfo Failed

解决方法

您发布的链接是网站链接,而不是 FTP 链接。

但是,这将在您的脚本开始时起作用:

from ftplib import FTP
ftp = FTP("ftp.gml.noaa.gov")
ftp.login()
ftp.cwd('data/radiation/surfrad/Boulder_CO/2020')

# Get all files
files = ftp.nlst()

# etc ...

请注意,https:// 已消失,ftp. 已添加到域的开头,并且路径已使用单独的命令更改,缺少 aftp/ 根。

https:// 只是一个错误,它清楚地表明 URI 是一个网站 URL,可以使用 HTTPS 检索。

域开头的 ftp. 只是一个猜测,但在 ftp.example.com 处托管 FTP 服务器是一个非常常见的约定,就像您以前看到的 {{1} } 用于网站(现在仍然如此)。

删除 www.example.com 是另一种猜测,因为该站点不允许更改到该文件夹​​,但由于 URL 是一个网站,因此假设 aftp/ 文件夹实际上只是匿名 FTP 的 root,这就是您正在做的 - 无需凭据登录。

一个可行的解决方案:

aftp

或者,如果您不喜欢 from ftplib import FTP from pathlib import Path ftp = FTP("ftp.gml.noaa.gov") ftp.login() ftp.cwd('data/radiation/surfrad/Boulder_CO/2020') # Get all files files = ftp.nlst() # Download all the files to C:\Temp for file in files: print("Downloading..." + file) ftp.retrbinary(f'RETR {file}',open(str(Path(r'C:\Temp') / file),'wb').write) ftp.close() 的复杂性:

pathlib

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。