1

我正准备编写我的第一个网络爬虫,看起来Anemone最有意义。内置了对 MongoDB 存储的支持,我已经在我的 Rails 应用程序中通过 Mongoid 使用 MongoDB。我的目标是存储爬取的结果,然后通过 Rails 访问它们。我有几个担忧:

1)在本页末尾,写着注意:每个存储引擎都会在开始新的爬取之前清除现有的海葵数据。” 如果我使用默认内存存储,我希望这会在爬网结束时发生,但不应该将记录无限期地保存到 MongoDB,以便下次运行任务时不会爬网重复页面?如果它们在“开始新的爬网之前”被擦除,那么我应该在下一次爬网之前运行我的 Rails 逻辑吗?如果是这样,那么我最终将不得不检查之前抓取的重复记录。

2) 这是我第一次真正考虑在 Rails 模型的上下文之外使用 MongoDB。看起来记录是使用Page类创建的,所以我以后可以像通常使用 Mongoid 一样查询这些吗?我想一旦它有一个提供花哨方法的 ORM,它就被认为是一个“模型”?

4

1 回答 1

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

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

  • url - 页面的 URL
  • aliases - 重定向到此页面的其他 URL,或此页面重定向到的页面 headers - 完整的 HTTP 响应标头
  • code - HTTP 响应代码(例如 200、301、404)
  • body - 原始 HTTP 响应正文
  • doc - 页面正文的 Nokogiri::HTML::Document(如果适用)
  • 链接 - 在页面上找到的指向同一域的所有 URL 的数组

但是请看一下存储引擎将它们存储为什么类型(字符串、数组等),不要做任何假设。

祝你好运!

于 2012-02-24T19:26:26.920 回答