urllib库关于请求未通过CA认证的HTTPS网址的处理方法
思路以中国铁路客户服务中心12306为例。12306网站用的是自己的一套认证机制,并没有通过CA认证。所以,直接使用https协议访问时,会出现如下图所示的警告信息:这里可以选择继续前往不安全的网址。同样,在代码中,只需要跳过SSL警告,去访问未通过CA认证https网址。源码# !/usr/bin/env python# -*- coding:u
·
思路
思路
以中国铁路客户服务中心12306为例。
12306网站用的是自己的一套认证机制,并没有通过CA认证。所以,直接使用https协议访问时,会出现如下图所示的警告信息:
这里可以选择继续前往不安全的网址。同样,在代码中,只需要跳过SSL警告,去访问未通过CA认证https网址。
源码
# !/usr/bin/env python
# -*- coding:utf-8 -*-
"""
HTTPS:安全的HTTP(HTTP+SSL),对传递的数据进行加密
SSL:安全套接字层
CA认证:产生和确定数字证书的第三方可信机构
"""
import urllib.request
import ssl
# 12306网站为通过CA认证,直接使用https协议,不能访问
url="https://www.12306.cn/mormhweb/"
req=urllib.request.Request(url)
req.add_header(key="User-Agent",val="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36")
# 用于忽略SSL认证检查
context=ssl._create_unverified_context()
# 传递context参数
resp=urllib.request.urlopen(req,context=context)
data=resp.read().decode()
print(data)
运行结果
如果在
resp=urllib.request.urlopen(req,context=context)
这行代码中,不传递context参数,会报以下错误:
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:645)>
传递参数后,就可以正常访问了:
更多推荐
所有评论(0)