使用requests
做爬虫(目标站点为 https 站点)时遇到以下问题:
先贴上伪代码
response = requests.get(url=self.url, headers=self.headers, params=self.params,
proxies={"https": self.get_proxy()}, timeout=5, verify=False)
现在的情况是
<class 'requests.exceptions.SSLError'> HTTPSConnectionPool(host='xxxx.com', port=443):
Max retries exceeded with url: xxxx.com
(Caused by SSLError(SSLError("bad handshake: Error
([('SSL routines', 'ssl3_get_record', 'wrong version number')],)",),))
网站在 chrome 上右上角具有绿色安全标识
查找资料后
CA_BUNDLE
文件或者具有CA 证书
的目录。client side certificate
),可以是如下形式。# 设置`CA_BUNDLE`文件
requests.get('https://github.com', verify='/path/to/certfile')
# 指定一个本地证书作为客户端证书
requests.get('https://kennethreitz.org', cert=('/path/client.cert', '/path/client.key'))
requests.get('https://kennethreitz.org', cert='/path/client.cert')
参考链接: http://www.python-requests.org/en/latest/user/advanced/#ssl-cert-verification
requests 源码对 verify 和 cert 参数的注释
:param verify: (optional) Either a boolean,in which case it controls whether we verify
the server's TLS certificate, or a string,in which case it must be a path to a CA bundle
to use. Defaults to ``True``.
:param cert: (optional) if String, path to ssl client cert file (.pem).
If Tuple, ('cert', 'key') pair.
不理解的问题
CA_BUNDLE
文件或CA 证书
是否就是第三方机构颁发的具有数字签名的证书?在什么情况下需要自己指定,如何获取此文件呢?ssl client cert file
客户端证书文件的作用是什么?如何获取?爬虫过程中需要自己指定吗?对问题 3 的猜测
接下来的动作
如果您能看到这里,真的非常感谢
如果各位老哥有了解或遇到过类似的问题可以帮忙一起讨论,灰常谢谢!
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.