Python urllib.request 爬虫报错“SSL: CERTIFICATE_VERIFY_FAILED”

错误代码:

import urllib.request
#1.数据url
url = 'http://www.yaozh.com/member/'
#2.添加请求头
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
#3.构建请求对象
request = urllib.request.Request(url, headers=headers)  #使用Request可以加请求头对象
#4.发送请求对象
response = urllib.request.urlopen(request)
#5.读取数据
data = response.read()
print(data)
#6.保存到文件中 验证数据
with open('01cook.html', 'wb') as f:   #如果出现write() argument must be str, not bytes #1.修改with open('01cook.html', 'w') as f   如上w形式写入的是一个字符串;2.data=response.read().decode
    f.write(data)

以上代码爬取“药智网”报错“urllib.error.URLError: ”。原来是Python 升级到 2.7.9 之后引入了一个新特性,当使用urllib.urlopen打开一个 https 链接时,会验证一次 SSL 证书。而当目标网站使用的是自签名的证书时就会抛出此异常。

解决方案有如下两个:
(1)使用ssl创建未经验证的上下文,在urlopen中传入上下文参数

import ssl
context = ssl._create_unverified_context()
response = urllib.request.urlopen(request,context=context)

(2) 全局取消证书验证

import ssl
ssl._create_default_https_context = ssl._create_unverified_context

另外,如果用的是requests模块的get方法,里面有一个verify参数,将其设成False就可以了。

更改后代码:

import urllib.request
import ssl
context = ssl._create_unverified_context()

#1.数据url
url = 'http://www.yaozh.com/member/'
#2.添加请求头
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
#3.构建请求对象
request = urllib.request.Request(url, headers=headers)  #使用Request可以加请求头对象
#4.发送请求对象
response = urllib.request.urlopen(request,context=context)
#5.读取数据
data = response.read()
print(data)
#6.保存到文件中 验证数据
with open('01cook.html', 'wb') as f:   #如果出现write() argument must be str, not bytes#1.修改with open('01cook.html', 'w') as f   如上w形式写入的是一个字符串;2.data=response.read().decode
    f.write(data)

文章参考:https://blog.csdn.net/hudeyu777/article/details/76021573

你可能感兴趣的:(Python urllib.request 爬虫报错“SSL: CERTIFICATE_VERIFY_FAILED”)