过滤重复的项目

时间:2015-08-14 09:30:46

标签: python scrapy

我想阻止Scrapy保存到数据库重复项。为此,我使用了Scrapy教程“复制过滤器”部分中显示的相同策略,可以找到here

我写的是:

id = str(item['product'] + item['price'])
print id
if id in self.ids_seen:
        raise DropItem("Duplicate item found!")
else:
        self.ids_seen.add(id)
        self.collection.insert(dict(item))
        log.msg("Entry added to MongoDB database!",
            level=log.DEBUG, spider=spider)

一切正常,重复删除。

我的问题是:

  1. 这是否适用于大型数据集?
  2. 如果套装变得非常大,那么蜘蛛会变得太慢吗?
  3. 有没有更好的解决方案来解决这个问题?

2 个答案:

答案 0 :(得分:0)

我曾经遇到类似的情况,我在处理大量数据。最后,我决定每次检查项目的标识符是否已存在于数据库中。与您的解决方案相比,此解决方案允许您多次重新启动爬网程序,并确保您没有重复数据库。此外,您甚至可以使用它来更新数据库。

答案 1 :(得分:0)

这是一个很难回答的问题,因为它非常非常依赖于您的数据以及项目目标/需求。这类似于询问"晚餐应该送什么菜?"不要在盘子里喝汤,也不要在茶杯里烤鸡肉。

直接回答你的问题:

  1. 它应该很好,但它确实取决于你的数据集(什么是"产品"?什么是"大"?)。如果你的集合太大,Python将通过MemoryError
  2. 有了一套,它不会真的减速,只会点击MemoryError并停止工作。哪个,可能更糟。
  3. 如果这是一个问题,您需要使用其他存储方法。列表将允许更多项目(它们本身小于一组,因此使用更少的内存),但需要更多时间来检查。数据库(仅用于存储"重复和#34;用于运行是另一种选择)。
  4. 您还必须考虑如何定义"重复项目"?是否存储了超出产品/价格的任何其他信息(并且它是否重要)?是否要在以前的爬网中看到的数据库中存储项目?您的预期数据集有多大?

    原样,这种情况因a = {'product': "Phone", 'price': "29.99"}a = {'product': "Phone2", 'price': "9.99"}等数据而开始失败,因为它们都评估为'Phone29.99'

    您可以考虑散列,或在更多/更少的字段上过滤重复项。还应该注意的是,这并没有检查数据库是否有重复项,并且已经看到的项目不会在调用过程中持续存在。

相关问题