Python爬虫-MongoDB

2023-11-19

Python爬虫-MongoDB



前言

如果仅考虑自己爬虫自己使用,我是推崇MongoDB的——暴力直接。一个字典insert下去,世界从混沌归于一片宁静。况且与MySQL相比,MongoDB的结构不用固定,其域(也就是MySQL中的列),可以在这个文档中6个,下个文档里4个。也不用考虑数据类型匹不匹配。当然不得不说其实各有千秋的,这里就不深究啦!
由于操作起来着实简单,上篇【二进制记得】也试演过一次,这里就不再实战了。

与MySQL对比

SQL术语/概念 MongoDB术语/概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins 表连接/mongodb不支持
primary key primary key 主键/mongodb自动将_id设置主键

三原素:数据库,集合,文档

启动/关闭MongoDB

  1. win : mongod.exe --dbpath=D:\mongodb\data\db (指定存放路径)
  2. linux :mongod start/stop

操作

进入shell:mongo
退出shell:exit
这里写图片描述

数据库操作

  1. 查看当前数据库名字:db
  2. 查看当前数据状态:db.stats()
  3. 显示所有数据库:show dbs
  4. 切换数据库:use 数据库名如果数据库不存在,就指向数据库但不会创建,直到插入数据或是创建集合之后才会创建数据库
  5. 删除数据库:db.dropDatabase()先切换到将要删除的数据库,删除数据库之后并不会立马退出,但被删除的数据库已经不存在了
    这里写图片描述
    这里写图片描述
    这里写图片描述

集合操作

  1. 创建集合:db.createCollection(name, options)
    举例:
    a. db.createCollection("comments", {capped:true, size:10, max:2})
    b. db.createCollection("comments") (capped默认false,即无上限;size指大小,单位字节;max指数量上限)只有在用了size的情况下才能用max
  2. 查看当前所有集合:show collections
    这里写图片描述
  3. 删除集合:db.集合名.drop()

数据操作

db.集合名.insert(document)document是构建的一个json文件(可以类比python中的字典)
这里写图片描述

  1. db.集合名.remove({条件})
  2. db.集合名.remove({条件}, {justOne:true})
    以上都不能对创建集合时设置了capped:true的集合删除;对于capped:true的集合,只能删除文档
  1. 更新数据:db.集合名.update({原属性}, {修改属性}, {multi:true})(默认multi值为false,只更新一条;如果true,表示更新区配到的整个文档)
    这里写图片描述
    如果原属性存在,但修改属性里没写,这个属性在修改后就不存在了;相反,如果原属性不存在,但修改属性里有,修改后增加相应的属性
  2. 指定属性更新数据:db.集合名.update({原属性}, {$set:{属性}}, {multi:true})
    与1不同的是,在指定属性更新里面,原属性存在,修改属性里没写不会消失;而原属性不存在,修改属性里写了的,会增加

db.集合名.find()显示全部文档
db.集合名.findOne()显示第一条文档
这里写图片描述

保存
  1. db.集合名.save{文档}
    保存是指,如果主键已经存在,就执行更新(update)功能;如果不存在,就执行插入(insert)功能(主键就是_id,如果没写,系统会自动分配一个)

运算符

  1. $lt/lte/gt/gte/ne,小于/小于等于/大于/大于等于/不等于,默认则等于
    这里写图片描述
    用法:db.集合名.find({条件})

  2. and:db.集合名.find({条件1, 条件2, ...})
    这里写图片描述
    满足条件1并且满足条件2如果没有符合条件的数据,则无返回

  3. or:db.集合名.find({$or:[{条件1}, {条件2}]})
    这里写图片描述
    满足条件1或者条件2

  4. and, or的组合使用:db.集合名.find({$or:[条件1, 条件2...], 条件3, ...})
    这里写图片描述
    满足条件1或者条件2的同时,必须满足条件3

  5. 范围:db.集合名.find({a:{$in:[1, 2, 3]}})
    这里写图片描述
    a的值的范围应该是中括号里枚举出来的范围

  6. 支持正则,以下图数据为例
    这里写图片描述
    使用正则有以下两种方法,结果都是一样的
    a. db.comments.find({name:/^黄/})
    b. db.comments.find({name:{$regex:"^黄"}})
    这里写图片描述

  7. 自定义查询:db.集合名.find({$where:function(){return this.age<25}})这里其实利用的是javascript的知识,function(){…}是js中的匿名函数。有编程基础的应该能够看懂,就是返回age值小于25的数据
    这里写图片描述

  8. 读取指定数量的文档:db.集合名.find(...).limit(n)表示显示满足条件的前n条数据

  9. 跳过指定数量的文档:db.集合名.find(...).skip(n)表示跳过前n条满足条件的数据,再显示
    limit和skip可以一起使用,不分先后顺序
    这里写图片描述

  10. 投影(显示自己需要的字段):db.集合名.find({条件...}, {字段1:1,字段2:1}),这里1表示显示的意思,0为默认值,即不显示,但针对_id字段,必须指定0,才会不显示
    这里写图片描述

  11. 排序:db.集合名.find().sort({age:1, level:-1})(1表示升序,-1表示降序;先按照age升序,再按照level降序)

  12. 统计个数:db.集合名.count({条件})

  13. 消除重复:db.集合名.distinct("预设字段", {条件}),按条件返回预设字段,如果预设的字段出现重复就去重
    这里写图片描述
    这里写图片描述

