2013-07-06 15 views
11

Sto usando le gemme mechanize/nokogiri per analizzare alcune pagine casuali. Sto riscontrando problemi con i reindirizzamenti 301/302. Ecco un frammento del codice:Rileva reindirizzamento con ruby ​​mechanize

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

Il server di prova su mydomain.com reindirizzerà la page1 a pagina 2 con 301/302 codice di stato, quindi mi aspettavo di avere

page.code == "301" 

Invece io sempre ottenere page.code == "200".

miei requisiti sono:

  • voglio reindirizza da seguire (comportamento Mechanize di default, che è buono)
  • voglio essere in grado di rilevare che la pagina è stata effettivamente reindirizzata

So che posso vedere la pagina 1 in agent.history, ma non è affidabile. Voglio anche il codice di stato di reindirizzamento.

Come posso ottenere questo comportamento con mechanize?

risposta

19

Si potrebbe lasciare reindirizzare off e tenere solo dopo l'intestazione posizione:

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 inutile qui? – CodeGroover

+0

Forse per te ma OP lo ha chiesto. – pguardiario

3

Ho trovato un modo per consentire i reindirizzamenti e ottenere anche il codice di stato, ma non sono sicuro che sia il metodo migliore.

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