【问题标题】:requests.exceptions.SSLError: [Errno 8] _ssl.c:504: EOF occurred in violation of protocolrequests.exceptions.SSLError: [Errno 8] _ssl.c:504: EOF 发生违反协议
【发布时间】:2013-09-07 17:15:34
【问题描述】:

我已经尝试了q&a 上的所有方法来解决它,但我仍然收到该错误。

我最近的尝试是基于Lukasa's comment,我的代码如下所示:

import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager
import ssl

class MyAdapter(HTTPAdapter):
    def init_poolmanager(self, connections, maxsize, block=False):
        self.poolmanager = PoolManager(num_pools=connections,
                                       maxsize=maxsize,
                                       block=block,
                                       ssl_version=ssl.PROTOCOL_TLSv1)

proxy = 'https://78.130.136.2:8080'
g = 'https://www.google.com/'


s = requests.Session()
s.mount('https://', MyAdapter())

r = s.get(g, proxies={'https': proxy} )
print r.text.encode('utf-8')

我收到的完整错误是:

Traceback (most recent call last):
  File "/Users/Dionysis_Lorentzos/Projects/getter/proxy.py", line 30, in <module>
    r = s.get(g, proxies={'https': proxy}, verify=True )
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/sessions.py", line 347, in get
    return self.request('GET', url, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/sessions.py", line 335, in request
    resp = self.send(prep, **send_kwargs)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/sessions.py", line 438, in send
    r = adapter.send(request, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/adapters.py", line 331, in send
    raise SSLError(e)
requests.exceptions.SSLError: [Errno 8] _ssl.c:504: EOF occurred in violation of protocol

那么如何通过https 使用代理获取站点数据? (代理在我的 Firefox 中运行良好)

【问题讨论】:

    标签: python ssl proxy python-requests http-proxy


    【解决方案1】:

    在 PyPI 上的所有请求版本中,不支持通过代理请求 HTTPS 站点,因为不支持 CONNECT 动词。我们 2.0 的预发布分支具有这种支持,它适用于我尝试过的每个代理。如果您想检查一下并尝试一下,那么您也不需要自定义适配器。

    否则,您将不得不等到我们发布 2.0

    【讨论】:

      【解决方案2】:

      您必须使用http 作为代理的协议(尽管您在上面使用https

      proxy = 'http://78.130.136.2:8080'
      

      但就像@sigmavirus24 所说,当前发布的请求版本在 http 代理方面存在一些问题。 通过此设置,您将能够使用代理(并非所有代理,但此代理特别有效)。

      小心: 在当前版本中,您和您的代理之间的数据未加密

      重复:代理和它之间的一切,你可以读取数据!

      【讨论】:

        猜你喜欢
        • 2012-12-15
        • 1970-01-01
        • 2012-07-31
        • 1970-01-01
        • 2015-05-13
        • 2016-03-17
        • 2016-01-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多