1

初めての Web クローラーを作成する準備をしていますが、Anemoneが最も理にかなっているようです。MongoDB ストレージの組み込みサポートがあり、Rails アプリケーションで Mongoid 経由で MongoDB を既に使用しています。私の目標は、クロールされた結果を保存し、後で Rails 経由でアクセスすることです。いくつかの懸念があります。

1)このページの最後に、注:すべてのストレージ エンジンは、新しいクロールを開始する前に、既存の Anemone データを消去します。」と記載されています。デフォルトのメモリ ストレージを使用していた場合、これはクロールの最後に発生すると予想されますが、次にタスクを実行するときに重複するページがクロールされないように、レコードを無期限に MongoDB に保存するべきではありませんか? それらが「新しいクロールを開始する前に」消去された場合、次のクロールの前に Rails ロジックを実行する必要がありますか? もしそうなら、前回のクロールからの重複レコードをチェックしなければならなくなります。

2) Rails モデルのコンテキスト外で MongoDB を使用することについて真剣に考えたのはこれが初めてです。レコードはPageクラスを使用して作成されているように見えますが、後で通常 Mongoid を使用するようにクエリを実行できますか? ファンシーメソッドを提供するORMがあれば、それは単に「モデル」と見なされると思いますか?

4

1 に答える 1

3

素晴らしい質問です。

1)それはあなたの目標が何であるかによって異なります。

ほとんどの場合、このデフォルトは理にかなっています。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

おそらく、次のフィールドを含める必要があります。

  • url - ページの URL
  • エイリアス - このページにリダイレクトされた他の URL、またはこのページがヘッダーにリダイレクトするページ - 完全な HTTP 応答ヘッダー
  • code - HTTP 応答コード (例: 200、301、404)
  • body - 生の HTTP レスポンス本文
  • doc - ページ本文の Nokogiri::HTML::Document (該当する場合)
  • links - 同じドメインを指すページで見つかったすべての URL の配列

ただし、ストレージ エンジンがそれらを格納しているタイプ (文字列、配列など) を見てください。仮定はしないでください。

幸運を!

于 2012-02-24T19:26:26.920 に答える