2013-07-06 33 views
11

Tôi đang sử dụng đá quý cơ giới hóa/nokogiri để phân tích một số trang ngẫu nhiên. Tôi đang gặp sự cố với chuyển hướng 301/302. Dưới đây là một đoạn mã:Phát hiện chuyển hướng bằng cơ chế ruby ​​

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

Các máy chủ thử nghiệm trên mydomain.com sẽ chuyển hướng page1 để Page2 với 301/302 mã trạng thái, do đó tôi đã mong có

page.code == "301" 

Thay vào đó tôi luôn nhận được page.code == "200".

yêu cầu của tôi là:

  • tôi muốn chuyển hướng phải tuân theo (hành vi mechanize mặc định, đó là tốt)
  • Tôi muốn để có thể phát hiện trang đó đã thực sự chuyển hướng

Tôi biết rằng tôi có thể thấy trang1 trong agent.history, nhưng điều đó không đáng tin cậy. Tôi cũng muốn mã trạng thái chuyển hướng.

Làm cách nào để đạt được hành vi này với cơ giới hóa?

Trả lời

19

Bạn có thể để lại chuyển hướng đi và chỉ giữ sau tiêu đề vị trí:

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

là var status_code vô dụng ở đây? – CodeGroover

+0

Có thể với bạn nhưng OP đã yêu cầu. – pguardiario

3

Tôi đã tìm thấy cách để cho phép chuyển hướng và cũng nhận được mã trạng thái, nhưng tôi không chắc đó là phương pháp tốt nhất.

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 
Các vấn đề liên quan