Web scraping 在Python3.6.5中,请求获取SSL证书时出错

Web scraping 在Python3.6.5中,请求获取SSL证书时出错,web-scraping,python-requests,python-3.6,scrapy-spider,python-requests-html,Web Scraping,Python Requests,Python 3.6,Scrapy Spider,Python Requests Html,我尝试使用请求获取以下URL,但收到SSL证书错误。我尝试了所有早期的堆栈溢出查询,但似乎没有任何效果 代码: 我给了verify=False,仍然不起作用 错误: raise MaxRetryError(_pool, url, error or ResponseError(cause))urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='www.magidglove.com', port=443): Max retri

我尝试使用请求获取以下URL,但收到SSL证书错误。我尝试了所有早期的堆栈溢出查询,但似乎没有任何效果 代码:

我给了verify=False,仍然不起作用

错误:

    raise MaxRetryError(_pool, url, error or ResponseError(cause))urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='www.magidglove.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError("bad handshake: Error([('SSL routines', 'tls_process_server_certificate', 'certificate verify failed')],)",),))

通过将
ssl
导入python代码并添加
verify=ssl.CERT\u NONE
可以轻松解决此问题,因此您的代码应该如下所示:

import requests
import ssl

resp = requests.get('https://www.magidglove.com/', verify=ssl.CERT_NONE)

也就是说,在运行此代码时,您可能会遇到以下错误:

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/urlib3/connectionpool.py:858:不安全请求警告:正在发出未验证的HTTPS请求。强烈建议添加证书验证。见:

您可以通过向代码中添加以下行来禁用该功能:

import requests
import ssl
import urllib3
urllib3.disable_warnings()
resp = requests.get('https://www.magidglove.com/', verify=ssl.CERT_NONE)

希望这有帮助

通过将
ssl
导入python代码并添加
verify=ssl.CERT\u NONE
可以轻松解决此问题,因此您的代码应该如下所示:

import requests
import ssl

resp = requests.get('https://www.magidglove.com/', verify=ssl.CERT_NONE)

也就是说,在运行此代码时,您可能会遇到以下错误:

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site packages/urlib3/connectionpool.py:858:不安全请求警告:正在发出未验证的HTTPS请求。强烈建议添加证书验证。见:

您可以通过向代码中添加以下行来禁用该功能:

import requests
import ssl
import urllib3
urllib3.disable_warnings()
resp = requests.get('https://www.magidglove.com/', verify=ssl.CERT_NONE)

希望这有帮助

TL;DR-服务器配置错误。修复服务器,传递
verify=ssl.CERT_NONE
,或者下载并明确传递www.magidglove.com的证书

这里的问题出在服务器上,而不是客户端。服务器只配置为返回自己的证书,这不足以让客户端信任它。服务器通常需要配置为返回完整的证书链

为了诊断此问题,您可以使用
openssl
查看有关返回的证书链的一些原始信息:

$ openssl s_client -connect www.google.com:443 -showcerts -servername www.google.com

CONNECTED(00000003)
depth=2 OU = GlobalSign Root CA - R2, O = GlobalSign, CN = GlobalSign
verify return:1
depth=1 C = US, O = Google Trust Services, CN = Google Internet Authority G3
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google LLC, CN = www.google.com
verify return:1
... snipped the rest of the output ...

您可以看到服务器返回了3个证书,并按相反的顺序进行了验证。GlobalSign证书受
certifi
库信任,位于
depth=1
的证书由位于
depth=2
的证书创建,最后一个证书
CN=www.google.com
由位于
depth=1
的证书创建

现在,让我们将其与您尝试连接的服务器进行比较:

$ openssl s_client -connect www.magidglove.com:443 -showcerts -servername www.magidglove.com

CONNECTED(00000003)
depth=0 businessCategory = Private Organization, jurisdictionC = US, jurisdictionST = Illinois, serialNumber = 00043176, C = US, ST = Illinois, L = Romeoville, O = "Magid Glove and Safety Manufacturing Company, L.L.C.", OU = web site, CN = www.magidglove.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 businessCategory = Private Organization, jurisdictionC = US, jurisdictionST = Illinois, serialNumber = 00043176, C = US, ST = Illinois, L = Romeoville, O = "Magid Glove and Safety Manufacturing Company, L.L.C.", OU = web site, CN = www.magidglove.com
verify error:num=21:unable to verify the first certificate
verify return:1
您可以从这个输出中看到一些东西: -服务器只返回了一个证书 -客户端试图验证证书,但无法验证


它需要一些ssl知识才能知道它无法验证的原因是它不信任证书,但现在我们知道了,我们可以看到让服务器返回完整的证书链将解决这一问题。我怀疑chrome和其他浏览器不报告错误的原因是浏览器本身知道DigiCert,因此不需要完整的链;DR-服务器配置错误。修复服务器,传递
verify=ssl.CERT_NONE
,或者下载并明确传递www.magidglove.com的证书

这里的问题出在服务器上,而不是客户端。服务器只配置为返回自己的证书,这不足以让客户端信任它。服务器通常需要配置为返回完整的证书链

为了诊断此问题,您可以使用
openssl
查看有关返回的证书链的一些原始信息:

$ openssl s_client -connect www.google.com:443 -showcerts -servername www.google.com

CONNECTED(00000003)
depth=2 OU = GlobalSign Root CA - R2, O = GlobalSign, CN = GlobalSign
verify return:1
depth=1 C = US, O = Google Trust Services, CN = Google Internet Authority G3
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google LLC, CN = www.google.com
verify return:1
... snipped the rest of the output ...

您可以看到服务器返回了3个证书,并按相反的顺序进行了验证。GlobalSign证书受
certifi
库信任,位于
depth=1
的证书由位于
depth=2
的证书创建,最后一个证书
CN=www.google.com
由位于
depth=1
的证书创建

现在,让我们将其与您尝试连接的服务器进行比较:

$ openssl s_client -connect www.magidglove.com:443 -showcerts -servername www.magidglove.com

CONNECTED(00000003)
depth=0 businessCategory = Private Organization, jurisdictionC = US, jurisdictionST = Illinois, serialNumber = 00043176, C = US, ST = Illinois, L = Romeoville, O = "Magid Glove and Safety Manufacturing Company, L.L.C.", OU = web site, CN = www.magidglove.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 businessCategory = Private Organization, jurisdictionC = US, jurisdictionST = Illinois, serialNumber = 00043176, C = US, ST = Illinois, L = Romeoville, O = "Magid Glove and Safety Manufacturing Company, L.L.C.", OU = web site, CN = www.magidglove.com
verify error:num=21:unable to verify the first certificate
verify return:1
您可以从这个输出中看到一些东西: -服务器只返回了一个证书 -客户端试图验证证书,但无法验证


它需要一些ssl知识才能知道它无法验证的原因是它不信任证书,但现在我们知道了,我们可以看到让服务器返回完整的证书链将解决这一问题。我怀疑chrome和其他浏览器不报告错误的原因是浏览器本身知道DigiCert,因此它不需要完整的链。

尝试旋转,
verify=False
。我已经尝试过了。但仍然不工作尝试转动,
verify=False
。我已经试过了。但仍然不起作用