標籤:建立 版本 表格 iba any down 查詢 post 基礎知識
MongoDB的串連和資料存取
MongoDB是一種跨平台,面向文檔的NoSQL資料庫,提供高效能,高可用性並且易於擴充。
包含資料庫,集合,文檔等幾個重要概念。
我們在這裡不介紹MongoDB的特點和用法了,感興趣的可以查一下官方文檔。
在此重點介紹如何使用python串連MongoDB,並通過PyMongo操作MongoDB資料庫。
這裡預設MongoDB已經安裝好啦,安裝教程可以參考:
http://www.yiibai.com/mongodb/mongodb_environment.html
感謝易百教程~~~~~
安裝PyMongo
目前最新版本為3.5.1。請注意不要單獨安裝bson包了,否則會與PyMongo不相容。
使用MongoClient建立串連
使用PyMongo時,第一步是運行mongod執行個體建立一個MongoClient,代碼如下:
當然,在使用代碼測試之前,請務必保證MongoDB服務已經開啟,否則串連不上的~~~~
from pymongo import MongoClientclient=MongoClient()#這是設定串連預設主控件和連接埠,也可以明確指定主機和連接埠
from pymongo import MongoClient#client = MongoClient()client = MongoClient(‘localhost‘, 27017)#client = MongoClient(‘mongodb://localhost:27017/‘)#上面幾種方法都可以。
擷取資料庫
如果串連已經成功的話, 那麼我們就要開始訪問資料庫了:
第一種方法是用Client執行個體的屬性方法,也就是.DatabaseName的方式
假設我們的資料庫名稱為pyTest吧,看代碼:
db=client.pyTest
第二種方法就是使用字典方式,看代碼:
db=client[‘pyTest‘]
擷取集合
得到資料庫的串連後,我們就可以進一步擷取資料庫中額集合了,也就是collection,類似與SQL中的資料表,用於儲存資料。同樣有兩種方法,假設我們在pyTest資料庫中存在一個叫first的表格。
collection=db.first#collection=db[‘first‘]
值得注意的是,MongoDB中關於集合和資料庫的建立,是不同於傳統SQL資料庫的,他們是懶建立的,只有當出第一個文檔(資料)插入集合時,才會建立集合和資料庫。
文檔(data)
在MongoDB中,儲存的一個個資料就稱作文檔,是BSON格式的。用字典來表示文檔,例如一個表示部落格的文檔:
post = {"author": "xingzhui", "text": "My first blog post!", "tags": ["mongodb", "python", "pymongo"], "date": datetime.datetime.utcnow()}#可以看出文檔是字典格式的,key-value對組成的,如果一個key對應多個value,需要用[]將所有的value包圍起來。
插入文檔
要將文檔插入到集合中,可以使用insert_one()方法,這隻是插入一條;
如果想要插入多條文檔的話,那麼就要使用insert_many()方法了。
兩個方法的參數差不多。舉個栗子,假如上面我們的一起操作都順利的話。
#擷取pyTest資料中名為posts的集合,如果該集合不存在,那麼就建立他posts = db.posts#將post資料插入到posts裡面,並擷取插入的文檔的主鍵idpost_id = posts.insert_one(post).inserted_idprint ("post id is ", post_id)
#我們將上面的語句拆分一下result=db.posts.insert_one(post)print(result.inserted_id)
我們再講一個insert_many()的栗子:
>>> db.test.count()0>>> result = db.test.insert_many([{‘x‘: i} for i in range(2)])>>> result.inserted_ids[ObjectId(‘54f113fffba522406c9cc20e‘), ObjectId(‘54f113fffba522406c9cc20f‘)]>>> db.test.count()2
值得注意的是,如果文檔不包含_id欄位,會自動添加_id,並且_id的值在集合中必須是唯一的。
如果我們想要列出該資料庫中的所有集合,可以使用下面的代碼:
cur_collection=db.collection_names(False)print(cur_collection)
使用find_one()擷取單個文檔
MongoDB中執行的最簡單的查詢類型是find_one(),返回與查詢匹配的單個文檔,如果沒有擷取到匹配的文檔,返回None。只有當知道只有一個匹配的文檔,或者只對第一個匹配感興趣時,可以考慮使用find_one()方法。
下面舉個例子:
#擷取第一個文檔,結果就是之前插入的字典格式,並且多了一個_id。post_first=db.posts.find_one()print(post_first)
#擷取具有匹配的特定元素,比如author為xingzhui的文檔,作為指定的查詢條件。post_xingzhui=db.posts.find_one({‘author‘:‘xingzhui‘})print(post_xingzhui)
通過ObjectId查詢
有時候,我們也可以通過_id找到一個post,比較適用於我們自行指定_id的時候,舉個例子:
post = {"_id": 200, "author": "Suifeng", "text": "This is is my first post!", "tags": ["Docker", "Shell", "pymongo"], "date": datetime.datetime.utcnow()}post_id=db.posts.insert_one(post).inserted_idprint(post_id)post_user=db.posts.find_one({‘_id‘:post_id})print(‘By Post ID:‘,post_user[‘author‘])
#輸出結果200By Post ID: Suifeng
批量插入 insert_many()
為了適應更複雜的查詢,我們再向posts集合中再插入一些文檔。
出了插入單個文檔外,還可以插入多個文檔,使用insert_many()來執行。
通過一個命令,插入多個文檔。
舉個例子:
new_posts = [{"_id": 1000, "author": "Curry", "text": "Another post!", "tags": ["bulk", "insert"], "date": datetime.datetime(2017, 11, 12, 11, 14)}, {"_id": 1001,"author": "Maxsu", "title": "MongoDB is fun", "text": "and pretty easy too!", "date": datetime.datetime(2019, 11, 10, 10, 45)}]result=db.posts.insert_many(new_posts)print(‘Bulk Inserts Result is:‘,result.inserted_ids)
值得注意的是:
insert_many()的結果返回了兩個ObjectId執行個體,每個ID表示插入的一個文檔。
另外的是,我們在第二個post中把tag欄位替換成了title欄位,同樣可以插入到資料庫中。
MongoDB是無模式的,表示的就是這個意思。
查詢多個文檔
要查詢獲得超過單個文檔作為查詢的結果,可以使用find()方法,find()返回一個Cursor執行個體,它允許遍曆所有匹配的文檔。
for post in db.posts.find(): print(post)
同樣的我們可以將過濾參數傳遞給find方法,比如
for post in db.posts.find({‘author‘:‘xingzhui‘}): print(post)
計數統計
如果只想知道有多少文檔匹配查詢,可以執行count()方法操作,而不是一個完整的查詢。
可以得到一個集合中的所有文檔的計數:
print(db.posts.count())print(db.posts.find({"author": "xingzhui"}).count())
好了,至此我們已經將爬蟲中可能用到的所有基礎知識都介紹了一遍,後面我們就要開始爬蟲的實戰了。
我打算用一個月的時間,將靜態網頁、動態網頁、登陸驗證等不同類型的爬蟲方法做介紹,希望大家能有興趣。
一起進步!
爬蟲入門【8】Python串連MongoDB的用法簡介