Python 3 - 通过无认证代理从网络服务器下载文件对象

-1 投票
1 回答
2499 浏览
提问于 2025-04-15 16:18

我遇到了一个非常简单的问题,真让人惊讶的是我居然没找到相关的解决方案。我想用Python3按照最佳实践来复制一个托管在网络服务器上的文件,而这个过程需要通过一个不需要认证的代理服务器。

我之前用Python 2.5做过类似的事情,但这次我真的遇到了困难。我想把这个过程做成一个可以在未来的脚本中重复使用的函数。如果有人能提供帮助,我将非常感激。

我感觉我的问题出在尝试使用urllib.request或http.client时,没有找到关于如何在不需要认证的情况下使用代理的清晰文档。

我一直在查找相关资料,快把头发都抓光了……
http://docs.python.org/3.1/library/urllib.request.html#urllib.request.ProxyHandler
http://docs.python.org/3.1/library/http.client.html
http://diveintopython3.org/http-web-services.html

甚至连这篇StackOverflow的文章:
Proxy with urllib2

但在Python3中,urllib2已经不再使用了……

1 个回答

1

这里有一个通过HTTP代理获取文件的函数:

import urllib.request

def retrieve( url, filename ):
    proxy = urllib.request.ProxyHandler( {'http': '127.0.0.1'} )
    opener = urllib.request.build_opener( proxy )
    remote = opener.open( url )
    local = open( filename, 'wb' )
    data = remote.read(100)
    while data:
        local.write(data)
        data = remote.read(100)
    local.close()
    remote.close()

(错误处理的部分留给读者自己去练习...)

如果你需要获取多个文件,可以把打开的对象保存起来,以便后续使用。内容会直接写入文件,但如果使用了复杂的编码,可能需要进行解码。

撰写回答