0

这适用于我拥有的网络抓取项目,并且我有兴趣找出最佳实践是什么。

目前我正在从 Craigslist 上抓取二手车的结果。我得到列表文本(列表)、价格、品牌、型号和车辆年份。

目前我的设置是这样的:

i = 0
@listings = []
# craigslist_data is scraped via nokogiri
craigslist_data.each do |listing|
  @listings << Array.new
  @listings[i] << listing
  i += 1
end

然后,我对价格、品牌、型号和年份使用类似的代码块。我最终得到这样的结果:

@listings = [["silver hyundai elantra 2004", "elantra", "hyundai", "$6000", "2004"], ["2008 chevy tahoe", "tahoe", "chevy", "$24000", "2008"]]

在另一篇文章中,有人告诉我使用这种风格,即迭代将数据推送到数组中是错误的代码。有人能告诉我这样做的正确方法是什么吗?

4

1 回答 1

1

将数据推送到数组中的一个问题是,如果您抓取的数据不一致(数据中存在错误或意外情况),您可能会弄乱一堆收集的数据。例如,假设您的刮板以某种方式结束:

craigslist_data_years = [y1...y10] # size == 10
craigslist_data_descriptions = [d2...d10] # size == 9

有 10 个列表,但第一个缺少描述。当您使用现有代码推送数据时,您通过将 y1 与 d2、y2 与 d3 等进行匹配,隐含地假设它是最后一个缺少描述的数据。现在您已经完全不匹配所有数据。

如果我要写这个,我想我会:

  • 创建具有描述、价格、品牌、型号和年份属性的列表类
  • 更改刮板以一次刮掉单个列表的所有属性
  • 抓取时将列表添加到数组中。

因此,当您抓取单个列表时,获取所有属性,实例化列表对象,然后将整个对象放入 @listings 数组。

此外,如果您希望仍然拥有包含所有列表的价格/描述/等的数组,您可以通过执行以下操作来实现此目的

listing_prices = @listings.map {|listing| listing.price}
于 2013-11-14T06:40:54.063 回答