1

プロキシへの接続のプールを維持しようとしています。私のコードは次のようになります。

>>> 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 docs によると、キーワード引数は urlopen に送信されますが、この場合は発生していないようです。

これは、 proxy キーワード arg の使用法を説明するurllibへのリンクです。

4

1 に答える 1

5

リンク先のドキュメントは、urllib3 とは異なるライブラリである Python の urllib に対するものです。urllib3 の urlopen を呼び出すと、それは urllib のものと同じ urlopen ではありません。混乱させて申し訳ありません。:)

現時点では、urllib3 でプロキシを使用することについて十分に文書化されていません。urllib3 コードを調べたい場合は、以下をご覧ください。urllib3.poolmanager.ProxyManager.

それ以外の場合は、urllib3 の上でプロキシ機能を合理化する Requests を試すことをお勧めします。参照: 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ショートカットを使用することをお勧めします。

于 2012-09-19T17:55:58.817 に答える