最近因?yàn)樵趯W(xué)網(wǎng)頁(yè)爬蟲(chóng),然后爬取下來(lái)的數(shù)據(jù)需要用數(shù)據(jù)庫(kù)來(lái)保存,這里我選擇了使用Mongodb,使用他的主要愿意就是因?yàn)椴僮鞣奖恪?/p>
首先是建立數(shù)據(jù)庫(kù):
import pymongo
client = pymongo.MongoClient('local',27018) #建立連接
ceshi= client['ceshi'] #創(chuàng)建集合
url_list= ceshi['url_list4']#創(chuàng)建一個(gè)叫url_list4的表單
//如果你是帶用戶名密碼的MONGO用戶,那么就需要下面的代碼
'''
uri = 'mongodb://'+user+":"+pwd+"@"+ip+":"+port
client=pymongo.MongoClient(uri)
'''
到這里,你就已經(jīng)成功創(chuàng)立了一個(gè)在ceshi集合下的名稱為url_list4表單,接著你就可以操作這個(gè)表單了。
返回?cái)?shù)據(jù)庫(kù)內(nèi)所有sheet名稱
client.database_names()
返回sheet內(nèi)所有集合名稱
metal.collection_names()
插入數(shù)據(jù)以字典形式傳入
url_list.insert_one({'url': url,'index': index})
插入之后又涉及到查詢,當(dāng)我們需要數(shù)據(jù)庫(kù)內(nèi)數(shù)據(jù)的時(shí)候就需要下面這個(gè)函數(shù):
這個(gè)函數(shù)將會(huì)返回url_list內(nèi)所有數(shù)據(jù),每個(gè)數(shù)據(jù)是字典格式,返回為一個(gè)列表,記住是列表
url_list.find()
----------------------------------------------------------------------------------------------
>>> collection.find().sort("age") //默認(rèn),升序
>>> collection.find().sort("age", pymongo.ASCENDING) //升序
>>> collection.find().sort("age", pymongo.DESCENDING) //降序
>>> collection.find().count() //等同于collection.count()
這個(gè)skip=0說(shuō)明會(huì)從rul_list里面的第一個(gè)數(shù)據(jù)開(kāi)始查找,limit=1則說(shuō)明只查找一個(gè),所以他只會(huì)返回第一個(gè)數(shù)據(jù),雖然只返回一個(gè)數(shù)據(jù),但是任然是列表格式,所以這里需要加一個(gè)[0],變成列表的一個(gè)值,也就是字典,如果limit不為零則不需要加后續(xù)標(biāo)號(hào)
url_list.find(skip=0, limit=1)
比如下面這個(gè)才是你真正想得到的第一個(gè)數(shù)據(jù)。
url_list.find(skip=0, limit=1)[0]
如果你不知道這個(gè)數(shù)據(jù)是第幾個(gè),但是知道其中的某一個(gè)值的數(shù)據(jù),那么可以這么使用:
下面這個(gè)函數(shù)會(huì)返回url_list下name為1的字典
url_list.find({"name":1})
能查找數(shù)據(jù)之后接下來(lái)還有一個(gè)更新數(shù)據(jù):
這函數(shù)會(huì)更新url_list內(nèi)name為joe的元素中的age的值變成2
url_list.update({'name': joe}, {"$set": {"age": 2}})
還要注意的一點(diǎn)是,.replace_one()需要傳入兩個(gè)參數(shù),分別為當(dāng)前document和要更新為的 document ,與 .update() 相同(update和save的區(qū)別暫且略過(guò),有興趣可以搜索引擎一下):
collection.replace_one(old_document, new_document)
刪除整個(gè)集合,是drop_collection()的別名
collection.drop()
![Uploading G1QVPE1VU1XTP_6JXVRGZM5_981334.png . . .]
插播,今天MONGODB被黑了,數(shù)據(jù)庫(kù)內(nèi)容全被刪除,黑客留下了這組內(nèi)容
大致意思就是我的數(shù)據(jù)庫(kù)數(shù)據(jù)備份在他的數(shù)據(jù)庫(kù)中,讓我匯他0.1比特幣給我數(shù)據(jù)恢復(fù),然后下面就是他的比特幣賬戶和郵箱。
好在我臺(tái)式電腦有腳本每天開(kāi)機(jī)會(huì)自動(dòng)備份服務(wù)器里的數(shù)據(jù),所以并沒(méi)有造成什么損失。但是經(jīng)過(guò)這件事,還是覺(jué)得給數(shù)據(jù)庫(kù)加上用戶名和密碼還是有必要的,雖然我的數(shù)據(jù)庫(kù)也只是保存自己的一些小數(shù)據(jù),并沒(méi)有什么太大商業(yè)價(jià)值。
以下內(nèi)容轉(zhuǎn)自:
http://www.jb51.net/article/52485.htm
首先我們得進(jìn)入mongodb的交互界面,在lunux系統(tǒng)下輸入
mongo
然后你需要?jiǎng)?chuàng)建一個(gè)自己的賬戶,創(chuàng)建之前,先進(jìn)入admin用戶:
use admin //切換到admin數(shù)據(jù)庫(kù)
show collections; //展示用戶列表
db.system.users.find(); //用戶表數(shù)據(jù)
db.addUser('username','password'); //添加一個(gè)用戶
//到此你的用戶已經(jīng)建立成功可以直接進(jìn)入下一步
use admin //切換到admin數(shù)據(jù)庫(kù)
db.auth('username','password'); //在admin數(shù)據(jù)庫(kù)認(rèn)證成功
use username; //切換到username數(shù)據(jù)庫(kù)
show collections; //不會(huì)在提示沒(méi)有權(quán)限了
添加好用戶以后,你還需要給你的MONGO開(kāi)啟用戶權(quán)限認(rèn)證
nano /etc/mongodb.conf //將auth=true前面的注釋拿掉
/etc/init.d/mongodb restart //重啟生效
擴(kuò)展補(bǔ)充
use username
//進(jìn)入之前創(chuàng)建的管理員
db.addUser('usr','pwd',true); //為tank數(shù)據(jù)庫(kù)添加了一個(gè)只讀用戶
db.addUser('usr','pwd'); //為tank數(shù)據(jù)庫(kù)添加了一個(gè)讀寫(xiě)用戶
php客戶端連接
1, 推薦方法一
$mongo = new Mongo();
$db = $mongo->selectDB('tank'); //切換到tank數(shù)據(jù)庫(kù)
$db->authenticate("tank3", "test"); //認(rèn)證
$users= $db->selectCollection("users"); //選取users表
$cursor = $users->find(); //讀取數(shù)據(jù)
foreach ($cursor as $id => $value) {
echo "$id: "; print_r($value); echo "<br>";
}
這種方式比較好理解,根命令行下的操作過(guò)程差不多。
2,推薦方法二
$mongo = new Mongo("mongodb://tank3:test@127.0.0.1:27017/tank"); //認(rèn)證用戶,這里的數(shù)據(jù)庫(kù),只啟認(rèn)證作用
$db = $mongo->selectDB('tank'); //選取數(shù)據(jù)庫(kù)
$users= $db->selectCollection("users");
$cursor = $users->find();
foreach ($cursor as $id => $value) {
echo "$id: "; print_r($value); echo "<br>";
}
未完待續(xù)..