2013-07-06 53 views
11

我正在使用機械化/ nokogiri寶石來解析一些隨機頁面。我在301/302重定向時遇到問題。下面是代碼片段:用紅寶石機械化檢測重定向

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

上mydomain.com測試服務器將重定向第1頁與301/302狀態代碼到第二頁,因此我期待有

page.code == "301" 

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

我的要求是:

  • 我想重定向應遵循(默認機械化的行爲,這是很好的)
  • 我希望能夠檢測到網頁實際上被重定向

我知道我可以在agent.history中看到page1,但這不可靠。我也想要重定向狀態碼。

我怎樣才能實現機械化這種行爲?

回答

19

你可以離開重定向關閉,只保留下的位置標頭:

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 
+0

是VAR STATUS_CODE沒用嗎? – CodeGroover

+0

也許給你,但OP要求。 – pguardiario

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