如何为python http连接指定经过身份验证的代理?

时间:2020-03-05 18:44:52  来源:igfitidea点击:

在python中为HTTP连接指定带有用户名和密码的代理的最佳方法是什么?

解决方案

回答

这对我有用:

import urllib2

proxy = urllib2.ProxyHandler({'http': 'http://
username:password@proxyurl:proxyport'})
auth = urllib2.HTTPBasicAuthHandler()
opener = urllib2.build_opener(proxy, auth, urllib2.HTTPHandler)
urllib2.install_opener(opener)

conn = urllib2.urlopen('http://python.org')
return_str = conn.read()

回答

进行需要身份验证的代理的最佳方法是使用urllib2来构建自定义url打开器,然后使用该URL发出要通过代理进行的所有请求。特别要注意的是,我们可能不想将代理密码嵌入url或者python源代码中(除非这只是一个快速的技巧)。

import urllib2

def get_proxy_opener(proxyurl, proxyuser, proxypass, proxyscheme="http"):
    password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
    password_mgr.add_password(None, proxyurl, proxyuser, proxypass)

    proxy_handler = urllib2.ProxyHandler({proxyscheme: proxyurl})
    proxy_auth_handler = urllib2.ProxyBasicAuthHandler(password_mgr)

    return urllib2.build_opener(proxy_handler, proxy_auth_handler)

if __name__ == "__main__":
    import sys
    if len(sys.argv) > 4:
        url_opener = get_proxy_opener(*sys.argv[1:4])
        for url in sys.argv[4:]:
            print url_opener.open(url).headers
    else:
        print "Usage:", sys.argv[0], "proxy user pass fetchurls..."

在更复杂的程序中,我们可以根据需要将这些组件分开(例如,在应用程序的生命周期内仅使用一个密码管理器)。 python文档提供了更多有关如何使用urllib2进行复杂操作的示例,我们可能会发现它们也很有用。

回答

或者,如果我们想安装它,以便它始终与urllib2.urlopen一起使用(因此我们无需保留对打开器的引用):

import urllib2
url = 'www.proxyurl.com'
username = 'user'
password = 'pass'
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
# None, with the "WithDefaultRealm" password manager means
# that the user/pass will be used for any realm (where
# there isn't a more specific match).
password_mgr.add_password(None, url, username, password)
auth_handler = urllib2.HTTPBasicAuthHandler(password_mgr)
opener = urllib2.build_opener(auth_handler)
urllib2.install_opener(opener)
print urllib2.urlopen("http://www.example.com/folder/page.html").read()

回答

像这样设置一个名为http_proxy的环境变量:http:// username:password @ proxy_url:port