當使用urllib模塊爬去數(shù)據(jù)報以下錯誤時
raise URLError(err)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:748)>
錯誤原因:
Python 2.7.9 之后引入了一個新特性當你urllib.urlopen一個 https 的時候會驗證一次 SSL 證書 當目標使用的是自簽名的證書時就會爆出一個 urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)> 的錯誤消息
那么要解決這個問題翠胰,PEP-0476的文檔說
import ssl
# This restores the same behavior as before.
context = ssl._create_unverified_context()
urllib.urlopen("https://no-valid-cert", context=context)
It is also possible, though highly discouraged , to globally disable verification by monkeypatching the ssl module in versions of Python that implement this PEP:
import ssl
try:
_create_unverified_https_context = ssl._create_unverified_context
except AttributeError:
# Legacy Python that doesn't verify HTTPS certificates by default
pass
else:
# Handle target environment that doesn't support HTTPS verification
ssl._create_default_https_context = _create_unverified_https_context
就是說你可以禁掉這個證書的要求,urllib來說有兩種方式拗窃,一種是urllib.urlopen()有一個參數(shù)context,把他設成ssl. _create_unverified_context或者修改現(xiàn)在的全局默認值_create_unverified_https_context
或
ssl._create_default_https_context
實例:
就是說你可以禁掉這個證書的要求苔埋,urllib來說有兩種方式呼猪,一種是urllib.urlopen()有一個參數(shù)context,把他設成ssl. _create_unverified_context或者修改現(xiàn)在的全局默認值_create_unverified_https_context
或
ssl._create_default_https_context
實例:
import urllib.request,ssl
context = ssl._create_unverified_context()
res = urllib.request.Request('https://book.douban.com/latest?icn=index-latestbook-all ',headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36"})
res = urllib.request.urlopen(res)
設置ssl驗證關閉
print requests.get('https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=xxxxx&client_secret=xxxxxxxx', verify=False).content
urlretrieve函數(shù)下載ssl問題
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
url.request.retrieve(‘https:www.baidu.com’,’./url/1.html’)
用這個方法可以直接下載圖片:
url = ‘path‘
urllib.request.urlretrieve(url, ‘1.jpg’)
就會在本地下載一個url地址的圖片,保存在本地為1.jpg摘昌,注意在pycharm中老是報缺少引號的錯誤涕俗,這時只需要在url最后換行的時候加上一個\或者用”’三引號就行(因為換行時候相當于多了個換行符號)