requests库的使用—SSL证书验证

现在很多网站要求使用HTTPS协议,但是有些网站可能并没有设置好HTTPS证书,或者网站的HTTPS证书可能并不被CA机构认可,这时这些网站就可能出现SSL证书错误的提示。

例如这个示例网站:https://ssr2.scrape.center/,如果用Chrome浏览器打开它,则会提示“您的连接不是私密连接”这样的错误,如下图所示:

requests库的使用—SSL证书验证_HTTPS

我们可以在浏览器中通过一些设置来忽略证书的验证。但是如果想用requests库来请求这类网站,又会遇到什么问题呢?我们用代码试一下:

import requests

response = requests.get('https://ssr2.scrape.center/')
print(response.status_code)

运行结果如下:

requests库的使用—SSL证书验证_HTTPS_02

可以看到,直接抛出了SSLError错误,原因是我们请求的URL的证书是无效的。

那如果我们一定要爬取这个网站,应该怎么做呢?可以使用verify参数控制是否验证证书,如果将此参数设置为False,那么在请求时就不会再验证证书是否有效。如果不设置verify参数,其默认值是True,会自动验证。

于是我们改写代码如下:

import requests

response = requests.get('https://ssr2.scrape.center/',verify=False)
print(response.status_code)

运行结果如下:

requests库的使用—SSL证书验证_网络协议_03

不过我们发现其中报了一个警告,它建议我们给它指定证书。我们可以通过设置忽略经过的方式来屏蔽这个警告:

import requests
from requests.packages import urllib3

urllib3.disable_warnings()
response = requests.get('https://ssr2.scrape.center/', verify=False)
print(response.status_code)

或者通过捕获警告道日志的方式忽略警告:

import requests
import logging

logging.captureWarnings(True)
response = requests.get('https://ssr2.scrape.center/', verify=False)
print(response.status_code)

运行结果如下:

requests库的使用—SSL证书验证_网络协议_04