2010-12-09 45 views
1

我開始編寫scrapers來從不同網站獲取數據。我在rake文件中構建了第一個刮板,現在開始編寫第二個rake文件以從第二個站點獲取數據。現在,我正在爲每個我感興趣的站點撰寫特定的刮板(而不是試圖構建通用刮板)。使用導軌刮取Rake任務

我有3個問題:

  1. 正在寫Rake任務一個很好的選擇嗎?我應該考慮哪些替代方案?

  2. 如何添加函數/方法到我的耙文件? (對不起,非常愚蠢的問題,但我不知道如何構建我的代碼......所以現在它只是500行不間斷代碼在一個長方法),例如,我想要一個「get_description(節) 「從頁面返回描述的方法。該方法可能會有所不同,具體取決於我要抓取的網站。

  3. 如何使用RSpec測試我的任務?我想給一個鏈接,並確保我的任務輸出符合我期望得到的結果

感謝您的幫助!如果你想使用它,你還可以檢查出thor它使用更標準的紅寶石般的語法,而不是DSL耙爲您提供

回答

3

作爲一般原則,rake任務應該非常小。將實際行爲指向真實的類。這些類可以很容易地測試。

例子:

task :scrape do 
    Scraper.scrape! 
end 

class Scraper 
    def self.scrape! 
    # do something 
    end 
end 

describe Scraper do 
    # your tests 
end 

,你可以作爲@brad表明,使用雷神,這本身具有普通類結構,所以理論上它應該是更容易測試任務本身。但我沒有這樣做。

你可以在rake中定義方法,但我不知道它們在哪裏結束。你不應該這樣做,所以不要打擾。最小化任務機構,編寫正常的代碼來完成骯髒的工作。

+0

太棒了,這有助於很多!看來這是我應該遵循的路線...只有一個問題:我想避免在我的Rails應用程序的「模型」文件夾中包含我的Scraper特定模型。如何爲Scraper特定模型創建文件夾(常見功能爲scraper.rb,site1特定功能爲site1.rb等),並讓我的rake任務「查看」它? – alex 2010-12-09 19:25:36

1
  1. 當然耙細。

  2. Rake只是另一個Ruby庫,所以你可以在其中包含任何你喜歡的東西。因此,您可以編寫自己的庫並將其加載到rake文件中。看看如何Bundler does it舉例。他們剛剛定義了自己的類,然後在其中創建了任務。它使用了順便說一句,從我可以收集到的代理耙地這些任務,雖然沒有真正徹底地查看它,但我可能是錯的。

  3. 如果要定義你自己的事情庫,只需要Rspec,你通常會爲任何其他項目,然後勾該庫進耙或托爾與不擇手段,你是去比賽