[英]Python: Disable http_proxy in urllib2
我使用代理集作為環境變量(導出 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: {}
urllib2 文檔建議以下應該工作。 這是您嘗試過的方法之一嗎?
import urllib2
proxy_handler = urllib2.ProxyHandler({})
opener = urllib2.build_opener(proxy_handler)
page = opener.open('http://www.google.com')
您可以將其放在要禁用系統代理的代碼之前。
import urllib2
urllib2.getproxies = lambda: {}
有時它比創建空的ProxyHandler
更好,因為它適用於外部庫,即使它們創建自己的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
使用系統代理設置,這會導致如下錯誤:
如果您想避免對一組已知站點使用代理,您可以使用no_proxy
環境變量,如下所示:
$ export no_proxy="google.com,stackoverflow.com,mysite.org:8080"
(以逗號分隔的主機名后綴列表,也可以指定端口)
這應該適用於urllib
和urllib2
。
另一種方法是像這樣對襪子庫進行猴子修補:
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,然后在不設置代理的情況下重試。 您將被上次設置的代理捕獲 :) 除非您為以下連接“取消設置”它。
您可以通過安裝 emtpy 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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.