Ruby Mechanizeでタイムアウト
RubyのMechanizeでデータ取得をしていたら、次のようにEOFErrorが発生する。
/usr/local/rvm/gems/ruby-1.9.3-p374/gems/net-http-persistent-2.8/lib/net/http/persistent.rb:959:in `rescue in request': too many connection resets (due to end of file reached - EOFError) after 0 requests on 21405360, last used 1394984831.0672119 seconds ago (Net::HTTP::Persistent::Error) from /usr/local/rvm/gems/ruby-1.9.3-p374/gems/net-http-persistent-2.8/lib/net/http/persistent.rb:968:in `request' from /usr/local/rvm/gems/ruby-1.9.3-p374/gems/mechanize-2.7.1/lib/mechanize/http/agent.rb:257:in `fetch' from /usr/local/rvm/gems/ruby-1.9.3-p374/gems/mechanize-2.7.1/lib/mechanize.rb:431:in `get'
データ取得に失敗しているのかと、Mechanizeのagentの設定でtime_out値を増やせばいいかとも思ったが、そちらではなくkeep_aliveがtrueになっているとタイムアウトになった際にEOFErrorになってしまうため、keep_alive=falseとするといいらしい(エラーメッセージにある「too many connections」はkeep_aliveに関連して発生するものか?)。
Rubyのバージョンは1.9.3だが、更新したほうがいいのかも?
- テクノロジックアート技術者のブログ: [Ruby] MechanizeでEOFError?
- keep-alive 接続がタイムアウト後にソケットからデータを読もうとすると EOFError が出るようになっているみたい
- (2008~2011年頃の話)
- Ruby Mechanize 2.0 リリース – きたももんががきたん。
- Timeout や ECONNREFUSED、EOFError が発生せず、代わりに Net::HTTP::Persistent::Error が発生する
- Net::HTTP::Persistent が使用されるようになったので、その影響になります。
- too many connection resets と言われていますが、必ずしも実際にたくさん接続が切れているわけではありません。
- Net::HTTP::Persistent::Error: too many connection resets · Issue #37 · drbrain/net-http-persistent · GitHub
- Hey guys, we found the error. It is depend on version of Ruby. So, please close the issue.
- Bug #5790: net/http の EOFError と Keep-Alive – ruby-trunk – Ruby Issue Tracking System
- RubyのWWW::Mechanizeの例外処理 – 準二級.jp
- rescue Timeout::Error
- rescue WWW::Mechanize::ResponseCodeError => e
- WWW::Mechanizeでタイムアウトが発生する場合 – 自分の仕事を憎むには人生は余りにも短い
- agent.read_timeout = 100