思路

 

 

 

以中国铁路客户服务中心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)>

传递参数后,就可以正常访问了:

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