使用scrapy爬虫遇到 dh key too small 问题的暂时解决方法

在使用scrapy爬虫时,遇到 dh key too small 问题,错误详细代码:
twisted.python.failure.Failure OpenSSL.SSL.Error: [(‘SSL routines’,’tls_process_ske_dhe’, ‘dh key too small’)

8.20 更新,前两个方法都不好,可以直接看最后的方法!!!

参考https://blog.csdn.net/joson1234567890/article/details/78637234 的文章。

方法1: 修改 OpenSLL库里面 SLL.py 文件
修改 C:\Users\{你的用户名}\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\OpenSSL\SLL.py (就是pip 安装插件的目录)
将指定位置的代码修改。
这里的_DEFAULT_CIPHERS 变量需要自己定义一个全局变量

//需要添加的全局变量
_DEFAULT_CIPHERS = (
    'ECDH+AESGCM:ECDH+CHACHA20:DH+AESGCM:DH+CHACHA20:ECDH+AES256:DH+AES256:'
    'ECDH+AES128:DH+AES:ECDH+HIGH:DH+HIGH:RSA+AESGCM:RSA+AES:RSA+HIGH:'
    '!aNULL:!eNULL:!MD5:!3DES'
    'HIGH:!DH:!aNULL'
    )
//需要修改的方法
def set_cipher_list(self, cipher_list):
        需要修改的地方,将原代码注释掉,在下面添加新代码
        #cipher_list = _text_to_bytes_and_warn("cipher_list", cipher_list)
        cipher_list = _text_to_bytes_and_warn("cipher_list", _DEFAULT_CIPHERS )

        if not isinstance(cipher_list, bytes):
            raise TypeError("cipher_list must be a byte string.")

        _openssl_assert(
            _lib.SSL_CTX_set_cipher_list(self._context, cipher_list) == 1
        )

方法2: 修改 twisted 库里面的 _sslverify.py 文件
修改 C:\Users\{你的用户名}\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\twisted\internet\_sslverify.py (就是pip 安装插件的目录)

//需要添加的全局变量
_DEFAULT_CIPHERS = (
    'ECDH+AESGCM:ECDH+CHACHA20:DH+AESGCM:DH+CHACHA20:ECDH+AES256:DH+AES256:'
    'ECDH+AES128:DH+AES:ECDH+HIGH:DH+HIGH:RSA+AESGCM:RSA+AES:RSA+HIGH:'
    '!aNULL:!eNULL:!MD5:!3DES'
    'HIGH:!DH:!aNULL'
    )
//需要修改的方法
def _expandCipherString(cipherString, method, options):
    ctx = SSL.Context(method)
    ctx.set_options(options)
    try:
        //需要修改的地方,将原代码注释掉,在下面添加新代码
        #ctx.set_cipher_list(cipherString.encode('ascii'))
        ctx.set_cipher_list(_DEFAULT_CIPHERS)
    except SSL.Error as e:
        if e.args[0][0][2] == 'no cipher match':
            return []
        else:
            raise
    conn = SSL.Connection(ctx, None)
    ciphers = conn.get_cipher_list()
    if isinstance(ciphers[0], unicode):
        return [OpenSSLCipher(cipher) for cipher in ciphers]
    else:
        return [OpenSSLCipher(cipher.decode('ascii')) for cipher in ciphers]

两个方法都可以用,自己选择,记住一定不能删除原有代码,因为两个方法都是要修改库的源代码。这种修改可能在其他方面的使用时,会出现问题,所以不能删除源代码,以后出问题,可以再改回源代码。
这两个方法都不是很好,需要修改库源码,但可以临时用一下,不知道还有没有更好的方法。如果有更好的方法请一定告诉我。谢谢!(第一次写,格式排版比较乱)


分隔符!!!!!!!!!!

更新了新的方法,感谢github上的朋友!

方法3:在github上找到了更好的办法,链接https://github.com/scrapy/scrapy/issues/3392

在你的spider(爬虫文件) 加入以下代码。

'''修改DEFAULT_CIPHERS'''
from twisted.internet.ssl import AcceptableCiphers
from scrapy.core.downloader import contextfactory
contextfactory.DEFAULT_CIPHERS = AcceptableCiphers.fromOpenSSLCipherString('DEFAULT:!DH')
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值