【问题标题】:Advice on storing scraped data with changing fields使用更改字段存储刮取数据的建议
【发布时间】:2016-02-16 07:14:54
【问题描述】:

我正在尝试从网站上抓取数据以构建有关产品功能的数据集,其中每一行是一个产品,每一列是一个功能。我的爬虫返回以下 JSON 数据:

{
  "data": [{
    "id": "001",
    "price": "$12",
    "color": "blue"
  }, {
    "id": "002",
    "price": "$13",
    "color": "red"
  }]
}

在过去,我能够轻松地将这些类型的数据存储在 CSV 中,如下所示(哈希=上面的 JSON 数据):

CSV.open("data.csv","w") do |c|
    c << hash["data"][0].keys
end
hash["data"].each do |d|
    CSV.open("data.csv","a+") do |c|
        c << d.values
    end
end

但是JSON数据中的字段不是常量:

{
  "data": [{
    "id": "001",
    "price": "$12",
    "color": "blue"
  }, {
    "id": "002",
    "price": "$13",
    "discount": "0.05",
    "color": "red"
  }]
}

我的 CSV 代码不再适用于这些数据。 discount 出现在 color 字段中,实际的 color 字段向右移动一列。

存储散列数组的最佳方法是什么?更一般地说,CSV 与基于 SQL 与基于文档的权衡是什么?

谢谢。

【问题讨论】:

    标签: ruby json sqlite csv web-scraping


    【解决方案1】:

    我认为使用 CSV 文件没有任何优势。

    我会使用 MongoDB,特别是 Mongoid。或者您可以使用 Postgres 和 JSON 字段。以下是使用 Mongoid 的方法:

    scraping = {
      "data": [{
        "id": "001",
        "price": "$12",
        "color": "blue"
      }, {
        "id": "002",
        "price": "$13",
        "color": "red"
      }]
    }
    
    Item.create( data:scraping )
    

    item.rb:

    class Item
      include Mongoid::Document
    
      field :data, type:Hash
    

    数据将被序列化为 BSON,因此任何深度的有效 JSON 都可以工作。

    但是,请务必阅读legal key names for mongoDB

    Reference

    【讨论】:

    • 谢谢。我认为“字段数据”应该是“字段:数据”。我尝试运行它,但它产生了以下错误:“Mongoid::Errors::UnknownAttribute: message: Attempted to set a value for 'data' which is not allowed on the model Item.”
    • 是的,你是对的。应该是:data。我用 Mongoid 5.0.1 对其进行了测试,并且成功了。
    • 我也在使用 Mongoid 5.0.1。我忘了提到一开始我收到了一条不同的错误消息,我试图通过提供一个默认值作为 {} 来修复它。这是原始错误消息:Mongoid::Errors::NoClientConfig: message: No configuration could be found for a client named 'default'。摘要:尝试创建新客户端时,Mongoid 找不到名称为“默认”的客户端配置。这对于了解连接所需的主机、端口和选项是必要的。分辨率:
    • 谢谢。我制作了一个 mongoid.yml 文件并通过“加载!”链接它但它不起作用。我会花更多时间试图弄清楚。 Postgres 示例会是什么样子?你能指出/创建一个类似于 Mongoid 的简单示例吗?
    猜你喜欢
    • 2020-10-25
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 2012-11-13
    • 2012-11-23
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    相关资源
    最近更新 更多