2016-10-08 14 views
0

私はMechanizeを使って単純なWeb Scrawlerを書いています。今は次のページを再帰的に取得する方法に固執しています。 Rubyで再帰的メソッドを使うにはどうすればいいですか?

def self.generate_page #generate a Mechainze page object,the first page 
    agent = Mechanize.new 
    url = "http://www.baidu.com/s?wd=intitle:#{URI.encode(WORD)}%20site:sina.com.cn&rn=50&gpc=stf#{URI.encode(TIME)}" 
    page = agent.get(url) 
    page 
end 

def self.next_page(n_page) #get next page recursively by click next tag showed in each pages 
puts n_page 
# if I dont use puts , I get nothing , when using puts, I get 
#<Mechanize::Page:0x007fd341c70fd0> 
#<Mechanize::Page:0x007fd342f2ce08> 
#<Mechanize::Page:0x007fd341d0cf70> 
#<Mechanize::Page:0x007fd3424ff5c0> 
#<Mechanize::Page:0x007fd341e1f660> 
#<Mechanize::Page:0x007fd3425ec618> 
#<Mechanize::Page:0x007fd3433f3e28> 
#<Mechanize::Page:0x007fd3433a2410> 
#<Mechanize::Page:0x007fd342446ca0> 
#<Mechanize::Page:0x007fd343462490> 
#<Mechanize::Page:0x007fd341c2fe18> 
#<Mechanize::Page:0x007fd342d18040> 
#<Mechanize::Page:0x007fd3432c76a8> 
#which are the results I want 

    np = Mechanize.new.click(n_page.link_with(:text=>/next/)) unless n_page.link_with(:text=>/next/).nil? 
    result = next_page(np) unless np.nil? 
    result # here the value is empty, I dont know what is worng 
end 

def self.get_page # trying to pass the result of next_page() method 
    puts next_page(generate_page) 
    # it seems result is never passed here, 
end 

は私が.. ..間違っているかを把握カントこれら二つのリンクまだ What is recursion and how does it work?Ruby recursive function しかしに続い誰かが私を助けることを願って感謝

答えて

2

あなたのコードを持ついくつかの問題があります。

  1. Mechanize.newを複数回呼び出すことは避けてください。
  2. 文体的な観点からは、無関係なチェックが多すぎます。

再帰の優先度を持たない限り、反復的に行う方が簡単でしょう。

あなたnext_page方法は、チェーン内のすべてのリンクページを含む配列を返すようにするには、この記述することができます。

# you should store the mechanize agent as a global variable 
Agent = Mechanize.new 

# a helper method to DRY up the code 
def click_to_next_page(page) 
    Agent.click(n_page.link_with(:text=>/next/)) 
end 

# repeatedly visits next page until none exists 
# returns all seen pages as an array 
def get_all_next_pages(n_page) 
    results = [] 
    np = click_to_next_page(n_page) 
    results.push(np) 
    until !np 
    np = click_to_next_page(np) 
    np && results.push(np) 
    end 
    results 
end 

# testing it out (i'm not actually running this) 
base_url = "http://www.baidu.com/s?wd=intitle:#{URI.encode(WORD)}%20site:sina.com.cn&rn=50&gpc=stf#{URI.encode(TIME)}" 
root_page = Agent.get(base_url) 
next_pages = get_all_next_pages(root_page) 
puts next_pages 
+0

感謝を!最初に、私は繰り返し実行するつもりでしたが、これらの行で失敗しました: 'results.push(np) まで!np np = click_to_next_page(np) np && results.push(np)'あなたのコードは本当に助けになりました私はたくさん! – roccia

関連する問題