ruby - 使用 Nokogiri 阅读文档时如何处理 ssl / force ssl_version?
问题描述
我有一些使用 nokogiri 加载 Web 文档的代码:
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,但它使用的是股票 http 而不是 Nokogiri。
我尝试了几种变体,例如:
file = open(url, :ssl_version => OpenSSL::SSL::SSLContext::TLSv1)
但这只是给了我这样的错误
uninitialized constant 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
推荐阅读
- python - 重新排序数据并创建新的数据文件
- operator-overloading - 如何获得两个浮点数的平均值
- delphi - Indy FTP 突然断开连接
- python - Cygwin 编译错误(windows 10、python 3.7、visual studio 2019)
- python - 使用 PyLint 计算圈复杂度
- javascript - JointJS 版本 3 中的命名空间问题
- python - 在python脚本内循环执行awk
- php - 如何在 Where 子句中记录没有敏感数据的 SQL 查询?
- mysql - MySQL存储值列表
- mysql - 如何使用 C# Visual Studio 执行 MySql 存储过程