【发布时间】:2015-10-05 14:10:56
【问题描述】:
我目前正在努力解决我在使用 Scrapy 时遇到的问题。每当我使用 Scrapy 抓取证书的 CN 值与服务器域名匹配的 HTTPS 站点时,Scrapy 都非常好用!但另一方面,每当我尝试抓取证书的 CN 值与服务器域名不匹配的站点时,我都会得到以下信息:
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/twisted/protocols/tls.py", line 415, in dataReceived
self._write(bytes)
File "/usr/local/lib/python2.7/dist-packages/twisted/protocols/tls.py", line 554, in _write
sent = self._tlsConnection.send(toSend)
File "/usr/local/lib/python2.7/dist-packages/OpenSSL/SSL.py", line 1270, in send
result = _lib.SSL_write(self._ssl, buf, len(buf))
File "/usr/local/lib/python2.7/dist-packages/OpenSSL/SSL.py", line 926, in wrapper
callback(Connection._reverse_mapping[ssl], where, return_code)
--- <exception caught here> ---
File "/usr/local/lib/python2.7/dist-packages/twisted/internet/_sslverify.py", line 1055, in infoCallback
return wrapped(connection, where, ret)
File "/usr/local/lib/python2.7/dist-packages/twisted/internet/_sslverify.py", line 1154, in _identityVerifyingInfoCallback
verifyHostname(connection, self._hostnameASCII)
File "/usr/local/lib/python2.7/dist-packages/service_identity/pyopenssl.py", line 30, in verify_hostname
obligatory_ids=[DNS_ID(hostname)],
File "/usr/local/lib/python2.7/dist-packages/service_identity/_common.py", line 235, in __init__
raise ValueError("Invalid DNS-ID.")
exceptions.ValueError: Invalid DNS-ID.
我查看了尽可能多的文档,据我所知,Scrapy 没有办法禁用 SSL 证书验证。甚至 Scrapy Request 对象的文档(我认为这是此功能所在的位置)也没有参考:
http://doc.scrapy.org/en/1.0/topics/request-response.html#scrapy.http.Request https://github.com/scrapy/scrapy/blob/master/scrapy/http/request/init.py
也没有解决问题的 Scrapy 设置:
http://doc.scrapy.org/en/1.0/topics/settings.html
缺少按源使用 Scrapy 并根据需要修改源,有人对我如何禁用 SSL 证书验证有任何想法吗?
谢谢!
【问题讨论】:
-
从文档中看,您可以修改
DOWNLOAD_HANDLERS或DOWNLOAD_HANDLERS_BASE设置以更改 scrapy 处理 https 的方式。从那里您可能必须创建自己的修改后的HttpDownloadHandler,以克服您收到的错误。 -
/me 头靠在桌子上。这当然看起来很有希望。您能否将其写成答案以便我接受,然后添加我用于其他人的代码以供将来参考?