高级操作

聚合

db.集合名.aggregate([{管道:{表达式}}])

常用管道

$group:将集合中的文档分组,可用于统计结果
$match:过滤数据,只输出符合条件的文档
$project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
$sort:将输入文档排序后输出
$limit:限制聚合管道返回的文档数
$skip:跳过指定数量的文档,并返回余下的文档
$unwind:将数组类型的字段进行拆分

常用表达式

$sum:计算总和,$sum:1同count表示计数
$avg:计算平均值
$min:获取最小值
$max:获取最大值
$push:在结果文档中插入值到一个数组中
$first:根据资源文档的排序获取第一个文档数据
$last:根据资源文档的排序获取最后一个文档数据


这里不深入,因为我认为爬虫暂时用不到这些功能,用不到的知识,学了只是负担,对一般人而言的话

安全性

MongoDB是默认不需要密码的,但为了安全性,可以设置
第一步:use admin
第二步:db.createUser({user:..., pwd:..., roles:[role:..., db:...]})
这里写图片描述
针对role:
root:只在admin数据库中可用,超级账号,超级权限
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
第三步:sudo vim /etc/mongodb.conf 开启认证
这里写图片描述
第四步:重启mongodb
此时如果mongo,切换admin,对这个数据库操作将会报错
这里写图片描述
所以需要认证的方式登陆
这里写图片描述
语句:mongo -u "" -p "" --authenticationDatabase "数据库"


修改用户密码:db.updateUser("用户名", {pwd:"..."})

与python交互

  1. 导入模块:import pymongo
  2. 连接mongo:client = pymongo.MongoClient("localhost", 27017)
  3. 指定数据库:db = client.数据名
  4. 指定集合:collection = db.集合名

内置方法1:
insert_one()insert_many()
update_one()/update_many()
delete_one()/delete_many()
find_one()/find()
remove_one()/remove_many()

在mongodb中,insert({“name”:“郭靖”})和insert({name:“郭靖”})效果是一样的;但是在与python的交互中,必须前者,后者会报错(其实就是参数得是字典啦)
利用find()函数,返回的是一个迭代器,需要用next或者for遍历
这里写图片描述


内置方法2:
count() 统计总数
sort() 排序
这里写图片描述
如果是pymon.ASCENDING则为升序;多属性排序:sort([(...), (...)])

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python爬虫-MongoDB 的相关文章

