我正在准备写我的第一个网络爬虫,看起来Anemone最有意义。有对MongoDB存储的内置支持,我已经在Rails应用程序中通过Mongoid使用MongoDB了。我的目标是存储抓取的结果,然后稍后通过Rails访问它们。我有几个问题:
1) 在这个页面的最后,它说"注意:每个存储引擎都会在开始新的爬网之前清除现有的Anemone数据。"如果我使用默认的内存存储,我希望这种情况会在爬网结束时发生,但这些记录不应该无限期地保存到MongoDB中,这样下次运行任务时就不会爬网重复的页面吗?如果它们在开始新的爬网之前被擦除,那么我应该在下一次爬网之前运行Rails逻辑吗?如果是这样的话,那么我最终将不得不检查上一次爬网中的重复记录。
2) 这是我第一次真正考虑在Rails模型的上下文之外使用MongoDB。看起来这些记录是使用Page
类创建的,所以我以后可以像通常使用Mongoid那样查询这些记录吗?我想,一旦ORM提供了花哨的方法,它就被认为是一个"模型"了?
好问题。
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,或此页面重定向到的页面headers-完整的HTTP响应标头
- code-HTTP响应代码(例如200、301、404)
- body-原始HTTP响应正文
- doc-页面正文的Nokogiri::HTML::文档(如果适用)
- links-页面上指向同一域的所有URL的数组
但是,请看看存储引擎将它们存储为什么类型(字符串、数组等),不要做假设。
祝你好运!