Python:在urllib2中禁用http_proxy

时间:2011-12-02 15:41:12

标签: python proxy environment-variables urllib2

我使用代理集作为环境变量(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 个答案:

答案 0 :(得分:9)

urllib2文档suggests以下内容应该有效。这是你尝试过的方法之一吗?

import urllib2

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

答案 1 :(得分:6)

您可以将其放在要禁用系统代理的代码之前。

import urllib2
urllib2.getproxies = lambda: {}

有时它比创建空ProxyHandler更好,因为它适用于外部库,即使它们创建their own urllib2 openers

另外可能的方法是使用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 and Chrome not working with Selenium2 Python

Unable to run IEDriverServer.exe with proxy set up in IE internet option

答案 2 :(得分:3)

如果您想避免对已知的一组网站使用代理,可以像这样使用no_proxy环境变量:

$ export no_proxy="google.com,stackoverflow.com,mysite.org:8080"

(以逗号分隔的主机名后缀列表,也可以指定端口)

这适用于urlliburllib2

答案 3 :(得分:0)

另一种方法是像这样对袜子库进行monkeypatching:

import socks, socket, urllib2
def create_connection(address, timeout=None, source_address=None):
    sock = socks.socksocket()
    sock.connect(address)
    return sock

socks.setdefaultproxy(None, None) # this does ["0.0.0.0"], [0]
socket.socket = socks.socksocket
socket.create_connection = create_connection
print urllib2.urlopen("http://httpbin.org/ip").read()

所以,似乎如果你至少在端口0.0.0.0将其设置为0,应该避免使用它,因为inet_aton()库不会接受0.0.0.0作为有效的IP。

显然我还没有真正检查过为什么...但确实有效。 最简单的检查方法是首先设置代理,使用任何库获取URL,然后重新尝试而不设置代理。除非你"未设置"否则你会被最后设定的代理人抓住:)它用于以下连接。

答案 4 :(得分:0)

您可以通过安装一个空的 ProxyHandler 来取消设置代理:

#!/usr/bin/python3
from urllib.request import urlopen, Request, ProxyHandler, build_opener, install_opener, urlretrieve

def unset_http_https_proxy():
    proxy_support = ProxyHandler()
    opener = build_opener(proxy_support)
    install_opener(opener)