Python: 在urllib2中禁用http_proxy

12 投票
5 回答
10700 浏览
提问于 2025-04-17 07:33

我正在使用一个设置为环境变量的代理(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"

(这里可以写一个用逗号分开的主机名后缀列表,也可以指定端口)

这个方法在 urlliburllib2 中都可以用。

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 使用系统代理设置,这样可以避免出现以下错误:

IE 和 Chrome 在使用 Selenium2 Python 时无法正常工作

无法在 IE 的网络选项中设置代理的情况下运行 IEDriverServer.exe

10

urllib2的文档里提到,建议你可以这样做。这是你尝试过的方法之一吗?

import urllib2

proxy_handler = urllib2.ProxyHandler({})
opener = urllib2.build_opener(proxy_handler)
page = opener.open('http://www.google.com')

撰写回答