使用Nokogiri读取文档时如何处理ssl / force ssl_version?

时间:2018-11-10 05:04:31

标签: ruby ssl nokogiri

我有一些代码可以使用nokogiri加载网络文档:

require 'nokogiri'
require 'open-uri'
require 'openssl'
require 'net/https'

define_method (:loadWebDoc) { |url|
  web_doc = nil
  begin
    file = open(url)
    web_doc = Nokogiri::HTML(file)
  rescue OpenURI::HTTPError => ex
    raise ex
  end  
  web_doc  
}

#process some urls with threads...

一直很好,直到我开始在线程中使用它为止。我的脚本多次成功调用loadWebDoc,但是在处理文档约30秒后,出现如下错误:

/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/ruby/2.3.0/net/protocol.rb:44:in `connect_nonblock': SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read server session ticket A (OpenSSL::SSL::SSLError)

这里是一个建议使用TLSv1的similar issue on stack,但它使用的是股票http,而不是Nokogiri。

我尝试了以下几种变化:
file = open(url, :ssl_version => OpenSSL::SSL::SSLContext::TLSv1)

但这给了我类似
的错误 uninitialized constant OpenSSL::SSL::SSLContext::TLSv1 (NameError)

如何强迫Nokogiri做同样的事情?看来我需要配置ssl版本和密码,但是我不确定Nokogiri的方式,我可能使用了错误的常量。

1 个答案:

答案 0 :(得分:1)

看起来好像出现了错误“ connect_nonblock”,因为服务器无法处理许多连接,尤其是在线程的情况下。尝试增加尝试之间的延迟时间

open(url, open_timeout: 100)

https://ruby-doc.org/stdlib-2.4.0/libdoc/socket/rdoc/Socket.html#method-i-connect_nonblock