我正在尝试维护代理连接池。我的代码如下所示:
>>> 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的用法。
答案 0 :(得分: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
快捷方式。