2013-07-06 17 views
11

Używam klejnotów mechanize/nokogiri do analizowania losowych stron. Mam problemy z przekierowaniami 301/302. Oto fragment kodu:Wykryj przekierowanie przy pomocy ruby ​​mechanize

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

Serwer testowy na mydomain.com przekieruje PAGE1 do STR.2 z 301/302 kod statusu, dlatego spodziewałem się mieć

page.code == "301" 

zamiast ja zawsze otrzymuj page.code == "200".

Moje wymagania to:

  • Chcę przekierowania należy przestrzegać (domyślne zachowanie mechanize, co jest dobre)
  • Chcę być w stanie wykryć, że strona faktycznie przekierowany

Wiem, że widzę stronę 1 w agent.history, ale to nie jest niezawodne. Chcę również kod statusu przekierowania.

Jak osiągnąć to zachowanie za pomocą mechanizmu?

Odpowiedz

19

Mogłeś zostawić przekierować off i po prostu zachować po nagłówku lokalizacji:

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

Is var status_code bezużyteczny tutaj? – CodeGroover

+0

Może do ciebie, ale OP poprosił o to. – pguardiario

3

Znalazłem sposób na zezwalanie na przekierowania, a także otrzymywanie kodu statusu, ale nie jestem pewien, czy jest to najlepsza metoda.

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 
Powiązane problemy