用 Python 访问 NOAA FTP 服务器

Posted

技术标签:

【中文标题】用 Python 访问 NOAA FTP 服务器【英文标题】:Accessing NOAA FTP server in Python 【发布时间】:2021-08-16 04:15:26 【问题描述】:

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

gaierror: [Errno 11001] getaddrinfo 失败

下面是我的代码sn-p:

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 链接时:

pinghttps://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, passwd, acct)

c:\users\smnge\anaconda3\envs\dlgpu\lib\ftplib.py in connect(self, host, port, timeout, 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, timeout, source_address)
    705     host, port = address
    706     err = None
--> 707     for res in getaddrinfo(host, port, 0, SOCK_STREAM):
    708         af, socktype, proto, canonname, sa = res
    709         sock = None

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

gaierror: [Errno 11001] getaddrinfo failed

【问题讨论】:

FTP("https https 看起来不正确。并且与您的堆栈跟踪不匹配 无需关闭,代码可以很好地重现并且信息是完整的 - 但是,@SGotham 不应该在以后的帖子中将引用发布为图像,而是将回溯发布为文本以及.如果您愿意更新问题,它将提高质量和对其他人的有用性。 @njzk2,感谢您的快速回复。您的建议确实有助于获得访问权限。现在我遇到了另一个写入本地磁盘的问题。我无法在这里发布完整的错误,您有什么建议,如何将所有文件复制到本地磁盘。 谢谢 - 如果下面的答案是足够的,请用复选标记接受它,所以问题不再显示为未回答。 相关文档:docs.python.org/3/library/ftplib.html 第一个参数是主机,不是完整的uri。 【参考方案1】:

您发布的链接是网站链接,而不是 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 服务器是一个非常常见的约定,就像您在网站上看到 www.example.com 一样(并且仍然做)。

删除aftp/ 是另一种猜测,在该站点不允许更改到该文件夹​​之后,但由于 URL 是一个网站,因此假设 aftp 文件夹实际上只是匿名 FTP 的根目录是有道理的,这就是您正在执行的操作 - 无需凭据即可登录。

一个可行的解决方案:

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 的复杂性:

    ftp.retrbinary(f'RETR file', open(rf'C:\Temp\file', 'wb').write)

【讨论】:

以上是关于用 Python 访问 NOAA FTP 服务器的主要内容,如果未能解决你的问题,请参考以下文章

用mapreduce 处理气象数据集

用mapreduce 处理气象数据集

用mapreduce 处理气象数据集

用mapreduce 处理气象数据集

用mapreduce 处理气象数据集

用mapreduce 处理气象数据集