python爬虫环境准备之mongodb
简介
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。主要特点MongoDB的提供了一个面向文档存储,操作起来比较简单和容易。你可以在MongoDB记录中设置任何属性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。MongoDB安装简单。数据库关键名称admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。相关工具MongoDB提供了网络和系统监控工具Munin,它作为一个插件应用于MongoDB中。Gangila是MongoDB高性能的系统监视的工具,它作为一个插件应用于MongoDB中。Fang of Mongo – 网页式,由Django和jQuery所构成。Database Master — Windows的mongodb管理工具安装下载地址
www.mongodb.org/downloads下载brew
首先下载 brew官网中的mongodb规则,brew tap mongodb/brew 复制代码
下载成功时会有如下类似字眼:==> Tapping mongodb/brew Cloning into "/usr/local/Homebrew/Library/Taps/mongodb/homebrew-brew"... remote: Enumerating objects: 67, done. remote: Counting objects: 100% (67/67), done. remote: Compressing objects: 100% (64/64), done. remote: Total 570 (delta 23), reused 11 (delta 3), pack-reused 503 Receiving objects: 100% (570/570), 122.25 KiB | 149.00 KiB/s, done. Resolving deltas: 100% (261/261), done. Tapped 11 formulae (38 files, 195KB). 复制代码安装mongodb
在这里,我们安装mongodb的4.4版本,可使用如下命令安装:brew install mongodb-community@4.4 复制代码
安装成功后会有如下类似提示:==> Installing mongodb/brew/mongodb-community ==> Caveats To have launchd start mongodb/brew/mongodb-community now and restart at login: brew services start mongodb/brew/mongodb-community Or, if you don"t want/need a background service you can just run: mongod --config /usr/local/etc/mongod.conf ==> Summary /usr/local/Cellar/mongodb-community/4.4.3: 11 files, 156.8MB, built in 6 seconds ==> Caveats ==> mongodb-community To have launchd start mongodb/brew/mongodb-community now and restart at login: brew services start mongodb/brew/mongodb-community Or, if you don"t want/need a background service you can just run: mongod --config /usr/local/etc/mongod.conf 复制代码
根据提示可知道,后台运行mongodb的方式:brew services start mongodb/brew/mongodb-community 复制代码
停止后台服务: brew services stop mongodb-community 复制代码
前台运行的方式如下:mongod --config /usr/local/etc/mongod.conf 复制代码
查看运行中的mongodb:michaelkoo@MacBook work % ps -ef|grep mongodb 501 80402 1 0 12:38下午 ?? 0:02.62 /usr/local/opt/mongodb-community/bin/mongod --config /usr/local/etc/mongod.conf 501 80648 79888 0 12:47下午 ttys002 0:00.00 grep mongodb 复制代码
由以上可知道,已在运行中。几个关键文件说明
配置文件,/usr/local/etc/mongod.conf
日志目录:/usr/local/var/log/mongodb
数据目录:/usr/local/var/mongodb测试Mongodb自带的shell测试
可以直接在命令行下进入shell交互窗口michaelkoo@MacBook ~ % mongo MongoDB shell version v4.4.3 connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb Implicit session: session { "id" : UUID("52ab0789-d65c-49a8-9f4c-2358c7f4abc1") } MongoDB server version: 4.4.3 --- The server generated these startup warnings when booting: 2021-03-30T21:06:02.553+08:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted 2021-03-30T21:06:02.553+08:00: Soft rlimits too low 2021-03-30T21:06:02.553+08:00: currentValue: 256 2021-03-30T21:06:02.553+08:00: recommendedMinimum: 64000 --- --- Enable MongoDB"s free cloud-based monitoring service, which will then receive and display metrics about your deployment (disk utilization, CPU, operation statistics, etc). The monitoring data will be available on a MongoDB website with a unique URL accessible to you and anyone you share the URL with. MongoDB may use this information to make product improvements and to suggest MongoDB products and deployment options to you. To enable free monitoring, run the following command: db.enableFreeMonitoring() To permanently disable this reminder, run the following command: db.disableFreeMonitoring() --- 复制代码常见的shell命令db.hostInfo(),查看当前数据库的主机信息 db.hostInfo() { "system" : { "currentTime" : ISODate("2021-04-01T02:25:51.925Z"), "hostname" : "MacBook.lan", "cpuAddrSize" : 64, "memSizeMB" : NumberLong(16384), "memLimitMB" : NumberLong(16384), "numCores" : 8, "cpuArch" : "x86_64", "numaEnabled" : false }, ... ... "extra" : { "versionString" : "Darwin Kernel Version 19.6.0: Mon Aug 31 22:12:52 PDT 2020; root:xnu-6153.141.2~1/RELEASE_X86_64", "alwaysFullSync" : 0, "nfsAsync" : 0, "model" : "MacBookPro15,2", "physicalCores" : 4, "cpuFrequencyMHz" : 2400, "cpuString" : "Intel(R) Core(TM) i5-8279U CPU @ 2.40GHz", "cpuFeatures" : "FPU VME DE PSE TSC MSR PAE MCE CX8 APIC SEP MTRR PGE MCA CMOV PAT PSE36 CLFSH DS ACPI MMX FXSR SSE SSE2 SS HTT TM PBE SSE3 PCLMULQDQ DTES64 MON DSCPL VMX EST TM2 SSSE3 FMA CX16 TPR PDCM SSE4.1 SSE4.2 x2APIC MOVBE POPCNT AES PCID XSAVE OSXSAVE SEGLIM64 TSCTMR AVX1.0 RDRAND F16C SYSCALL XD 1GBPAGE EM64T LAHF LZCNT PREFETCHW RDTSCP TSCI", "pageSize" : 4096, "scheduler" : "dualq" }, "ok" : 1 复制代码db.stats(),查看数据库当前状态> db.stats() { "db" : "kk", "collections" : 2, "views" : 0, "objects" : 3, "avgObjSize" : 63, "dataSize" : 189, "storageSize" : 57344, "indexes" : 2, "indexSize" : 53248, "totalSize" : 110592, "scaleFactor" : 1, "fsUsedSize" : 167403245568, "fsTotalSize" : 250685575168, "ok" : 1 } 复制代码db.getLastError(),查看最近的一个错误,如果没有则返回null> db.getLastError() null 复制代码db,查询当前数据库,示例如下> db test 复制代码show dbs,查看所有数据库,示例如下> show dbs admin 0.000GB config 0.000GB kk 0.000GB local 0.000GB test 0.000GB 复制代码use xx,xx是某个库,切换到xx库,> use kk switched to db kk 复制代码show tables,查询当前文档的所有集合> show tables col kcol 复制代码db.collection.count(),查询collection的数据量> db.col.count() 2 > db.col.find() { "_id" : ObjectId("60652d50000178f64d7b2490"), "a" : "aaa", "b" : "bbb", "c" : "ccccc", "d" : "dddd" } { "_id" : ObjectId("60652d66000178f64d7b2491"), "a" : "a444", "b" : "333", "c" : "222", "d" : "111" } 复制代码db.collection.stats(),查询集合的状态> db.col.stats() { "ns" : "kk.col", "size" : 136, "count" : 2, "avgObjSize" : 68, "storageSize" : 20480, "freeStorageSize" : 0, "capped" : false, ... ... "nindexes" : 1, "indexBuilds" : [ ], "totalIndexSize" : 20480, "totalSize" : 40960, "indexSizes" : { "_id_" : 20480 }, "scaleFactor" : 1, "ok" : 1 复制代码数据导出,mongoexportmongoexport --jsonArray -o mon.json -d kk -c col 复制代码
以json数组形式导出kk库的col集合的所有数据到mon.json文件中数据导入,mongoimportmongoimport --jsonArray --file mon.json -d kk -c kcol connected to: mongodb://localhost/ 2 document(s) imported successfully. 0 document(s) failed to import. 复制代码
以json数组的形式把mon.json里面的数据导入到kk库的 kcol集合中查询
查询中有一些特殊的操作符需要注意:
操作符
格式
样例
相等(=)
{:{}}
db.test.find({"visit":24})
大于(>)
{:{$gt:}}
db.test.find({"visit":{$gt:18}})
小于(<)
{:{$lt:}}
db.test.find({"visit":{$lt:16}})
大于等于(>=)
{:{$gte:}}
db.test.find({"visit":{$gte:18}})
小于等于(<=)
{:{$lte:}}
db.test.find({"visit":{$lte:18}})
不等于(!=)
{:{$ne:}}
db.test.find({"visit":{$ne:16}})
与
{key01:value01,key02:value02,..}
db.test.find({"visit":18,"date":"2021-02-14"})
或
{$or:[{key01:value01},{key02:value02}...]}
db.test.find($or,[{"visit":10008},{"pv":18000}])
概括下查询相关的操作符 1.常规的比较查询操作符$gt,大于 $lte,小于等于 $in,包含 $nin,不包含 $lt,小于 $gte,大于等于 $ne,不等于 $eq,等于 复制代码
2.常规的查询操作符$mod,取模 $regex,正则 $text,文本 $where,条件 $and, $nor, $not, $or 复制代码
3.元数据查询操作符$type,数据类型操作符 $exists,判断字段是否存在操作符 复制代码
4.聚合操作符$sum, $avg, $stdDevPop,$stdDevSamp,不解其意 $min, $max, $first,根据文档的排序获取第一个文档数据 $last,根据文档的排序获取最后一个文档数据 $push,在结果文档中插入值到一个数组中 $addToSet,在结果文档中插入值到一个数组中,但不创建副本 复制代码添加db.collection.insertOne({"key":"value"}) db.collection.insertMany([{"key01":"value01"},{"key02":"value 02"}) 复制代码
说明: 第一条命令,是往集合中添加一条数据;
第二条命令,是往集合中添加多条数据,insertMany的参数是数组形式;更新db.collection.updateOne({"x": 1}, {"$inc": {"x": 3}}) db.collection.updateMany({"x": 1}, {"$inc": {"x": 3}}) db.collection.replaceOne({"x": 1}, {"y": 1}) 复制代码
说明: 第一条命令,是把值为1的x更改为值加3,x=4
第二条命令,是把所有值为1的x更改为值加3,x=4
第三条命令,是把值为1的x更改y,改的是key,值不变
更新相关的操作符
名称
描述
$inc
自增操作符
min,min,min,max
最小操作符,最大操作符
$set
设置操作符
$unset
删除操作符,操作key及值
$rename
重命名操作符,修改key删除db.collection.deleteMany ({ "ac" : "d" }) db.collection.deleteMany ({ "ac" : {$regex:"a*"} }) db.collection.delete.One ({ "ac" : "b" }) db.collection.deleteMany ({}) 复制代码
说明: 第一个命令是删除ac值为d的数据
第二个命令是删除ac值为a开头的数据,这里使用了mongo 的关键词"$regex",意思后面的值是正则表达式
最后一个是删除collection下面的所有数据Mongo in python安装pymongo库pip install pymongo 复制代码
安装成功后:Collecting pymongo Using cached pymongo-3.11.3-cp37-cp37m-macosx_10_6_intel.whl (414 kB) Installing collected packages: pymongo Successfully installed pymongo-3.11.3 复制代码实例import pymongo import re import time def mongo_init(): c = pymongo.MongoClient("mongodb://127.0.0.1/27017") k_c = c["kk"] _create_data(k_c) _find_data(k_c) _update_data(k_c) _delete_data(k_c) pass def _create_data(k_c): """ 添加数据, 先查询是否存在,不存在才插入 :param k_c: :return: """ print("[*] insert data [*]") d = {"ab": "abc"} if k_c["kcol"].find(d).count() <= 0: r = k_c["kcol"].insert_one(d) print(r.inserted_id, r.acknowledged, d) ac = {"ac": "this is ac"} if k_c["kcol"].find(ac).count() <= 0: r = k_c["kcol"].insert(ac) print(f"insert ac :{r}") ad = {"ac": "this is ac two"} if k_c["kcol"].find(ad).count() <= 0: r = k_c["kcol"].insert(ad) print(f"insert ad :{r}") pass def _find_data(k_c): """ 查询数据,这里只列出最基本的查询操作,还有更多查询请参考官网 :param k_c: :return: """ print(" [*] find data [*]") cols = k_c["kcol"].find_one({"ac": re.compile("a")}) print(f"find one :{cols} ") cols = k_c["kcol"].find().sort("ac") # 无参数则表示查询全部 cols.next() for i in cols: print(f"find many:{i}") pass def _update_data(k_c): # 更新 print("[*] update [*]") k_c["kcol"].update_many({"ac": re.compile("a")}, {"$set": {"ac": "ad--update:" + str(time.time_ns())}}) k_c["kcol"].replace_one({"ab": "abc"}, {"ab_replace": "abc is replace"}) cols = k_c["kcol"].find({"ac": re.compile("a")}) for col in cols: print(col) pass def _delete_data(k_c): # 删除 print("[*] delete [*]") f = {"ac": re.compile("ad")} f_data = k_c["kcol"].find(f) for fd in f_data: print(f"before del:{fd}") k_c["kcol"].delete_many(f) cols = k_c["kcol"].find({"ac": re.compile("")}) for col in cols: print(col) pass 复制代码
运行结果如下:/Users/michaelkoo/work/env/csdn/code/ImgBianhua/venv/bin/python /Users/michaelkoo/work/env/csdn/code/ImgBianhua/main.py [*] insert data [*] 6064892a2243504a9c23cb8e True {"ab": "abc", "_id": ObjectId("6064892a2243504a9c23cb8e")} insert ac :6064892a2243504a9c23cb8f insert ad :6064892a2243504a9c23cb90 [*] find data [*] find one :{"_id": ObjectId("6064892a2243504a9c23cb8f"), "ac": "this is ac"} find many:{"_id": ObjectId("6064892a2243504a9c23cb8f"), "ac": "this is ac"} find many:{"_id": ObjectId("6064892a2243504a9c23cb90"), "ac": "this is ac two"} [*] update [*] {"_id": ObjectId("6064892a2243504a9c23cb8f"), "ac": "ad--update:1617201450462799000"} {"_id": ObjectId("6064892a2243504a9c23cb90"), "ac": "ad--update:1617201450462799000"} [*] delete [*] before del:{"_id": ObjectId("6064892a2243504a9c23cb8f"), "ac": "ad--update:1617201450462799000"} before del:{"_id": ObjectId("6064892a2243504a9c23cb90"), "ac": "ad--update:1617201450462799000"} Process finished with exit code 0
寄生虫寄生了之后是否可以控制寄主呢?谢谢邀请,如果是蛔虫的话,会让人消瘦,吃多少都不胖如果是小孩会影响身高的,因为营养都被蛔虫吸收了,曾经见过邻居家的孩子玩泥巴,然后蛔虫多了,开刀拿出来有成人拳头那么大,后面小孩调养
初中生买什么样的手机,学生手机可以吗?给孩子买什么样的手机,家长要有一个明确的目标。如果初中的孩子用手机是因为学校老师会在手机上布置作业,那家长就要根据特殊情况给孩子买手机了。手机可以是帮助孩子学习的辅助工具,也有可能
助听器能听到水声很大很吵,需要去调吗?数字助听器都是可以调试的,通过参数的微调来改变声音的频率增益等特性来改善用户的聆听体验。专业的验配师会根据个人的听力情况与聆听环境,并结合自身多年的丰富验配经验制定专业的方案,有针
现在是不是很多人打微信语音电话,不直接打电话了?分情况,紧急的事还是得打电话。万一对方那边信号不好呢我都快一年没直接打电话了呲牙你们呢?是的,现在确实有人只喜欢打微信语音电话,不喜欢直接打电话了。不过这种方式也有很多人反对。有时
每经热评丨数字人民币是人民币发展重要一环中南财经政法大学数字经济研究院执行院长教授盘和林随着数字经济不断发展,以比特币为代表的一大批数字货币出现在人们的视野中,这些由算法或私人主导的数字资产吸引了全球投资者关注,然而,相
GameFiDeFiNFT,区块链下一个出口在哪从当初看到区块链想当然的联想到比特币,到现在各行业的区块链全面开花,这一过程可谓是发生了翻天覆地的变化。特别是近期各种新事物的出现,让我们看到了更多新的形势。比如GameFiDeF
主动降噪,畅享音乐和运动体验,漫步者W280NB颈挂式运动耳机随着手机等移动设备追求更轻,更薄的小型化设计,都逐步取消传统的3。5音频接口,选择一款合适的蓝牙运动耳机,不管是运动和日常听音乐,听着优美动听的音乐,运动起来也更加的舒适,而且音质
小众冷门但是实用,双十一值得入手的4件数码好物马上又要双十一了,各大品牌都摩拳擦掌做好了促销的准备,各种主流品牌我就不多说了,今天给各位推荐4件小众冷门的实用数码好物,都有很好的优惠力度,而且都很好用哦!有源音箱虽然现在市面上
14nm叠加封装芯片,没有台积电代工,2家大陆企业或能胜任2020年,华为麒麟芯片9000成为台积电代工的最后一款手机芯片,之后很长时间没有替代方案。在国内至少有2家企业,可以为华为生产14nm芯片。目前,国内芯片领域最好的代工企业,依然
家里老人听力不好还有耳鸣能配助听器吗?原则上只要有残余听力都是可以配助听器的,如果单纯的中耳引起的听力下降,配戴助听器的效果是不错的,但是很多老人会随着年龄的增加逐渐变成混合性听力损失,建议去附近的助听器验配店咨询,千
怎样用荞麦面蒸馒头?荞麦富含蛋白质多种维生素和矿物质,营养价值很高,而且低脂低热量,有清血脂,清肠胃的功效,特别适合三高人群和正在瘦身的朋友。荞麦作为一款粗粮,保留了更多表面麸皮,富含膳食纤维,对于肠