【发布时间】:2014-08-07 12:33:29
【问题描述】:
我想访问一个 ftp 服务器,匿名的,只是为了下载。我的公司有一个代理,并且 ftp 端口(21)被阻止。我无法直接访问 ftp 服务器。
我要做的是编写一些行为与浏览器完全相同的代码。这个想法是,如果我可以用我的浏览器下载文件,那么就有办法用代码来完成。
当我尝试访问公司以外的网站时,我的代码可以正常工作,但仍然无法用于 ftp 服务器。
proxy = urllib2.ProxyHandler({'https': 'proxy.mycompanhy.com:8080',
'http': 'proxy.mycompanhy.com:80',
'ftp': 'proxy.mycompanhy.com:21' })
auth = urllib2.HTTPBasicAuthHandler()
opener = urllib2.build_opener(proxy, auth, urllib2.HTTPHandler)
urllib2.install_opener(opener)
urlAddress = 'https://python.org'
# urlAddress = 'ftp://ftp1.cptec.inpe.br'
conn = urllib2.urlopen(urlAddress)
return_str = conn.read()
print return_str
当我尝试访问 python.org 时,它工作正常。如果我删除 install_opener 部分,它不再工作,证明需要代理。 当我使用 ftp url 时,它会阻塞(如果我选择使用这些参数,则会超时)。
我知道 ftp 和 http 是两个非常不同的协议。 我不明白的是浏览器用来访问这些 ftp 服务器的机制。 我的意思是,我不知道服务器端是否有一个在 http 和 ftp 之间进行接口的层,用于检索 html;或者如果浏览器以其他方式访问 ftp 并构建页面。
ftp 域(或 url)和连接模式也可能存在混淆。在我看来,当 urllib2 读取 ftp://... 时,它会自动使用端口 21。
【问题讨论】:
-
我想这就是你要找的东西code.activestate.com/recipes/…
-
我已经尝试过这个 HTTP Tunel,但它对我不起作用。它因“getaddrinfo failed”消息而崩溃,这是我通常在不使用代理时收到的消息。我在 ProxySock 类中添加断点,但代码从未执行过。
-
HTTP Tunel 崩溃,因为它无法解析 ftp 地址:需要有代理,在创建 FTP 连接时没有启动。
-
希望对我有所帮助:-)