Ruby Mechanize 出现 HTTPNotFound 错误

Ruby HTTPNotFound Error with Mechanize

我在 rails 上有一个 ruby 应用程序正在尝试访问 Yahoo Sports 上的各种链接,有时当它尝试访问某个页面时,会出现以下错误。错误是一致的,它失败的任何链接,它总是失败。这不是有时他们工作有时他们不工作的情况。您会发现该页面确实存在并且加载正常,所以我不确定为什么它会给我一个错误。以前有没有人经历过这种行为,如果有,你对如何让它起作用有什么建议吗?

404 => Net::HTTPNotFound for http://sports.yahoo.com/mlb/players/9893/ -- unhandled response

@client = Mechanize.new()
@client.request_headers = { "Accept-Encoding" => "" }
@client.ignore_bad_chunking = true

#works
#url = 'http://sports.yahoo.com/mlb/players/7307'

#doesn't work
url = 'http://sports.yahoo.com/mlb/players/9893'

result = @client.get(url)

您需要处理重定向。 Mechanize 为此提供了一种方法- follow_meta_refresh。尝试将其添加到您的代码中。示例:

require 'mechanize'

@client = Mechanize.new()
@client.request_headers = { "Accept-Encoding" => "" }
@client.ignore_bad_chunking = true
@client.follow_meta_refresh = true
#works
#url = 'http://sports.yahoo.com/mlb/players/7307'

#doesn't work
url = 'http://sports.yahoo.com/mlb/players/9893'

result = @client.get(url)
pp result

底部的 pp 将以良好的格式打印出页面以供进一步抓取。在我的机器上看起来是正确的内容。

我无法通过 mechanize 解决这个问题,但我能够从 HTTParty 获得 URL。如果您从机械化故障中进行救援并通过查找重定向 URI 重试,您应该设置:

require 'mechanize'
require 'httparty'

@client = Mechanize.new()

url = 'http://sports.yahoo.com/mlb/players/9893'

begin
  result = @client.get(url)
rescue Mechanize::ResponseCodeError => e
  redirect_url = HTTParty.get(url).request.last_uri.to_s
  result = @client.get(redirect_url)
end