重复数据_MongoDB 自动过滤重复数据

摘要:使用 update_one() 方法而不是 insert_one() 插入数据。

相信你一定有过这样的经历:大晚上好不容易写好一个爬虫,添加了种种可能出现的异常处理,测试了很多遍都没有问题,点击了 RUN 开始正式运行 ,然后美滋滋地准备钻被窝睡觉,睡前还特意检查了下确认没有问题,合上眼后期待着第二天起来,数据都乖乖地躺在 MongoDB 中。第二天早上一睁眼就满心欢喜地冲到电脑前,结果发现爬虫半夜断了,你气得想要砸电脑,然后你看了一下 MongoDB 中爬了一半的数据,在想是删掉重新爬,还是保留下来接着爬。

到这儿问题就来了,删掉太可惜,接着爬很可能会爬到重复数据,虽然后期可以去重,但你有强迫症,就是不想爬到重复数据,怎么办呢?

这就遇到了「爬虫断点续传」问题,关于这个问题的解决方法有很多种,不过本文主要介绍数据存储到 MongoDB 时如何做到只插入新数据,而重复数据自动过滤不插入。

先来个简单例子,比如现在有两个 list ,data2 中的第一条数据和 data 列表中的第一条数据是重复的,我们想将这两个 list 依次插入 MnogoDB 中去, 通常我们会使用 insert_one() 或者 insert_many() 方法插入,这里我们使用 insert_one() 插入,看一下效果。

 1data = [2{'index':'A','name':'James','rank':'1' },3{'index':'B','name':'Wade','rank':'2' },4{'index':'C','name':'Paul','rank':'3' },5]67data2 = [8{'index':'A','name':'James','rank':'1' },9{'index':'D','name':'Anthony','rank':'4' },
10]
11
12import pymongo
13client = pymongo.MongoClient('localhost',27017)
14db = client.Douban
15mongo_collection = db.douban
16
17for i in data:
18    mongo_collection.insert_one(i)

插入第一个 list :

ced2670f47ea142b60b97a480d9eafe0.png

插入第二个 list :

711d52c15d216c30be8e555288a40848.png

你会发现,重复的数据 A 被插入进去了,那么怎么只插入 D,而不插入 A 呢,这里就要用到 update_one() 方法了,改写一下插入方法:

1for i in data2:
2    mongo_collection.update_one(i,{'$set':i},upsert=True)

17c798e07f1f136e4d282b0a2e9f358e.png

这里用到了 $set 运算符,该运算符作用是将字段的值替换为指定的值,upsert 为 True 表示插入。这里也可以用 update() 方法,但是这个方法比较老了,不建议使用。另外尝试使用 update_many() 方法发现不能更新多个相同的值。

1for i in data2:
2    mongo_collection.update(i, i, upsert=True)

下面举一个豆瓣电影 TOP250 的实例,假设我们先获取 10 个电影的信息,然后再获取前 20 个电影,分别用 insert_one() 和 update_one() 方法对比一下结果。

insert_one() 方法会重复爬取前 10 个电影,最终生成 30 个数据:

4c96db44d303db1ea694eb938cbb852d.png

update_one() 方法则只会插入新的 10 个电影,最终生成 20 个数据:

7d05a115232a8cee464d695b2c57dd1d.png

这就很好了对吧,所以当我们去爬那些需要分页的网站,最好在爬取之前使用 update_one() 方法,这样就算爬虫中断了,也不用担心会爬取重复数据。

代码实现如下:

 1import requests2import json3import csv4import pandas as pd5from urllib.parse import urlencode6import pymongo78client = pymongo.MongoClient('localhost', 27017)9db = client.Douban
