2012-02-24 64 views
1

我準備寫我的第一個網絡爬蟲,它看起來像Anemone是最有意義的。有built in support for MongoDB storage,我已經通過Mongoid在我的Rails應用程序中使用了MongoDB。我的目標是存儲抓取的結果,然後通過Rails訪問它們。我有一對夫婦的憂慮:海葵與Rails和MongoDB

1)在this page年底,它說,注:每一個存儲引擎將開始新的爬網之前清除現有海葵的數據。」如果我正在使用默認內存存儲,但我不希望這種情況發生在抓取結束時,但是不應該將記錄無限期地持久保存到MongoDB,以便在下次運行任務時重複頁面不會被抓取?如果他們在開始新抓取之前被刪除,那麼我應該在下次抓取之前運行我的Rails邏輯?如果是這樣,那麼我最終不得不檢查上一次抓取的重複記錄。

2)這是我第一次真正考慮在Rails模型的上下文之外使用MongoDB。它看起來像使用Page類創建記錄,所以我以後可以像通常使用Mongoid一樣查​​詢這些記錄嗎?我想只要它有一個ORM提供了奇特的方法,它就被認爲是一個「模型」?

回答

3

偉大的問題。

1)這取決於你的目標是什麼。

在大多數情況下,這個默認值是有意義的。其中一個爬行與海葵並檢查數據。

當您執行新的抓取時,應刪除舊數據,以便新抓取的數據可以替換它。

如果您不希望發生這種情況,您可以在開始新爬網之前將存儲引擎指向新集合。

2)Mongoid不會爲你創建模型類。

您需要定義模型,以便mongoid知道爲集合創建一個類,並可選擇定義每個文檔所具有的字段,以便您可以使用開箱即用的.訪問器方法。

喜歡的東西:

class Page 
    include Mongoid::Document 
    field :url, type: String #i'm guessing, check what kind of docs anemone produces 
    field :aliases, type: Array 
    field .... 
end 

它可能需要包括以下字段:

  • 網址 - 該網頁的網址
  • 別名 - 即跳轉到該頁面的其他網址,或者該頁面重定向到 標題 - 完整的HTTP響應標題
  • 代碼 - HTTP響應代碼(例如200,301,404)
  • 體 - 原始HTTP響應身體
  • DOC - 頁面體的引入nokogiri :: HTML ::文獻(如果適用)
  • 鏈接 - 所有URL的數組發現指向同一個域的頁面

但請只是看看什麼類型(字符串,數組,等等)存儲引擎存儲着他們作爲和不作假設。

祝你好運!

+0

「如果您不希望發生這種情況,您可以在開始新爬網之前將存儲引擎指向新集合。」這是如何完成的? – sunnyrjuneja 2012-02-24 19:56:53

+2

您可以在初始化時將數據庫和集合名稱傳遞到存儲中:Anemone :: Storage.MongoDB('db_name','collection_name') – 2012-02-24 23:35:38

+0

謝謝,幫助! – sunnyrjuneja 2012-02-28 04:15:06