访问 Python 中的 NOAA FTP 服务器
Accessing NOAA FTP server in Python
我正在尝试访问 NOAA FTP 服务器以下载多个数据集。日常数据每年365个文件,手动下载略显繁琐。我尝试使用 ftplib,但得到:
gaierror: [Errno 11001] getaddrinfo failed
下面是我的代码片段:
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 服务器,使用时只有 return 信号:
ping gml.noaa.gov
当我尝试 ping 完整 ftp link:
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, 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
您发布的 link 是一个网站 link,而不是 FTP link。
但是,这会在您的脚本开始时起作用:
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)
我正在尝试访问 NOAA FTP 服务器以下载多个数据集。日常数据每年365个文件,手动下载略显繁琐。我尝试使用 ftplib,但得到:
gaierror: [Errno 11001] getaddrinfo failed
下面是我的代码片段:
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 服务器,使用时只有 return 信号:
ping gml.noaa.gov
当我尝试 ping 完整 ftp link:
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, 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
您发布的 link 是一个网站 link,而不是 FTP link。
但是,这会在您的脚本开始时起作用:
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)