zoukankan      html  css  js  c++  java
  • Mongodb去除重复的数据,pymongo去重

    接上一篇的,发现爬斗鱼主播信息存入Mongodb数据库后,发现很多重复的数据,毕竟斗鱼不可能有这么多的主播,所以很多页是有重复的主播房间的。

    查了一下怎么去重,发现比较麻烦,与其存入重复的数据后面再去重,还不如在存入数据库的时候就检查,不去存入重复的数据,这样就避免了后期再去做去重工作。于是改动如下:

    #-*- coding:utf-8 -*-
    #_author:John
    #date:2018/10/25 0:07
    #softwave: PyCharm
    import requests
    import json
    from multiprocessing import Pool
    import pymongo
    import datetime
    
    client = pymongo.MongoClient('localhost')
    db = client['douyu']
    cur_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M')
    
    def single_page_info(page):
        respones = requests.get('https://www.douyu.com/gapi/rkc/directory/0_0/{}'.format(page))
        datas = json.loads(respones.text)
        items = datas['data']['rl']
        for item in items:
            data = {
                '标题': item['rn'],
                '主播': item['nn'],
                '人气': item['ol'],
                '类别': item['c2name'],
                '房间号': item['rid'],
                '时间': cur_time
            }
            # 不保存相同时间相同主播名的记录
            if db['host_info'].update({'主播': data['主播'], '时间': data['时间']}, {'$set': data}, True):
                print('Save to Mongo, {}'.format(data))
            else:
                print('Save to Mong fail, {}'.format(data))
        print('已经完成第{}页'.format(page))
    
    if __name__ == '__main__':
        pool = Pool()
        #多线程抓200页
        pool.map(single_page_info, [page for page in range(1, 201)])

    这个方法如果碰到基础数据量很大的情况下相当缓慢,这里是我的一个解决方案

    https://www.cnblogs.com/lkd8477604/p/10201137.html

    如果是已经存入数据库的数据,就需要重新遍历去重后逐条存入新的数据库中。虽然用了多线程,数据量大的话速度还是挺慢的。

    #-*- coding:utf-8 -*-
    #_author:John
    #date:2018/12/31 14:34
    #softwave: PyCharm
    import pymongo
    from multiprocessing import Pool
    
    client = pymongo.MongoClient('localhost')
    db = client['douyu']def save_to_mongo(data):
        db['host_info_new'].update({'主播': data['主播'], '时间': data['时间']}, {'$set': data}, True)
        print(data)
    if __name__ == '__main__':
        pool = Pool()
        pool.map(save_to_mongo, [data for data in db['host_info_old'].find()])
  • 相关阅读:
    bzoj 4245: [ONTAK2015]OR-XOR【按位贪心】
    bzoj 4247: 挂饰【dp】
    bzoj 3503: [Cqoi2014]和谐矩阵【高斯消元】
    bzoj 3029: 守卫者的挑战【概率dp】
    bzoj 3732: Network【克鲁斯卡尔+树链剖分】
    bzoj 1040: [ZJOI2008]骑士【基环树+树形dp】
    bzoj 3668: [Noi2014]起床困难综合症【贪心】
    bzoj 2157: 旅游【树链剖分+线段树】
    bzoj 4521: [Cqoi2016]手机号码【数位dp】
    bzoj 3437: 小P的牧场【斜率优化】
  • 原文地址:https://www.cnblogs.com/lkd8477604/p/9848958.html
Copyright © 2011-2022 走看看