python使用requests時報錯requests.exceptions.SSLError: HTTPSConnectionPool

來源:互聯網
上載者:User

標籤:cep   file   pos   分享圖片   ocs   eth   trie   sed   api   

報錯資訊
Traceback (most recent call last):File "<stdin>", line 1, in <module>File "D:\python\lib\site-packages\requests-2.18.3-py2.7.egg\requests\api.py", line 72, in getreturn request(‘get‘, url, params=params, **kwargs)File "D:\python\lib\site-packages\requests-2.18.3-py2.7.egg\requests\api.py", line 58, in requestreturn session.request(method=method, url=url, **kwargs)File "D:\python\lib\site-packages\requests-2.18.3-py2.7.egg\requests\sessions.py", line 508, in requestresp = self.send(prep, **send_kwargs)File "D:\python\lib\site-packages\requests-2.18.3-py2.7.egg\requests\sessions.py", line 640, in sendhistory = [resp for resp in gen] if allow_redirects else []File "D:\python\lib\site-packages\requests-2.18.3-py2.7.egg\requests\sessions.py", line 218, in resolve_redirects**adapter_kwargsFile "D:\python\lib\site-packages\requests-2.18.3-py2.7.egg\requests\sessions.py", line 618, in sendr = adapter.send(request, **kwargs)File "D:\python\lib\site-packages\requests-2.18.3-py2.7.egg\requests\adapters.py", line 506, in sendraise SSLError(e, request=request)requests.exceptions.SSLError: HTTPSConnectionPool(host=‘www.baidu.com‘, port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, u‘[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)‘),))

 

 

過程測試1

不指定headers時GET:

>>> import requests>>> requests.get(‘http://www.baidu.com/‘)<Response [200]>>>> requests.get(‘http://www.baidu.com/‘)<Response [200]>>>> requests.get(‘http://www.baidu.com/‘)<Response [200]>>>> header = {‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1‘,}>>> requests.get(‘http://www.baidu.com/‘, headers = header)<Response [200]>

  


測試2

當指定headers的User-Agent為Firefox瀏覽器時:

>>> header = {‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1‘,}>>> requests.get(‘http://www.baidu.com/‘, headers = header)<Response [200]>>>> requests.get(‘http://www.baidu.com/‘, headers = header)Traceback (most recent call last):File "<stdin>", line 1, in <module>File "D:\python\lib\site-packages\requests-2.18.3-py2.7.egg\requests\api.py", line 72, in getreturn request(‘get‘, url, params=params, **kwargs)File "D:\python\lib\site-packages\requests-2.18.3-py2.7.egg\requests\api.py", line 58, in requestreturn session.request(method=method, url=url, **kwargs)File "D:\python\lib\site-packages\requests-2.18.3-py2.7.egg\requests\sessions.py", line 508, in requestresp = self.send(prep, **send_kwargs)File "D:\python\lib\site-packages\requests-2.18.3-py2.7.egg\requests\sessions.py", line 640, in sendhistory = [resp for resp in gen] if allow_redirects else []File "D:\python\lib\site-packages\requests-2.18.3-py2.7.egg\requests\sessions.py", line 218, in resolve_redirects**adapter_kwargsFile "D:\python\lib\site-packages\requests-2.18.3-py2.7.egg\requests\sessions.py", line 618, in sendr = adapter.send(request, **kwargs)File "D:\python\lib\site-packages\requests-2.18.3-py2.7.egg\requests\adapters.py", line 506, in sendraise SSLError(e, request=request)requests.exceptions.SSLError: HTTPSConnectionPool(host=‘www.baidu.com‘, port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, u‘[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)‘),))

  


分析

現象:第一次GET時正常,第二次GET時,會報錯.

不同點:User-Agent不相同

分析:由於報錯SSL認證驗證失敗,所以這次的訪問應該是https協議.但是我們明明使用的是http,所以,猜測訪問該網站後,被重新導向到了https://www.baidu.com/

驗證

首先,進行GET時,關閉認證驗證.因為,如果不關閉,請求總是失敗,不能擷取到重新導向的資訊.

>>> response = requests.get(‘http://www.baidu.com/‘, headers = header, verify=False)D:\python\lib\site-packages\urllib3\connectionpool.py:858: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warningsInsecureRequestWarning)>>> response.history[<Response [302]>]>>> response.urlu‘https://www.baidu.com/‘

 

當不指定User-Agent時

>>> response = requests.get(‘http://www.baidu.com/‘, verify=False)>>> response.history[]>>> response.urlu‘http://www.baidu.com/‘

結論

當指定headers的User-Agent時,baidu的伺服器會重新導向到https的網址.因此報出SSL驗證失敗的錯誤.

解決方案方法1:

在進行GET時,指定SSL認證.詳情見附件

方法2:

關閉認證驗證. 詳情見附件

 

附件

[各瀏覽器的User-Agent] http://www.useragentstring.com/pages/useragentstring.php

[SSL 憑證驗證] http://docs.python-requests.org/zh_CN/latest/user/advanced.html#ssl

 

 

 轉自:77142100

 

python使用requests時報錯requests.exceptions.SSLError: HTTPSConnectionPool

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.