随机推荐

  • 网页是如何显示在浏览器

    这两天学习了一些网页如何在浏览器中显示的知识 感觉在我向前端走的路上非常有用 所以就在这里总结一下 大家可以看看 我也算是巩固一下知识 因为自己学识太浅 内容可能有一些错误之处 希望看到的朋友可以指出来啦 在Edge浏览器也加入Chromi
  • 低投入也有高效率!Fortinet 安全 SD-WAN方案赋能金融保险行业

    当前 金融保险等行业进入数字化转型的快速发展阶段 数字化效能不断提升的同时 也对广域网等基础IT建设提出了更高的需求 某保险公司在全国的省级分公司和多级分支机构多达上百家 近年来 蓬勃的数字化应用对其广域网带来了巨大挑战 该公司采用Fort
  • ARGB,RGB颜色值表示

    转载请注明出处 http blog csdn net wei chong chong article details 50831493 今天自定义一个控件 设置背景颜色时犯难了 现在就来总结一下android中的颜色值表示 android
  • 9月,Java岗爆了!

    你有面试机会了吗 随着金九银十到来 肯定有很多小伙伴想抓住一年两次的机会 开始疯狂投简历了吧 但是事实是 投出去的简历基本上HR都是已读不回 收到面试邀请 被告知不用面试了 参加了面试 就像走了个过场 成了HR的业绩指标 面试通过 但是被放
  • LWIP在STM32上的移植

    本文做记录摘抄 加上自己的体会 文章标题 STM32使用LWIP实现DHCP客户端 http www cnblogs com dengxiaojun p 4379545 html 该文章介绍了几点 LWIP源码的内容 关键点 1 inclu
  • id选择器和class选择器

    id选择器 id选择器用来选取带有给定id属性的元素 语法 id例如 html div div css container color blue id选择器的一些特征 1 id选择器以 号开头 后跟元素的id属性值 2 id选择器只能选取带
  • 英伟达最新开源

    Title FasterViT Fast Vision Transformers with Hierarchical Attention Paper https arxiv org pdf 2306 06189 pdf Code https
  • 《Terraform 101 从入门到实践》 Functions函数

    Terraform 101 从入门到实践 这本小册在南瓜慢说官方网站和GitHub两个地方同步更新 书中的示例代码也是放在GitHub上 方便大家参考查看 Terraform的函数 Terraform为了让大家在表达式上可以更加灵活方便地进
  • 计算从指定日期开始的第几周的周几的日期

    项目场景 拿到的排课表数据 里面没有具体日期 而是第几周 周几的形式 需要转换成具体日期 问题描述 其中的周几是从周一开始的 从1 到7 转换时也是按这个顺序来 原因分析 先需要获取到学期开始的日期 例 date1 得出是周几 例 周3 是
  • Java实现动态数组

    Java中动态数组的实现是非常常见的数据结构 可以用来存储一组数据并动态调整数组的大小 本文将以 Java 语言为例 介绍如何实现一个简单的动态数组 其中包含基本操作如增加 删除 查询和遍历等 1 定义动态数组 在Java中 可以使用int
  • systemc verilog IEEE 注册登录下载

    https accellera org downloads standards systemrdl SystemRDL 2 0 SystemRDL Register Description Language 一次定义 多种HDL语言场合使用
  • 深入了解计算机端口(2)

    转载 url http www exam8 com computer spks ziliao ws 200504 10798 2 html url Virtualizing DNS DHCP Soft appliances for easy
  • Webstorm使用心得

    原文来自 http www jianshu com p 4ce97b360c13 Webstorm 大多数配置都在File gt Settings选项卡中进行的 也许你不得不第一个记住它的快捷键 Ctrl Alt S 1 设置开发工具主题
  • Edraw Max教程】如何有趣的创建梦幻般的思维导图

    Edraw Max 亿图图示 是一款综合图形图表制作软件 它包含丰富的实例和模版 帮助您轻松创建流程图 网络拓扑图 组织结构图 商业图表 工程图 思维导图 软件设计图和平面布局图等 亿图采用更智能和人性化的绘制方式 最大程度帮助设计者降低工
  • 九度OJ 1193:矩阵转置 (矩阵计算)

    时间限制 1 秒 内存限制 32 兆 特殊判题 否 提交 1673 解决 1132 题目描述 输入一个N N的矩阵 将其转置后输出 要求 不得使用任何数组 就地逆置 输入 输入的第一行包括一个整数N 1 lt N lt 100 代表矩阵的维
  • react umi实战

    umi umiJs是一个类Next JS的react开发框架 它基于一个约定 即pages目录下的文件即路由 而文件则导出react组件 然后打通从源码到产物的每个阶段 并配以完善的插件体系 让我们能把umi的产物部署到各个场景里面 初始化
  • Unity发布时出现“The type or namespace name `UnityEditor' could not be found.

    现象 using UnityEditor 就算包含了头文件 也会报错 原因 在非编辑器脚本中加入编辑器脚本时 修改方法 1 在Asset中创建Editor文件夹 并将有对Editor操作的脚本全放入到该文件夹中 再次运行之前出错的函数 问题
  • java中的自定义对象排序

    对于数组排序我们知道有Arrays sort 方法 但是如果遇到想要对一个对象数组中的某个属性进行排序 我们该如何去做呢 以给学生成绩排序为例 首先创建一个存储学生对象的数组 package JAVA API public class So
  • 容器数据持久化

    一 挂载方式 Docker提供三种方式将数据从宿主机挂载到容器中 volumes Docker管理宿主机文件系统的一部分 var lib docker volumes 保存数据的最佳方式 bind mounts 将宿主机上的任意位置的文件或
  • Python爬虫-MongoDB

    Python爬虫 MongoDB 文章目录 Python爬虫 MongoDB 前言 与MySQL对比 启动 关闭MongoDB 操作 数据库操作 集合操作 数据操作 增 删 改 查 保存 运算符 高级操作 聚合 常用管道 常用表达式 安全性