我正在尝试下载一些公共数据文件。我使用screenscrape来获取文件的链接,所有这些都看起来像这样:
ftp://ftp.cdc.gov/pub/Health_Statistics/NCHS/nhanes/2001-2002/L28POC_B.xpt
我在Requests图书馆网站上找不到任何文档。1
提前致谢!
答案 0 :(得分:50)
requests
库不支持ftp链接。
要从FTP服务器下载文件,您可以:
import urllib
urllib.urlretrieve('ftp://server/path/to/file', 'file')
# if you need to pass credentials:
# urllib.urlretrieve('ftp://username:password@server/path/to/file', 'file')
或者:
import shutil
import urllib2
from contextlib import closing
with closing(urllib2.urlopen('ftp://server/path/to/file')) as r:
with open('file', 'wb') as f:
shutil.copyfileobj(r, f)
Python3:
import shutil
import urllib.request as request
from contextlib import closing
with closing(request.urlopen('ftp://server/path/to/file')) as r:
with open('file', 'wb') as f:
shutil.copyfileobj(r, f)
答案 1 :(得分:48)
你可以尝试这个
import ftplib
path = 'pub/Health_Statistics/NCHS/nhanes/2001-2002/'
filename = 'L28POC_B.xpt'
ftp = ftplib.FTP("Server IP")
ftp.login("UserName", "Password")
ftp.cwd(path)
ftp.retrbinary("RETR " + filename, open(filename, 'wb').write)
ftp.quit()
答案 2 :(得分:7)
使用urllib2。有关更多细节,请查看此example from doc.python.org:
以下是教程中可能有用的代码段
import urllib2
req = urllib2.Request('ftp://example.com')
response = urllib2.urlopen(req)
the_page = response.read()
答案 3 :(得分:7)
import os
import ftplib
from contextlib import closing
with closing(ftplib.FTP()) as ftp:
try:
ftp.connect(host, port, 30*5) #5 mins timeout
ftp.login(login, passwd)
ftp.set_pasv(True)
with open(local_filename, 'w+b') as f:
res = ftp.retrbinary('RETR %s' % orig_filename, f.write)
if not res.startswith('226 Transfer complete'):
print('Downloaded of file {0} is not compile.'.format(orig_filename))
os.remove(local_filename)
return None
return local_filename
except:
print('Error during download from FTP')
答案 4 :(得分:4)
正如几位人士所说,请求并不支持FTP,但Python有其他库可以支持。如果您想继续使用请求库,那么有一个requests-ftp包可以为请求添加FTP功能。我稍微使用了这个库,它确实有效。然而,文档中充满了关于代码质量的警告。截至0.2.0,文档说"这个图书馆在大约4个小时的总工作中被一起牛仔,没有测试,并依赖于一些丑陋的黑客"。
import requests, requests_ftp
requests_ftp.monkeypatch_session()
response = requests.get('ftp://example.com/foo.txt')
答案 5 :(得分:2)
尝试使用wget库进行python。您可以找到它的文档here。
import wget
link = 'ftp://example.com/foo.txt'
wget.download(link)
答案 6 :(得分:1)
urllib2.urlopen
处理ftp链接。
答案 7 :(得分:0)
urlretrieve对我不起作用,官方document说他们可能会在将来某个时候被弃用。
import shutil
from urllib.request import URLopener
opener = URLopener()
url = 'ftp://ftp_domain/path/to/the/file'
store_path = 'path//to//your//local//storage'
with opener.open(url) as remote_file, open(store_path, 'wb') as local_file:
shutil.copyfileobj(remote_file, local_file)
答案 8 :(得分:0)
如果您想利用最新Python版本的异步功能,可以使用aioftp(与更流行的aiohttp库来自同一系列的库和开发人员)。这是取自他们的client tutorial的代码示例:
client = aioftp.Client()
await client.connect("ftp.server.com")
await client.login("user", "pass")
await client.download("tmp/test.py", "foo.py", write_into=True)