ruby - 使用 Ruby 发出 HTTP 请求时出现 EOFError

标签 ruby http

我目前正在编写一个脚本,该脚本遍历 URL 列表并对它们进行一些处理。然而,我列表中的一个 URL 给了我一个问题。代码如下:

url = "https://secure.www.alumniconnections.com/olc/pub/CDB/events/attendance.cgi?   tmpl=attendance&event=2309515&sort=4"
uri = URI.parse(url)
response = Net::HTTP.get_response(uri)

最后一行引发了以下错误:

EOFError: end of file reached
    from /usr/lib/ruby/1.8/net/protocol.rb:135:in `sysread'
    from /usr/lib/ruby/1.8/net/protocol.rb:135:in `rbuf_fill'
    from /usr/lib/ruby/1.8/timeout.rb:67:in `timeout'
    from /usr/lib/ruby/1.8/timeout.rb:101:in `timeout'
    from /usr/lib/ruby/1.8/net/protocol.rb:134:in `rbuf_fill'
    from /usr/lib/ruby/1.8/net/protocol.rb:116:in `readuntil'
    from /usr/lib/ruby/1.8/net/protocol.rb:126:in `readline'
    from /usr/lib/ruby/1.8/net/http.rb:2028:in `read_status_line'
    from /usr/lib/ruby/1.8/net/http.rb:2017:in `read_new'
    from /usr/lib/ruby/1.8/net/http.rb:1051:in `request'
    from /usr/lib/ruby/1.8/net/http.rb:948:in `request_get'
    from /usr/lib/ruby/1.8/net/http.rb:380:in `get_response'
    from /usr/lib/ruby/1.8/net/http.rb:543:in `start'
    from /usr/lib/ruby/1.8/net/http.rb:379:in `get_response'
    from (irb):5
    from /usr/lib/ruby/1.8/uri/ftp.rb:190

我的列表中没有其他 URL 似乎让我感到悲伤。谁能解释为什么我会收到此错误?

最佳答案

我输入了 https://secure.www.alumniconnections.com/这似乎将我重定向到 http://www.harrisconnect.com/ .我的猜测是您的代码无法处理重定向。尝试使用 Mechanize (http://mechanize.rubyforge.org/) 来处理这个问题。此外,我建议您将代码包装在一些错误处理中,例如:

# Prevent Infinite Loops
counter = 0

begin
  # Your Code Here

rescue EOFError
  puts "encountered EOFError"

  # Fail the connection after 3 attempts
  if counter < 3
     counter += 1
     puts "redo: #{counter}"
     redo
  else
     puts "FAILED CONNECTION #{counter} TIMES"
     counter = 0
  end
end

这将尝试重做连接,这在过去连接到很多 url 时对我有帮助。

编辑:

require 'rubygems'
require 'mechanize'

agent = Mechanize.new
html_text = agent.get("https://secure.www.alumniconnections.com/olc/pub/CDB/events/attendance.cgi?tmpl=attendance&event=2309515&sort=4").body

html_file = File.open("html_file.html", "w")
html_file.write(html_text)
html_file.close

这会将您的网页写入一个对我来说很合适的文件,所以请尝试一下。

关于ruby - 使用 Ruby 发出 HTTP 请求时出现 EOFError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6510203/

相关文章:

ruby - Bundler 锁定在 docker + 无法安装 gems(已解决 - docker CMD vs ENTRYPOINT)

ruby - 提高 Ruby 中文件搜索的速度

http - 登录命令行后执行GET请求

http - Go - 接受 http post 多部分文件

http - Haskell 找不到模块 `Network.HTTP.Conduit'

spring - 使用 Angular2 将 MultipartFile 作为请求参数发送到 REST 服务器

ruby-on-rails - 通过 mTurk 对实时结果进行 Rspec 测试

Ruby,从组合中获取唯一切片

ruby-on-rails - Rspec 主题!改变 before block 的 "position"

javascript - q-io/http.request 上的 ETIMEDOUT