爬蟲環(huán)境準備之mongodb

爬蟲環(huán)境準備之mongodb

簡介

MongoDB 是由C++語言編寫的萌庆,是一個基于分布式文件存儲的開源數(shù)據(jù)庫系統(tǒng)。
在高負載的情況下币旧,添加更多的節(jié)點践险,可以保證服務器性能。
MongoDB 旨在為WEB應用提供可擴展的高性能數(shù)據(jù)存儲解決方案吹菱。
MongoDB 將數(shù)據(jù)存儲為一個文檔巍虫,數(shù)據(jù)結構由鍵值(key=>value)對組成。MongoDB 文檔類似于 JSON 對象鳍刷。

主要特點

  • MongoDB的提供了一個面向文檔存儲占遥,操作起來比較簡單和容易。
  • 你可以在MongoDB記錄中設置任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來實現(xiàn)更快的排序输瓜。
  • 你可以通過本地或者網(wǎng)絡創(chuàng)建數(shù)據(jù)鏡像瓦胎,這使得MongoDB有更強的擴展性。
  • 如果負載的增加(需要更多的存儲空間和更強的處理能力) 尤揣,它可以分布在計算機網(wǎng)絡中的其他節(jié)點上這就是所謂的分片搔啊。
  • Mongo支持豐富的查詢表達式。查詢指令使用JSON形式的標記芹缔,可輕易查詢文檔中內(nèi)嵌的對象及數(shù)組坯癣。
  • MongoDb 使用update()命令可以實現(xiàn)替換完成的文檔(數(shù)據(jù))或者一些指定的數(shù)據(jù)字段 。
  • Mongodb中的Map/reduce主要是用來對數(shù)據(jù)進行批量處理和聚合操作最欠。
  • Map和Reduce示罗。Map函數(shù)調(diào)用emit(key,value)遍歷集合中所有的記錄,將key與value傳給Reduce函數(shù)進行處理芝硬。
  • Map函數(shù)和Reduce函數(shù)是使用Javascript編寫的蚜点,并可以通過db.runCommand或mapreduce命令來執(zhí)行MapReduce操作。
  • GridFS是MongoDB中的一個內(nèi)置功能拌阴,可以用于存放大量小文件绍绘。
  • MongoDB允許在服務端執(zhí)行腳本,可以用Javascript編寫某個函數(shù)迟赃,直接在服務端執(zhí)行陪拘,也可以把函數(shù)的定義存儲在服務端,下次直接調(diào)用即可纤壁。
  • MongoDB支持各種編程語言:RUBY左刽,PYTHON,JAVA酌媒,C++欠痴,PHP,C#等多種語言秒咨。
  • MongoDB安裝簡單喇辽。

數(shù)據(jù)庫關鍵名稱

  • admin: 從權限的角度來看,這是"root"數(shù)據(jù)庫雨席。要是將一個用戶添加到這個數(shù)據(jù)庫菩咨,這個用戶自動繼承所有數(shù)據(jù)庫的權限。一些特定的服務器端命令也只能從這個數(shù)據(jù)庫運行陡厘,比如列出所有的數(shù)據(jù)庫或者關閉服務器抽米。
  • local: 這個數(shù)據(jù)永遠不會被復制,可以用來存儲限于本地單臺服務器的任意集合
  • config: 當Mongo用于分片設置時雏亚,config數(shù)據(jù)庫在內(nèi)部使用缨硝,用于保存分片的相關信息。

相關工具

  • MongoDB提供了網(wǎng)絡和系統(tǒng)監(jiān)控工具Munin罢低,它作為一個插件應用于MongoDB中查辩。
  • Gangila是MongoDB高性能的系統(tǒng)監(jiān)視的工具,它作為一個插件應用于MongoDB中网持。
  • Fang of Mongo – 網(wǎng)頁式,由Django和jQuery所構成宜岛。
  • Database Master — Windows的mongodb管理工具

安裝

下載地址

https://www.mongodb.org/downloads

下載brew

首先下載 brew官網(wǎng)中的mongodb規(guī)則,

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

根據(jù)提示可知道,后臺運行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

數(shù)據(jù)目錄:/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(),查看當前數(shù)據(jù)庫的主機信息
 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()戴而,查看數(shù)據(jù)庫當前狀態(tài)
