python requests 庫中的 SSL 證書驗證

現在很多網站都要求使用 HTTPS 協議,但是有些網站可能並沒有設置好 HTTPS 證書,或者網站的 HTTPS 證書不被 CA 機構認可,這時候,這些網站可能就會出現 SSL 證書錯誤的提示。

比如這個示例網站:https://static2.scrape.cuiqingcai.com/

如果我們用 Chrome 瀏覽器打開這個 URL,則會提示「您的連接不是私密連接」這樣的錯誤,如圖所示:

我們可以在瀏覽器中通過一些設置來忽略證書的驗證。
我們首先直接請求:

import requests

response = requests.get('https://static2.scrape.cuiqingcai.com/')
print(response.status_code)

請求的結果:

這裏直接拋出了SSLEror 錯誤,原因就是因爲我們請求的 URL 的證書是無效的。
那如果我們一定要爬取這個網站怎麼辦呢?我們可以使用 verify 參數 控制是否驗證證書,如果將其設置爲 False,在請求時就不會再驗證證書是否有效。如果不加 verify 參數的話,默認值是 True,會自動驗證。
我們改寫代碼如下:

import requests

response = requests.get('https://static2.scrape.cuiqingcai.com/', verify=False)
print(response.status_code)

運行結果:

InsecureRequestWarning: Unverified HTTPS request is being made to host 'static2.scrape.cuiqingcai.com'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  InsecureRequestWarning,
200

僅僅是給出了警告。 它建議我們可以通過設置忽略警告的方式來屏蔽警告信息 :

import requests
from requests.packages import urllib3

urllib3.disable_warnings()
response = requests.get('https://static2.scrape.cuiqingcai.com/', verify=False)
print(response.status_code)

或者我們也可以採用捕獲警告信息到日誌中的方式來忽略警告信息:

import logging
import requests
logging.captureWarnings(True)
response = requests.get('https://static2.scrape.cuiqingcai.com/', verify=False)
print(response.status_code)

當然,我們也可以指定一個本地證書用作客戶端證書,這可以是單個文件(包含密鑰和證書)或一個包含兩個文件路徑的元組:

import requests

response = requests.get('https://static2.scrape.cuiqingcai.com/', cert=('/path/server.crt', '/path/server.key'))
print(response.status_code)

當然,上面的代碼是演示實例,我們需要有 crt 和 key 文件,並且指定它們的路徑。另外注意,本地私有證書的 key 必須是解密狀態,加密狀態的 key 是不支持的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章