gpt4 book ai didi

ruby - 调整 Nokogiri 连接的超时

转载 作者:数据小太阳 更新时间:2023-10-29 08:23:55 24 4
gpt4 key购买 nike

为什么 nokogiri 在服务器繁忙时等待几秒 (3-5),而我正在一个接一个地请求页面,但是当这些请求处于循环中时,nokogiri 不会等待并抛出超时消息。我正在使用超时 block 包装请求,但 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

最佳答案

timeout block 只是该代码必须在 block 内执行而不触发异常的最长时间。它不会影响 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

关于ruby - 调整 Nokogiri 连接的超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14498653/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com