在我的Scrapy项目中,我使用PyMongo将抓取的数据存储在MongoDB中。以逐页方式抓取网页时存在重复记录,我只想删除那些在将它们插入数据库时具有相同名称的重复记录。请向我建议最佳解决方案。 这是我在"pipelines.py"
的代码。请指导我如何在方法中删除重复项"process_item"
。我发现很少有查询可以从互联网上的数据库中删除重复项,但想要一个 Python 解决方案。
from pymongo import MongoClient
from scrapy.conf import settings
class MongoDBPipeline(object):
def __init__(self):
connection = MongoClient(
settings['MONGODB_SERVER'],
settings['MONGODB_PORT'])
db = connection[settings['MONGODB_DB']]
self.collection = db[settings['MONGODB_COLLECTION']]
def process_item(self, item, spider):
self.collection.insert(dict(item))
return item
这有点取决于item
中的内容,但我会像这样使用更新插入
def process_item(self, item, spider):
# pseudo example
_filter = item.get('website')
update = item.get('some_params')
if _filter:
# example
# self.collection.update_one(
# {"website": "abc"},
# {"div foo": "sometext"},
# upsert=True
# )
self.collection.update_one(_filter, update, upsert=True)
return item
您也可以使用过滤器。基本上,您甚至不必删除欺骗。如果应用得当if-else
它就像条件一样工作。如果对象不存在,请创建一个。否则,使用给定键上的给定属性进行更新。就像在字典里一样。最坏的情况是使用相同的值进行更新。因此,它比插入、查询和删除找到的重复项更快。
文档
MongoDB中没有字面上的if-else
,自动丢弃欺骗@tanaydin建议也适用于Python。这可能比我的建议更好,这取决于你真正需要什么。
如果你真的想删除给定一些标准的文档,那么pymongo中有delete_one
和delete_many
。
文档