10mongo_collection = db.douban
11class Douban(object):
12    def __init__(self):
13        self.url = 'https://api.douban.com/v2/movie/top250?'
14
15    def get_content(self, start_page):
16        params = {
17            'start': start_page,
18            'count': 10
19        }
20        response = requests.get(self.url, params=params).json()
21        movies = response['subjects']
22        data = [{
23            'rating': item['rating']['average'],
24            'genres':item['genres'],
25            'name':item['title'],
26            'actor':self.get_actor(item['casts']),
27            'original_title':item['original_title'],
28            'year':item['year'],
29        } for item in movies]
30
31        self.write_to_mongodb(data)
32
33    def get_actor(self, actors):
34        actor = [i['name'] for i in actors]
35        return actor
36
37    def write_to_mongodb(self, data):
38        for item in data:
39            if mongo_collection.update_one(item, {'$set': item}, upsert=True):
40                # if mongo_collection.insert_one(item):
41                print('存储成功')
42            else:
43                print('存储失败')
44
45    def get_douban(self, total_movie):
46        # 每页10条,start_page循环1次
47        for start_page in range(0, total_movie, 10):
48            self.get_content(start_page)
49
50if __name__ == '__main__':
51    douban = Douban()
52    douban.get_douban(10)

本文完。


推荐阅读:

从函数 def 到类 Class

从 类 Class 到 Scrapy

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多个canvas画布合并_canvas的基础入门

nvas是定义在浏览器上的画布。它不仅仅是一个标签元素更是一个编程工具是一套编程的接口。利用它可以开发出很多东西,比如动画,游戏,动态的图表等富有变现力和感染力的应用。还可以开发出绚丽的3D动态效果。接下来我们一起学习!一…

工业机器人专业展板图片_南充职业技术学院工业机器人专业线下课程开展情况...

2020年5月18日,南充职业技术学院线下课程已全面展开,下面是工业机器人技术专业的开课情况。历时4个多月的假期,即将开课。在开课前两天,我司专业教师到学院检查维护机器人设备,以保障学生们能够正常使用工业机器人相关…

vmware挂载san存储_细述企业级存储NAS和SAN差异

