2013-07-06 19 views
11

Bazı rasgele sayfaları ayrıştırmak için mekanize/nokogiri taşları kullanıyorum. 301/302 yönlendirmelerle ilgili sorun yaşıyorum. mydomain.com test sunucusu 301/302 durum koduyla Sayfa2'ye Page1 yönlendirirYaklaşımını ruby ​​mechanize ile algıla.

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

nedenle ben

page.code == "301" 
yerine

bende de yok bekliyordum,: Burada kodun snippet'idir her zaman page.code == "200" olsun.

Benim gereksinimleri şunlardır: istediğim

  • (iyidir varsayılan mechanize davranış,) O sayfayı algılamak mümkün istiyorum
  • aslında

yönlendirildi izlenecek yönlendirir Sayfayı agent.history numaralı sayfada görebileceğimi biliyorum, ancak bu güvenilir değil. Yönlendirme durum kodunu da istiyorum.

Bu davranışı mekanize ederek nasıl yapabilirim?

cevap

19

Sen kapalı yönlendirme bırakın ve sadece konumu başlığında aşağıdaki tutmak:

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 burada işe yaramaz mı? – CodeGroover

+0

Belki senin için ama OP bunu istedi. – pguardiario

3

Yönlendirmelere izin vermenin ve durum kodunu almanın bir yolunu buldum, ancak en iyi yöntem olduğundan emin değilim.

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