> 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悼院,查詢當前數(shù)據(jù)庫,示例如下
> db
test
  • show dbs,查看所有數(shù)據(jù)庫侠坎,示例如下
> 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的數(shù)據(jù)量
> 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()泄鹏,查詢集合的狀態(tài)
> 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
  • 數(shù)據(jù)導出,mongoexport
mongoexport --jsonArray -o mon.json -d kk -c col

以json數(shù)組形式導出kk庫的col集合的所有數(shù)據(jù)到mon.json文件中

  • 數(shù)據(jù)導入,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數(shù)組的形式把mon.json里面的數(shù)據(jù)導入到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.常規(guī)的比較查詢操作符

$gt,大于
$lte秧耗,小于等于
$in备籽,包含
$nin,不包含
$lt绣版,小于
$gte胶台,大于等于
$ne,不等于
$eq杂抽,等于

2.常規(guī)的查詢操作符

$mod,取模
$regex,正則
$text,文本
$where,條件
$and,
$nor,
$not,
$or

3.元數(shù)據(jù)查詢操作符

$type,數(shù)據(jù)類型操作符
$exists诈唬,判斷字段是否存在操作符

4.聚合操作符

$sum,
$avg,
$stdDevPop,$stdDevSamp,不解其意
$min,
$max,
$first,根據(jù)文檔的排序獲取第一個文檔數(shù)據(jù)
$last缩麸,根據(jù)文檔的排序獲取最后一個文檔數(shù)據(jù)
$push铸磅,在結果文檔中插入值到一個數(shù)組中
$addToSet,在結果文檔中插入值到一個數(shù)組中杭朱,但不創(chuàng)建副本

添加

db.collection.insertOne({'key':'value'})
db.collection.insertMany([{'key01':'value01'},{'key02':'value 02'})

說明:
第一條命令阅仔,是往集合中添加一條數(shù)據(jù);

第二條命令弧械,是往集合中添加多條數(shù)據(jù)八酒,insertMany的參數(shù)是數(shù)組形式;

更新

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的數(shù)據(jù)

第二個命令是刪除ac值為a開頭的數(shù)據(jù),這里使用了mongo 的關鍵詞“$regex”薇宠,意思后面的值是正則表達式

最后一個是刪除collection下面的所有數(shù)據(jù)

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):
    """
    添加數(shù)據(jù),
    先查詢是否存在偷办,不存在才插入
    :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):
    """
    查詢數(shù)據(jù),這里只列出最基本的查詢操作昼接,還有更多查詢請參考官網(wǎng)
    :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')  # 無參數(shù)則表示查詢?nèi)?    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

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末爽篷,一起剝皮案震驚了整個濱河市悴晰,隨后出現(xiàn)的幾起案子慢睡,更是在濱河造成了極大的恐慌,老刑警劉巖铡溪,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漂辐,死亡現(xiàn)場離奇詭異,居然都是意外死亡棕硫,警方通過查閱死者的電腦和手機髓涯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哈扮,“玉大人纬纪,你說我怎么就攤上這事』猓” “怎么了包各?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長靶庙。 經(jīng)常有香客問我问畅,道長,這世上最難降的妖魔是什么六荒? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任护姆,我火速辦了婚禮,結果婚禮上掏击,老公的妹妹穿的比我還像新娘卵皂。我一直安慰自己,他們只是感情好砚亭,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布灯变。 她就那樣靜靜地躺著,像睡著了一般钠惩。 火紅的嫁衣襯著肌膚如雪柒凉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天篓跛,我揣著相機與錄音膝捞,去河邊找鬼。 笑死,一個胖子當著我的面吹牛蔬咬,可吹牛的內(nèi)容都是我干的鲤遥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼林艘,長吁一口氣:“原來是場噩夢啊……” “哼盖奈!你這毒婦竟也來了?” 一聲冷哼從身側響起狐援,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤钢坦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后啥酱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爹凹,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年镶殷,在試婚紗的時候發(fā)現(xiàn)自己被綠了禾酱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡绘趋,死狀恐怖颤陶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陷遮,我是刑警寧澤滓走,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站拷呆,受9級特大地震影響闲坎,放射性物質發(fā)生泄漏。R本人自食惡果不足惜茬斧,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一腰懂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧项秉,春花似錦绣溜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至岁诉,卻和暖如春锚沸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涕癣。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工哗蜈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓距潘,卻偏偏與公主長得像炼列,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子音比,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容