我在尝试使用机械化刮擦网站时遇到此错误。
这是我的代码:
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来避免出现“太多连接重置”错误。
答案 0 :(得分:2)
链接的博客文章中的代码似乎与net-http-persistent gem的v3.0.0不兼容。请注意,Mechanize v2.7.6(撰写本文时为当前版本)与net-http-persistent> = v2.5.2(包括v3.0.0)兼容。
简短的答案是执行以下操作之一:
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#request
从Errno::ECONNRESET
异常(所有这些的原始原因)中恢复时,它仅重试一次,然后调用Net::HTTP::Persistent#request_failed
。 request_failed
依次通过该连接调用Net::HTTP::Persistent#finish
。因此,似乎唯一必要的猴子修补操作就是重试多次。