【问题标题】:urllib3 - unable to set a http proxyurllib3 - 无法设置 http 代理
【发布时间】:2012-09-19 17:38:02
【问题描述】:

我正在尝试维护一个与代理的连接池。我的代码如下所示:

>>> 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 的用法。

【问题讨论】:

    标签: http proxy urllib3


    【解决方案1】:

    您链接到的文档是 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 快捷方式。

    【讨论】:

    • 谢谢。请求是否支持连接池?
    • 另外,如果可以的话,我更愿意使用 urllib3。你能给我展示如何使用代理的示例代码吗?
    • Requests 构建在 urllib3 之上,因此它支持所有相同的功能(以及更多功能),但使用不同的 API。我添加了一个如何使用 urllib3 的 ProxyManager 的示例。如果你让事情顺利进行,那么如果你考虑向 urllib3 贡献一些文档来帮助其他有同样问题的人,那就太好了。 :)
    • 当然,我可以贡献文档。让我知道在哪里/如何。
    • 太棒了!只需前往github.com/shazow/urllib3,创建一个分支,对docs 目录下的文档进行更改,然后发送拉取请求。 :) 如果您有任何其他问题,我们可以在 Github 上的 pull request 线程中讨论。
    猜你喜欢
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    相关资源
    最近更新 更多