ConnectionPool :: Error(没有签出任何连接)

时间:2018-06-26 15:10:10

标签: ruby mechanize

我在尝试使用机械化刮擦网站时遇到此错误。

这是我的代码:

agent = Mechanize.new

agent.user_agent_alias = 'Mac Safari'

agent.keep_alive = false

page = agent.get('https://web.archive.org/web/20170417084732/https://www.cs.auckland.ac.nz/~andwhay/postlist.html')

page.links_with(:text => 'post').each do |link|
  post = link.click
  Article.create(
    user_id: 1,
    title: post.css('title'),
    text: post.at("//div[@itemprop = 'description']")
  )
end

我还使用this code来避免出现“太多连接重置”错误。

1 个答案:

答案 0 :(得分:2)

链接的博客文章中的代码似乎与net-http-persistent gem的v3.0.0不兼容。请注意,Mechanize v2.7.6(撰写本文时为当前版本)与net-http-persistent> = v2.5.2(包括v3.0.0)兼容。

简短的答案是执行以下操作之一:

  • 将net-http固定为v2.9.4版
  • (实验性),删除链接的博客文章第44行上对self.http.shutdown的呼叫

长的答案是net-http-persistent gem开始使用v3.0.0中的connection_pool gem,它改变了Net::HTTP::Persistent#shutdown(在self.http.shutdown中又名Mechanize::HTTP::Agent)的行为。如果在调用ConnectionPool::Error之后发出请求,则新行为将引发shutdown(“未检出连接”)。

但是,通过浏览net-http-persistent v2.9.4和v3.0.0的代码,似乎self.http.shutdown最初并不是必需的。 shutdown的主要目的似乎是在每个连接上调用finish。在v2.9.4和v3.0.0中,当Net::HTTP::Persistent#requestErrno::ECONNRESET异常(所有这些的原始原因)中恢复时,它仅重试一次,然后调用Net::HTTP::Persistent#request_failedrequest_failed依次通过该连接调用Net::HTTP::Persistent#finish。因此,似乎唯一必要的猴子修补操作就是重试多次。