【问题标题】:Anemone with Rails and MongoDB海葵与 Rails 和 MongoDB
【发布时间】:2012-02-24 06:10:20
【问题描述】:

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

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

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

【问题讨论】:

    标签: mongodb ruby-on-rails-3.1 mongoid web-crawler anemone


    【解决方案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,或此页面重定向到的页面 headers - 完整的 HTTP 响应标头
    • code - HTTP 响应代码(例如 200、301、404)
    • body - 原始 HTTP 响应正文
    • doc - 页面正文的 Nokogiri::HTML::Document(如果适用)
    • links - 在页面上找到的指向同一域的所有 URL 的数组

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

    祝你好运!

    【讨论】:

    • “如果您不希望发生这种情况,您可以在开始新的爬网之前将存储引擎指向一个新的集合。”这是怎么做到的?
    • 初始化时可以将数据库和集合名称传入存储:Anemone::Storage.MongoDB('db_name', 'collection_name')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 2013-10-14
    • 2012-01-09
    相关资源
    最近更新 更多