2012-09-19 112 views
0

我正在嘗試維護到代理的連接池。我的代碼如下所示:urllib3 - 無法設置http代理

>>> from urllib3 import PoolManager 
>>> pool = PoolManager(10) 
>>> pool.urlopen('GET', 'http://http-server/index.html',fields=None,headers=None,encode_multipart=False,multipart_boundary=None,proxies={'http': 'http://proxy'}) 

當我運行它,它失敗:

> 
> Traceback (most recent call last): 
> File "<stdin>", line 1, in <module> 
> File "urllib3/poolmanager.py", line 117, in urlopen 
>  response = conn.urlopen(method, u.request_uri, **kw) 
> File "urllib3/connectionpool.py", line 427, in urlopen 
>  **response_kw) 
> File "urllib3/response.py", line 195, in from_httplib 
>  **response_kw) 
> TypeError: __init__() got an unexpected keyword argument 'proxies' 

任何想法,我做錯了什麼?根據urllib3文檔,關鍵字args被髮送到urlopen,但看起來在這種情況下不會發生。

這裏是鏈接到urllib描述代理關鍵字arg的用法。

回答

4

您鏈接到的文檔是Python的urllib,它是一個不同於urllib3的庫。當你調用urllib3的urlopen時,這與urllib的urlopen不一樣。對困惑感到抱歉。 :)

目前,與urllib3使用代理沒有很好的文檔。如果你想探索urllib3代碼,看看urllib3.poolmanager.ProxyManager.

否則,我建議嘗試請求,它簡化了urllib3上的代理功能。請參閱:http://docs.python-requests.org/en/latest/user/advanced/?highlight=proxy#proxies

您的代碼看起來像這樣。

>>> import requests 
>>> requests.get('http://http-server/index.html', proxies={'http': 'http://proxy'}) 

如果你仍然願意使用urllib3,然後使用ProxyManager會是這個樣子:

>>> import urllib3 
>>> http = urllib3.proxy_from_url('http://myproxy.com/') # This returns a ProxyManager object which has the same API as other ConnectionPool objects. 
>>> r = http.request('GET', 'http://http-server/index.html') 

你也可以創建自己的ProxyManager對象直接,但我更喜歡使用proxy_from_url快捷方式。

+0

謝謝。請求是否支持連接池? – feroze

+0

另外,如果可以的話,我寧願使用urllib3。你能給我示範代碼,展示如何使用代理? – feroze

+0

請求建立在urllib3之上,所以它支持所有相同的功能(以及更多),但在不同的API下。 我加了一個關於如何使用urllib3的ProxyManager的例子。如果你能夠正常工作,如果你考慮向urllib3提供一些文檔來幫助其他有相同問題的人,那將是非常好的。 :) – shazow