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

标签 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)

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

我已经尝试了几种类似的变体:
file = open(url, :ssl_version => OpenSSL::SSL::SSLContext::TLSv1)

但这只会给我错误
未初始化的常量 OpenSSL::SSL::SSLContext::TLSv1 (NameError)

我怎样才能强制 Nokogiri 做同样的事情?看起来我需要配置 ssl 版本和密码,但我不确定如何使用 Nokogiri,而且我可能使用了错误的常量。

最佳答案

似乎出现了“connect_nonblock”错误,因为服务器无法处理大量连接,尤其是在线程的情况下。尝试添加尝试之间的延迟

open(url, open_timeout: 100)

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

关于ruby - 使用Nokogiri阅读文档时如何处理ssl/force ssl_version?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53236142/

相关文章:

ruby-on-rails - 为什么子类化 ActiveSupport::TimeZone 会破坏其类级 [] 运算符?

ssl - 将 SSL 证书导入 SIM800C

azure - Powershell Azure : Could not create SSL/TLS secure channel

html - 使用 Ruby 中的 Nokogiri 抓取特定标题

html - Nokogiri 获取所有 HTML 节点

ruby - 在 Rails 4 中使用图像作为单选按钮标签

ruby - 尝试为 Windows XP 安装 Ruby Gems 时出现 SocketError

ruby-on-rails - 当我将 "multiple true"添加到 collection_select 时,Rails 4 HABTM 停止工作

javascript - Apache HTTPClient 在相互身份验证期间不发送客户端证书

ruby-on-rails - 在 ubuntu 服务器上部署 capistrano 时关于 nokogiri 的错误