16

我正在使用 mechanize/nokogiri gems 来解析一些随机页面。我遇到了 301/302 重定向问题。这是代码片段:

agent = Mechanize.new
page = agent.get('http://example.com/page1')

mydomain.com 上的测试服务器将使用 301/302 状态代码将 page1 重定向到 page2,因此我期望有

page.code == "301"

相反,我总是得到page.code == "200".

我的要求是:

  • 我希望遵循重定向(默认机械化行为,这很好)
  • 我希望能够检测到该页面实际上已被重定向

我知道我可以在 中看到 page1 agent.history,但这并不可靠。我也想要重定向状态码。

如何通过机械化实现这种行为?

4

2 回答 2

25

您可以关闭重定向并继续关注位置标头:

agent.redirect_ok = false
page = agent.get 'http://www.google.com'
status_code = page.code

while page.code[/30[12]/]
  page = agent.get page.header['location']
end
于 2013-07-14T01:47:55.147 回答
3

我找到了一种允许重定向并获取状态代码的方法,但我不确定这是最好的方法。

agent = Mechanize.new

# deactivate redirects first
agent.redirect_ok = false

status_code = '200'
error_occurred = false

# request url
begin
  page = agent.get(url)
  status_code = page.code
rescue Mechanize::ResponseCodeError => ex
  status_code = ex.response_code
  error_occurred = true
end

if !error_occurred && status_code != '200' then
  # enable redirects and request the page again
  agent.redirect_ok = true
  page = agent.get(url)
end
于 2013-07-06T13:24:17.527 回答