如何在Scrapy项目中使用PyMongo插入新记录MongoDB时删除重复项



在我的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_onedelete_many

文档

最新更新