Mongodb去除重複的數據,pymongo去重

接上一篇的,發現爬鬥魚主播信息存入Mongodb數據庫後,發現不少重複的數據,畢竟鬥魚不可能有這麼多的主播,因此不少頁是有重複的主播房間的。html

查了一下怎麼去重,發現比較麻煩,與其存入重複的數據後面再去重,還不如在存入數據庫的時候就檢查,不去存入重複的數據,這樣就避免了後期再去作去重工做。因而改動以下:
數據庫

#-*- 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)])

 

這個方法若是碰到基礎數據量很大的狀況下至關緩慢,這裏是個人一個解決方案json

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

 

 

若是是已經存入數據庫的數據,就須要從新遍歷去重後逐條存入新的數據庫中。雖然用了多線程,數據量大的話速度仍是挺慢的。多線程

#-*- 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()])
相關文章
相關標籤/搜索