Python: 在urllib2中禁用http_proxy
我正在使用一个设置为环境变量的代理(export http_proxy=example.com)。在用urllib2进行一次调用时,我需要暂时禁用这个代理,也就是要取消设置http_proxy。我尝试了文档和网上推荐的各种方法,但到目前为止还没能成功取消代理设置。到现在为止,我尝试过:
# doesn't work
req = urllib2.Request('http://www.google.com')
req.set_proxy(None,None)
urllib2.urlopen(req)
# also doesn't work
urllib.getproxies = lambda x = None: {}
5 个回答
3
如果你想在访问一些特定的网站时不使用代理,可以使用一个叫做 no_proxy
的环境变量,方法如下:
$ export no_proxy="google.com,stackoverflow.com,mysite.org:8080"
(这里可以写一个用逗号分开的主机名后缀列表,也可以指定端口)
这个方法在 urllib
和 urllib2
中都可以用。
6
你可以在想要禁用系统代理的代码前面放这段代码。
import urllib2
urllib2.getproxies = lambda: {}
有时候,这比创建一个空的 ProxyHandler
更好,因为它可以适用于外部库,即使那些库自己创建了 自己的 urllib2
打开器。
另外一种可能的方法是使用 contextmanager
装饰器暂时禁用代理,但我不能保证它在多线程环境下能正常工作:
import selenium
import urllib2
from contextlib import contextmanager
@contextmanager
def no_proxies():
orig_getproxies = urllib2.getproxies
urllib2.getproxies = lambda: {}
yield
urllib2.getproxies = orig_getproxies
with no_proxies():
driver = selenium.webdriver.Ie()
driver.get("http://google.com")
在这个例子中,我们阻止 python-selenium
使用系统代理设置,这样可以避免出现以下错误:
10
urllib2的文档里提到,建议你可以这样做。这是你尝试过的方法之一吗?
import urllib2
proxy_handler = urllib2.ProxyHandler({})
opener = urllib2.build_opener(proxy_handler)
page = opener.open('http://www.google.com')