Python 坑之CERTIFICATE_VERIFY_FAILED

最近跟着《Python3 网络爬虫开发实践》学习,在 “第3章 基本库的使用 => 3.1.1 发送请求 => urlopen()” 中遇到问题,当我使用书中的示例时,爆出一个错误如下图:image-20190217154154435

产生的原因,是因为Python升级2.7.9之后引入了一个新特性,当你urllib.urlopen一个 https 的时候,会验证一次 SSL 证书,当目标网站使用的是自签名的证书时就会爆出一个 urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:581)> 的错误消息。

具体错误查看这里CERTIFICATE_VERIFY_FAILED

那么Python 提供了两个方法解决问题:

  • 全局取消整数验证(当项目对安全性问题不太重视时,推荐使用,可以全局取消证书的验证,简易方便)

    1
    2
    3
    import ssl

    ssl._create_default_https_context = ssl._create_unverified_context
  • 使用ssl创建未验证的上下文,在url中传入上下文参数(当项目整体非常重视安全问题时,推荐这种方式,可以局部取消证书验证)

    1
    2
    3
    4
    5
    6
    7
    import ssl  
    import urllib2

    # This restores the same behavior as before.
    context = ssl._create_unverified_context()
    # 将context传入url函数的context参数中
    print urllib2.urlopen("https://www.12306.cn/mormhweb/",context=context).read()

参考原文