常见服务器磁盘类型SAS:容量小,300G,600G,价格贵SATA:容量大,4T,不支持热插拔,价格低假SAS:容量大,支持热插拔,价格低,(就是SAS接口的…

蓝牙核心技术了解(蓝牙协议、架构、硬件和软件笔记)

声明:这篇文章转载beautifulzzzz笔记,网址:http://www.cnblogs.com/zjutlitao/,其中比较多的受益于xubin341719的蓝牙系列文章,同时还有其他网上作者的资料。由于有些文章只做参考或统计不足,如涉及版权请在…

初中英语多词性单词怎么办_高考英语阅读理解生僻单词太多怎么办?十大招数帮到你...

英语阅读理解生僻单词太多怎么办?今天,胡老师告诉你猜词十大招数,帮助同学们英语考试拿高分。01 构词法阅读中常常会遇到一些由熟悉的单词派生或合成的新词。掌握构词法对猜测词义很有帮助。如:unforeseeable.这个词,可…

springboot jwt token前后端分离_基于Spring Boot+Spring Security+JWT+Vue前后端分离的开源项目...

一、前言最近整合Spring BootSpring SecurityJWTVue 完成了一套前后端分离的基础项目,这里把它开源出来分享给有需要的小伙伴们功能很简单,单点登录,前后端动态权限配置,前端权限精确到 按钮 级别,后端权限精确到 url …

springboot 微服务_使用 Docker 部署 Spring Boot微服务

Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常简单,这篇文章我们就来简单学习下。首先构建一个简单的 Spring Boot 项目,然后给项目添加 Docker 支持,最后对项目进行部署。一个简单 Sp…

sql 除以_刷完这些SQL练习题,简单查询就熟能生巧了

练习题:SQLZOO表:(图片未显示全部列)(1)SELECT basics:(简单查询)SELECT basics/zh​sqlzoo.net①The example uses a WHERE clause to show the population of France. …

Tomcat 总体结构

http://threezj.com/2016/06/25/Tomcat%20%E6%9E%B6%E6%9E%84%E6%8E%A2%E7%B4%A2/ Tomcat 架构探索 發表於 2016-06-25 | 前言 花了一个礼拜的时间阅读了 how tomcat works,本文基于此书,整理了一下Tomcat 5的基本架构,其实也没什么多复杂…

sql 存储过程 盲注入_一次非常规 SQL 注入(informixsql)的利用过程

介绍一个客户正在寻找升级他们的思科 UCM 软件,并希望保证他们的实现是安全配置的。在评估期间,我们在 Cisco UCM 管理员门户中发现了一个经过身份验证的 SQL 注入问题。在大多数情况下,可以使用 SQLMap 或其他工具来自动发现问题。由于我们是…

自定义鼠标指针轨迹_win10鼠标自定义颜色,鼠标属性设置,这样就不眯眼了

电脑用多了,眼睛受不了,这时候就需要各种护眼模式,把画面放大,指针放大,来解决眼睛盯着电脑累的问题了,一不留神发现鼠标指针变大好处多多,下面设置一下win10系统鼠标指针大小、颜色都是默认设置…

mysql linux_linux下mysql下载安装

1、下载地址https://www.mysql.com/downloads/选择community server点击DOWLOAD选择版本,当前选择的5.6版本点击下载mysql-5.6.38-linux-glibc2.12-i686.tar.gz选择no thanks2、安装mysqltar -xvzf mysql-5.6.38-linux-glibc2.12-i686.tar.gzmv mysql-5.6.38-linux…

java代码生成器 快速开发平台 二次开发 外包项目利器 springmvc SSM后台框架源码...

A代码编辑器,在线模版编辑,仿开发工具编辑器,pdf在线预览,文件转换编码B 集成代码生成器 [正反双向](单表、主表、明细表、树形表,快速开发利器)快速表单构建器 freemaker模版技术 ,0个代码不用写&#xff…

php mysql搭建_PHP+MYSQL的搭建_MySQL

现在准备研究下微信的开发,所以要研究下PHP了,但对这个平台还是很陌生的,所以网上找了些资料并测试,现贴出来给大家参考。第一步:我们先下载【PHPStudy 2013】或者最新版本;下载地址: http://do…

锐捷交换机实验案例:vlan间互访的配置与验证

组网需求: 1、如下图所示,某用户内网被划分为VLAN 10、VLAN 20、VLAN 30,以实现相互间的2 层隔离; 2、3 个VLAN 对应的IP 子网分别为192.168.10.0/24 、192.168.20.0/24 、192.168.30.0/24,3 个VLAN 通过3 层核心交换机…

mysql innodb隔离级别_浅析MySQL InnoDB的隔离级别

本文就将对上面这两个问题进行解答,分析事务的隔离级别以及相关锁机制。隔离性简介隔离性主要是指数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的"独立"环境执行,意思就是多个事务并发执行时,一个事务…

sql 2008服务器内存一直居高不下_经验之谈:内存问题造成数据库性能异常怎么破?...

作者:罗贵林原文链接:https://mp.weixin.qq.com/s/2e5eKSoGlU9J4Rjq1zwLnw导读:在使用数据库的过程中,内存不足常常会引起数据库异常。但是内存不足,又会为数据库带来哪些具体的影响呢?本次,我们…

mysql 字符串匹配函数_mysql 自定义函数 实现字符串匹配

先来一个截图:fSearch函数的第一个参数为单一字符串(即 没有特殊字符串隔开)fSearch函数的第一个参数非单一字符串多个字符串同样可以匹配。函数代码:DELIMITER $$Create function fSearch(targetStr VARCHAR(100),findStr VARCHAR(100)) RETURNS INTBEG…

stm32时钟树_先学STM8,还是学STM32?

有朋友问:我学习过51,接下来我是先学习STM8,还是STM32呢?物联网STM32入门 - 直播课程 - 创客学院​www.makeru.com.cn嵌入式开发直播课 - STM32 USART串口的应用 - 创客学院直播室​www.makeru.com.cn1、写在前面想要明白这个问题…

如何使用django显示一张图片

django显示图片对新手来说真的算是一个坑。。 这里记录下小白爬坑的历程。 首先&#xff0c;你需要一个可以运行的django服务器&#xff0c;能显示正常的html文本&#xff0c;无法显示图片 这是html的文本&#xff0c;可以显示文字&#xff0c;无法显示图片 <h1>An Image…