Python3處理HTTPS請求 SSL證書驗證html
金融類的公司網站通常都是https 開頭的網站,urllib.request能夠爲 HTTPS 請求驗證SSL證書,就像web瀏覽器同樣,若是網站的SSL證書是通過CA認證的,則可以正常訪問,如:web
例子一:編寫一個https請求程序訪問(平安好夥伴出單系統)瀏覽器
from urllib import parse安全
import urllib.request服務器
url = 'https://icore-pts.pingan.com.cn/ebusiness/login.jsp'jsp
headers ={網站
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36",url
}操作系統
# url 做爲Request()方法的參數,構造並返回一個Request對象code
request = urllib.request.Request(url,headers=headers)
# Request對象做爲urlopen()方法的參數,發送給服務器並接收響應
response = urllib.request.urlopen(request)
html = response.read().decode('utf-8')
print(html)
經過例子,是能夠正常訪問的,由於網站的SSL證書是通過CA認證的。
若是SSL證書驗證不經過,或者操做系統不信任服務器的安全證書,好比瀏覽器在訪問12306網站如:https://www.12306.cn/mormhweb/的時候,會警告用戶證書不受信任。(聽說 12306 網站證書是本身作的,沒有經過CA認證)
例子二:編寫一個https請求程序訪問(12306網站)
from urllib import parse
import urllib.request
url = 'https://www.12306.cn/mormhweb/'
headers ={
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36",
}
# url 做爲Request()方法的參數,構造並返回一個Request對象
request = urllib.request.Request(url,headers=headers)
# Request對象做爲urlopen()方法的參數,發送給服務器並接收響應
response = urllib.request.urlopen(request)
html = response.read().decode('utf-8')
print(html)
運行結果:
運行報錯:ssl.CertificateError: hostname 'www.12306.cn' doesn't match either of 'webssl.chinanetcenter.com'
經過查看urllib.request庫源碼文件
若是網站的SSL證書是通過CA認證,就須要單獨處理SSL證書,讓程序忽略SSL證書驗證錯誤,便可正常訪問。
例子三:12306網站或略SSL證書驗證
from urllib import parse
import urllib.request
# 1. 導入Python SSL處理模塊
import ssl
# 2. 表示忽略未經覈實的SSL證書認證
context = ssl._create_unverified_context()
url = 'https://www.12306.cn/mormhweb/'
headers ={
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36",
}
# url 做爲Request()方法的參數,構造並返回一個Request對象
request = urllib.request.Request(url,headers=headers)
# Request對象做爲urlopen()方法的參數,發送給服務器並接收響應
# 3. 在urlopen()方法裏 指明添加 context 參數
response = urllib.request.urlopen(request,context = context)
html = response.read().decode('utf-8')
print(html)
運行結果:
經過例子,證實咱們的處理是成功的。