我想阻止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)
一切正常,重复删除。
我的问题是:
答案 0 :(得分:0)
我曾经遇到类似的情况,我在处理大量数据。最后,我决定每次检查项目的标识符是否已存在于数据库中。与您的解决方案相比,此解决方案允许您多次重新启动爬网程序,并确保您没有重复数据库。此外,您甚至可以使用它来更新数据库。
答案 1 :(得分:0)
这是一个很难回答的问题,因为它非常非常依赖于您的数据以及项目目标/需求。这类似于询问"晚餐应该送什么菜?"不要在盘子里喝汤,也不要在茶杯里烤鸡肉。
直接回答你的问题:
MemoryError
。 MemoryError
并停止工作。哪个,可能更糟。您还必须考虑如何定义"重复项目"?是否存储了超出产品/价格的任何其他信息(并且它是否重要)?是否要在以前的爬网中看到的数据库中存储项目?您的预期数据集有多大?
原样,这种情况因a = {'product': "Phone", 'price': "29.99"}
和a = {'product': "Phone2", 'price': "9.99"}
等数据而开始失败,因为它们都评估为'Phone29.99'
。
您可以考虑散列,或在更多/更少的字段上过滤重复项。还应该注意的是,这并没有检查数据库是否有重复项,并且已经看到的项目不会在调用过程中持续存在。