爬虫环境准备之mongodb

爬虫环境准备之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管理工具

安装

下载地址

https://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
  • 数据导出,mongoexport
mongoexport --jsonArray -o mon.json -d kk -c col

以json数组形式导出kk库的col集合的所有数据到mon.json文件中

  • 数据导入,mongoimport
mongoimport --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集合中

查询

查询中有一些特殊的操作符需要注意:

操作符 格式 样例
相等(=) {<key>:{<value>}} db.test.find({'visit':24})
大于(>) {<key>:{$gt:<value>}} db.test.find({'visit':{$gt:18}})
小于(<) {<key>:{$lt:<value>}} db.test.find({'visit':{$lt:16}})
大于等于(>=) {<key>:{$gte:<value>}} db.test.find({'visit':{$gte:18}})
小于等于(<=) {<key>:{$lte:<value>}} db.test.find({'visit':{$lte:18}})
不等于(!=) {<key>:{$ne:<value>}} 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,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('\n[*]      find data       [*]')
    cols = k_c['kcol'].find_one({'ac': re.compile('a')})
    print(f'find one :{cols}\n')

    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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,183评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,850评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,766评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,854评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,871评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,457评论 1 311
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,999评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,914评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,465评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,543评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,675评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,354评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,029评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,514评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,616评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,091评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,685评论 2 360

推荐阅读更多精彩内容