簡體   English   中英

Python:在 urllib2 中禁用 http_proxy

[英]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使用系統代理設置,這會導致如下錯誤:

IE 和 Chrome 不支持 Selenium2 Python

無法運行 IEDriverServer.exe 並在 IE Internet 選項中設置代理

如果您想避免對一組已知站點使用代理,您可以使用no_proxy環境變量,如下所示:

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

(以逗號分隔的主機名后綴列表,也可以指定端口)

這應該適用於urlliburllib2

另一種方法是像這樣對襪子庫進行猴子修補:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM