如何为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