MongoDB的去重

自己写了一个爬虫,编写mongo类insert功能时想要加一个判断语句避免爬取数据重复载入数据的情况,但是从实际运行情况来看,并不可行,先请各位看下代码:

class MongoPipeLine():

    def __init__(self):
        self.client = pymongo.MongoClient(SETTINGS.MONGO_URI,connect=False)
        self.db = self.client[SETTINGS.MONGO_DB]
        self.collection = SETTINGS.COLLECTION

    def insert(self,data):
        if self.db[self.collection].find(data) == 1:
            print('Data has been existed')
        else:
            self.db[self.collection].insert(data)

    def close(self):
        self.client.close()

调度函数:

spider = Spider()
mongo = MongoPipeLine()
image = ImagePipeLine()

def run(i):
    for page in range(i,i+20):
        response = spider.get_page(page)
        data_list = spider.parse(response)
        for data in data_list:
            mongo.insert(data)
            image.download(data)

if __name__ == '__main__':
    pool = Pool(20)
    pool.map(run,[i*20 for i in range(10)])
    pool.close()
    pool.join()
    mongo.close()

运行结果部分截图):

Isaiah Rustad Already download
Annie Spratt Already download
Alex Kalinin Already download
Jakob Owens Already download
Emily Henry Already download
  1. 从结果可以看到,尽管有些图片已经下载,对应的词条也保存在MongoDB,但是命令端的输出并没有'Data has been existed'的结果出现,显然判断语句后的操作并没有执行。
  2. 奇怪的是,我修改判断语句为'if self.db[self.collection].find(data) == 0:'后,输出结果与原来的输出无异,仍然没有'Data has been existed'
  3. 请教一下各位是否有什么低级错误是我没有考虑到的?

先谢谢大家,祝各位国庆节快乐!

阅读 3.1k
1 个回答

很奇怪,为什么find会范围0或者1呢。不是应该用countDocuments获取数量吗?你把查询到的结果输出看看。
然后你是以什么为查询条件去判断重复的呢?检查一下你的查询条件是不是有问题。
你这个是不是并发的,考虑并发带来的数据不一致了吗?比如某个线程插入A数据,另外一个线程又查询是否有A数据,但实际上第一个线程还没把数据插入成功。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