2009-09-20 74 views
66

我打開網址:代理與urllib2的

site = urllib2.urlopen('http://google.com')

而我想要做的是同樣的方式與代理 我得到的地方告訴我連接:

site = urllib2.urlopen('http://google.com', proxies={'http':'127.0.0.1'})

但那也沒用。

我知道urllib2有類似代理處理程序的東西,但我不記得那個函數。

回答

130
proxy = urllib2.ProxyHandler({'http': '127.0.0.1'}) 
opener = urllib2.build_opener(proxy) 
urllib2.install_opener(opener) 
urllib2.urlopen('http://www.google.com') 
+1

嗨,@ZelluX,我只想對某些功能設置啓用了代理,意味着什麼我必須安裝和卸載每次調用該函數的開罐器? – satoru 2011-11-11 08:42:15

+0

@ Satoru.Logic也許你可以編寫一個裝飾器來簡化安裝/卸載過程? – ZelluX 2011-11-11 13:25:59

+2

似乎'urllib2'中沒有'uninstall'方法,但我們可以進行一次性代理設置;我們不是「安裝」開放者,而是創建一個「請求」對象,並使用開放者來「打開」它。 – satoru 2011-11-11 13:39:04

15

您必須安裝一個ProxyHandler

urllib2.install_opener(
    urllib2.build_opener(
     urllib2.ProxyHandler({'http': '127.0.0.1'}) 
    ) 
) 
urllib2.urlopen('http://www.google.com') 
+0

我得到 文件 「d:/桌面/桌面/ mygoogl」,第64行, 站點= url.urlopen('google.com) 文件「C:\ Python26 \ lib中\ urllib2.py 「,124行,在urlopen 返回_opener。開(網址,數據,超時) AttributeError的:ProxyHandler實例沒有屬性「打開」 – 2009-09-20 02:43:56

+0

我錯過了一個電話給urllib2.build_opener() – dcrosta 2009-09-20 02:51:44

6

要使用系統默認代理(例如,從http_support環境變量),當前請求以下工作(不安裝到的urllib2全球) :

url = 'http://www.example.com/' 
proxy = urllib2.ProxyHandler() 
opener = urllib2.build_opener(proxy) 
in_ = opener.open(url) 
in_.read() 
7

您可以使用環境變量設置代理。

import os 
os.environ['http_proxy'] = '127.0.0.1' 
os.environ['https_proxy'] = '127.0.0.1' 

urllib2會自動添加代理處理這種方式。您需要爲不同的協議分別設置代理,否則它們將失敗(無法通過代理),請參閱下文。

例如:

proxy = urllib2.ProxyHandler({'http': '127.0.0.1'}) 
opener = urllib2.build_opener(proxy) 
urllib2.install_opener(opener) 
urllib2.urlopen('http://www.google.com') 
# next line will fail (will not go through the proxy) (https) 
urllib2.urlopen('https://www.google.com') 

相反

proxy = urllib2.ProxyHandler({ 
    'http': '127.0.0.1', 
    'https': '127.0.0.1' 
}) 
opener = urllib2.build_opener(proxy) 
urllib2.install_opener(opener) 
# this way both http and https requests go through the proxy 
urllib2.urlopen('http://www.google.com') 
urllib2.urlopen('https://www.google.com') 
+0

你不應該使用eg os.environ ['http_proxy']在你的下面兩組例子中? – 2017-04-13 20:51:47

3

除了公認的答案: 我素文字給了我一個錯誤

File "c:\Python23\lib\urllib2.py", line 580, in proxy_open 
    if '@' in host: 
TypeError: iterable argument required 

的解決辦法是添加http:/ /在代理字符串前面:

proxy = urllib2.ProxyHandler({'http': 'http://proxy.xy.z:8080'}) 
opener = urllib2.build_opener(proxy) 
urllib2.install_opener(opener) 
urllib2.urlopen('http://www.google.com') 
0

另外設置代理的命令行會話 打開命令行下,您可能要運行腳本

netsh winhttp set proxy YourProxySERVER:yourProxyPORT 

在終端運行你的腳本。

1

如果我們想使用代理訪問網頁,也可以使用請求。 Python 3代碼:

>>> import requests 
>>> url = 'http://www.google.com' 
>>> proxy = '169.50.87.252:80' 
>>> requests.get(url, proxies={"http":proxy}) 
<Response [200]> 

也可以添加多個代理。

>>> proxy1 = '169.50.87.252:80' 
>>> proxy2 = '89.34.97.132:8080' 
>>> requests.get(url, proxies={"http":proxy1,"http":proxy2}) 
<Response [200]>