【问题标题】:Adjusting timeouts for Nokogiri connections调整 Nokogiri 连接的超时
【发布时间】:2013-01-08 01:12:18
【问题描述】:

为什么 nokogiri 在服务器很忙并且我正在逐页请求页面时等待几秒 (3-5),但是当这些请求处于循环中时,nokogiri 不会等待并抛出超时消息。 我正在使用超时块包装请求,但 nokogiri 根本不等待那个时间。 有什么建议的程序吗?

# this is a method from the eng class
def get_page(url,page_type)
 begin
  timeout(10) do
    # Get a Nokogiri::HTML::Document for the page we’re interested in...
    @@doc = Nokogiri::HTML(open(url))
  end
 rescue Timeout::Error
  puts "Time out connection request"
  raise
  end
end

 # this is a snippet from the main app calling eng class
 # receives a hash with urls and goes throgh asking one by one
 def retrieve_in_loop(links)
  (0..links.length).each do |idx|
    url = links[idx]
    puts "Visiting link #{idx} of #{links.length}"
    puts "link: #{url}"
    begin
        @@eng.get_page(url, product)
    rescue Exception => e
        puts "Error getting url: #{idx} #{url}"
        puts "This link will be skeeped. Continuing with next one"
    end
  end
end

【问题讨论】:

  • Nokogiri 不会超时,因为它不处理连接,OpenURI 会。
  • 另外,你为什么使用类变量? @@eng@@doc 提示您有不了解的变量范围问题。
  • 谢谢你,我会把@@去掉。

标签: ruby timeout nokogiri open-uri net-http


【解决方案1】:

timeout 块只是该代码必须在块内执行而不触发异常的最长时间。它不会影响 Nokogiri 或 OpenURI 内部的任何内容。

您可以将超时设置为一年,但 OpenURI 仍然可以随时超时。

所以您的问题很可能是 OpenURI 在连接尝试本身上超时。 Nokogiri 没有超时;它只是一个解析器。

调整读取超时

您可以在 OpenURI 上调整的唯一超时是读取超时。看来您无法通过此方法更改连接超时:

open(url, :read_timeout => 10)

调整连接超时

要调整连接超时,您必须直接使用Net::HTTP

uri = URI.parse(url)

http = Net::HTTP.new(uri.host, uri.port)
http.open_timeout = 10
http.read_timeout = 10

response = http.get(uri.path)

Nokogiri.parse(response.body)

您还可以在这里查看一些其他讨论:

Ruby Net::HTTP time out
Increase timeout for Net::HTTP

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多