python爬虫—-环境准备之mongodb(爬虫为什么要用python)

简介

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 [email protected]
复制代码

安装成功后会有如下类似提示:

==> 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:

[email protected] 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交互窗口

[email protected] ~ % 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集合中

查询

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

操作符

格式

样例

相等(=)

{:{}}

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('\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

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注