如何为python http连接指定经过身份validation的代理?
在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()
设置一个名为http_proxy的环境variables就像这样: http:// username:password @ proxy_url:port
通过需要身份validation的代理的最佳方式是使用urllib2来构build自定义的url开启者,然后使用它来创build所有您想要通过代理的请求。 特别要注意的是,你可能不希望将代理密码embedded到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..."
在一个更复杂的程序中,可以根据需要将这些组件分开(例如,在应用程序的整个生命周期中只使用一个密码pipe理器)。 python文档有更多关于如何使用urllib2来做复杂的事情的例子 ,你也可能会觉得有用。
或者如果你想安装它,所以它总是与urllib2.urlopen一起使用(所以你不需要保持对opener的引用):
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()
这里是使用urllib的方法
import urllib.request # set up authentication info authinfo = urllib.request.HTTPBasicAuthHandler() proxy_support = urllib.request.ProxyHandler({"http" : "http://ahad-haam:3128"}) # build a new opener that adds authentication and caching FTP handlers opener = urllib.request.build_opener(proxy_support, authinfo, urllib.request.CacheFTPHandler) # install it urllib.request.install_opener(opener) f = urllib.request.urlopen('http://www.python.org/') """
用这个:
import requests proxies = {"http":"http://username:password@proxy_ip:proxy_port"} r = requests.get("http://www.example.com/", proxies=proxies) print r.content
我认为这比使用urllib
简单得多。 我不明白为什么人们非常喜欢使用urllib
。