我使用代理集作为环境变量(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: {}
答案 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"
(以逗号分隔的主机名后缀列表,也可以指定端口)
这适用于urllib
和urllib2
。
答案 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)