Python爬蟲數據保存到MongoDB中


  MongoDB是一款由C++語言編寫的非關系型數據庫,是一個基於分布式文件存儲的開源數據庫系統,其內容存儲方式類似於JSON對象,它的字段值可以是其它文檔或數組,但其數據類型只能是String文本型。

  在使用之前我們要確保已經安裝好了MongoDB並啟動了該服務。此處主要用於Python數據的保存,我們要安裝Python的PyMongo庫,運行 ‘pip install pymongo’ 命令完成pymongo的安裝。進入python工作模式,可以通過pymongo.version 查看pymongo的版本信息。

  

  第一步,連接MongoDB

  我們通過PyMongo庫里的MongoClient。其中第一個參數 host 是mongodb的地址,第二個參數是端口 port (不傳參數的話默認是27017) 

client = pymongo.MongoClient(host='127.0.0.1',port=27017)

  另一種方法是直接傳遞MongoDB的連接字符串,以 mongodb 開頭。

client = pymongo.MongoClient('mongodb://127.0.0.1:27017/')

  第二步,選擇數據庫或集合

  在MongoDB中可以建立多個數據庫,其中每個數據庫又包含許多集合,類似於關系數據庫中的表。選擇數據庫有兩種方法,這兩種方法作用相同。

db = client.test    # test數據庫
db = client['test']

  選擇好數據庫后我們需要指定要操作的集合,與數據庫的選擇類似。

p = db.persons    # persons集合
p = db['persons']

  第三步,添加數據

person = {
    'id':'00001',
    'name':'Abc',
    'age':19
}
result = p.insert(person)
# 在PyMongo 3.x版本后,官方推薦使用insert_one(),該方法返回的不再是單純的_id值,我們需要執行result.inserted_id查看 _id 值
print(result)

  此處通過對象的 insert() 方法添加了一條數據,添加成功后返回的是數據插入過程中自動添加的 _id 屬性值,這個值是唯一的。另外我們還可以添加多條數據,它以列表的形式進行傳遞。

person = {
    'id':'00001',
    'name':'Abc',
    'age':19
}
person1 = {
    'id':'00002',
    'name':'Dfg',
    'age':20
}
result = p.insert([person,person1])
# 推薦使用 insert_many() 方法,之后使用 result.inserted_ids 查看插入數據的 _id 列表
print(result)

  第四步,查詢數據

  查詢數據我們可以使用 find_one() 或 find() 方法,其中 find_one() 得到的是單個數據結果,find() 返回的是一個生成器對象。

res = p.find_one({'name':'Abc'})  # 查詢 name 為 Abc 的人的信息,返回字典型的數據
print(res)

  find() 則用來查詢多條數據,返回 cursor 類型的生存器,我們要遍歷取得所有的數據結果。

res = p.find({'age':20})  # 查詢集合中age是20的數據
# res = p.find({'age':{'$gt':20}}) # 查詢集合中age大於20的數據
print(res) for r in res: print(r)

  另外,我們還可以通過正則匹配進行查詢。

res = p.find({'name':{'$regex':'^A.*'}})  # 查詢集合中name以A開頭的數據

 

  要統計查詢的結果一共有多少條數據,需要使用 count() 方法

count = p.find().count()  # 統計集合中所有數據條數

  排序則直接調用 sort() 方法,根據需求傳入升序降序標志即可

 res = p.find().sort('age',pymongo.ASCENDING)  # 將集合中的數據根據age進行排序,pymongo.ASCENDING表示升序,pymongo.DESCENDING表示降序

  當我們只需要取得幾個元素時,我們可以使用 skip() 方法偏移幾個位置,得到去掉偏移個數之后剩下的元素數據

res = p.find({'name':{'$regex':'^A.*'}}).skip(2) 
print([ r['name'] for r in res ])  # 打印name以A開頭的數據的名稱name,從第三個顯示

  第五步,更新數據

  更新數據我們使用 update() 方法實現,並指定更新的條件和需要更新的數據即可。

where = {'name':'Abc'}
res = p.find_one(where)
res['age'] = 25
result = p.update(where, res)  # 推薦使用 update_one() 或 update_many()
print(result)

  返回的是一個字典形式的數據,{'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True},其中 ok 表示執行成功,nModified 表示影響的數據條數。

  另外我們還可以使用 $set 操作符對數據進行更新。使用$set則只更新字典內存在的字段,其它字段則不更新,也不刪除。如果不用則會更新所有的數據,而其它存在的字段則會被刪除。

where = {'age':{'$gt':20}}
result = p.update_many(where,{'$inc':{'age':1}}) # 將集合中年齡大於20的第一條的數據年齡加1
print(result)
print(result.matched_count,result.modified_count) # 獲取匹配的數據條數,影響的數據條數

  第六步,刪除數據

  刪除數據可以調用 remove() 方法,需要指定刪除條件。

result = p.remove({'name':'Abc'})   # 刪除名稱為Abc的數據,推薦使用 delete_one() 和 delete_many(),執行后調用 result.delete_count,獲得刪除的數據條數

  返回的是一條字典型數據,{'ok':1,'n':1}

  另外,我們還可以對索引進行操作,比如 create_index() 創建單個索引,create_indexes()創建多個索引,drop_index()刪除索引等方法。

 

參考:靜覓博客   https://cuiqingcai.com/5584.html  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM