我们正在尝试开发一个Python模块,该模块将访问FTP服务器并将文件下载到我的本地计算机。当我们尝试运行模块的FTP部分时,它会超时。
我们有一个代理服务器(我们称之为“officeproxy.com:8080”)来处理这个问题,当使用像FileZilla或Windows资源管理器这样的FTP客户端访问FTP站点时,我们就成功了。
我们打电话给ftp网站“ftp.cal.com”。用户名是“papa”。密码是“tango123”。
到目前为止,我们已经:
Proxy = officeproxy.com:8080
FTP = ftp.cal.com
User = papa
PW = tango123
上面不是真正的实体,所以如果你想把它们换成真正的实体,那就做我的客人。
我需要一个模块来首先加载代理服务然后运行FTP部分。
我正在运行Python 2.7。
到目前为止,我已经搜索过并拥有此代码。 OP表示它只是一个测试FTP连接并读取一个文件的简短模块。
(注意:当我不知道填写或其他原因时,我故意将#
放在很多地方展示:
import urllib2
# I have filled in the proxy info
proxy_host = 'officeproxy.com:8080'
# I don't think this needs any modification, right?
proxy_handler = urllib2.ProxyHandler({'ftp': proxy_host})
# ditto here
proxy_auth_handler = urllib2.ProxyBasicAuthHandler()
# now here is where I am unsure what to put;
# also, I really need FTP user and FTP password, and NOT Proxy...
# so what do I need to change here?
proxy_auth_handler.add_password(None, proxy_host, proxy_user, proxy_passwd)
opener_thru_proxy = urllib2.build_opener(proxy_handler, proxy_auth_handler)
# I filled in this part
conn = opener_thru_proxy.open('ftp://ftp.cal.com/hello.txt')
# I don't believe I need to change this, right?
print conn.read()
答案 0 :(得分:0)
注意,我在SO上发现了一些similar questions,但是当OP请求详细的初学者级答案时,我决定发布此内容。
澄清一下,这是我对你想要完成的事情的理解:
一种选择是使用ftplib
包。 Python等流行语言的一大优势是提供了广泛的软件包选择,可以提供特定功能的良好实现。在这种情况下,ftp客户端:
import ftplib # 1
ftp = ftplib.FTP("officeproxy.com:8080") # 2
ftp.set_debuglevel(1) # 3
ftp.login("papa", "tango123") # 4
filename = "hello.txt"
f = open(filename, 'wb') # 5
ftp.retrbinary("RETR " + filename , f.write) # 6
f.close() # cleanup file handle
ftp.quit() # cleanup ftp client
这是代码正在做的事情:
ftplib
包。
FTP.set_debuglevel(level)
:0
,不产生调试输出...1
产生适量的调试输出......2
或更高产生最大调试量输出
"RETR" + filename
是发送到FTP服务器的命令,在本例中为RETR hello.txt
。第二个参数f.write
是回调函数,只要它有来自服务器的数据块,您希望ftp.retrbinary
函数调用。在其实施中,只要retrbinary
有数据,它就会调用f.write(data)
,其中data
是其拥有的最新数据块。要了解回调在Python中的工作原理,请参阅Introduction to Asynchronous APIs in Python 我希望这对您有用,我希望答案足够详细,让您了解它的工作原理。如果它不起作用,请发布堆栈跟踪输出以获取错误。
答案 1 :(得分:0)
这个问题有点过时了,但是我本人没有找到任何最新的解决方案,因此我想我会提供找到的解决方案。就我而言,办公室代理需要凭据,因此这些凭据将包含在解决方案中。我想如果您的代理不需要凭据,就可以删除proxy_user和proxy_passwd。我在Python 3.6中工作的代码是:
from ftplib import FTP
ftp = FTP("officeproxy.com")
ftp.set_debuglevel(1)
ftp.login(user='ftp_user@ftp_host proxy_user', passwd='ftp_passwd', acct='proxy_passwd')
# Do whatever you need on the FTP server here
ftp.quit()
我希望这会有所帮助。
答案 2 :(得分:0)
将其添加为最重要的结果之一,并且努力寻找解决方案。
如果您的代理服务器是 HTTP代理服务器,而您需要验证,则可以这样:
import socks
import socket
socks.set_default_proxy(socks.HTTP,
proxy_host,
proxy_port,
username=proxy_username,
password=proxy_password
)
socket.socket = socks.socksocket
ftp = FTP(ftp_host)
ftp.set_debuglevel(1)
ftp.login(
user=ftp_user,
passwd=ftp_password
)
否则,对于 FTP代理,马丁的答案有效。您也可以在FileZilla中看到FTP代理的行为,这将有助于为您的要求进行编码
希望这对某人有帮助!