1. 程式人生 > >【網絡爬蟲入門05】分布式文件存儲數據庫MongoDB的基本操作與爬蟲應用

【網絡爬蟲入門05】分布式文件存儲數據庫MongoDB的基本操作與爬蟲應用

數據庫的操作 理解 src web 文件存儲 學習 json格式 關系型 log

【網絡爬蟲入門05】分布式文件存儲數據庫MongoDB的基本操作與爬蟲應用

廣東職業技術學院 歐浩源

1、引言

網絡爬蟲往往需要將大量的數據存儲到數據庫中,常用的有MySQLMongoDBRedis等。對於爬取返回為JSON格式的數據,選擇NoSQL非關系型數據庫MongoDB來存儲會容易很多。在本文中,首先介紹MongoDB數據庫的安裝與啟動,然後講述該數據庫的基本操作,接著用Python語句操作該數據庫,最後將“豆瓣電影TOP250”爬蟲搜集的數據存到到該數據庫中,由淺入深,從理論到實踐,全面掌握MongoDB數據庫的基本應用。

2、什麽是MongoDB數據庫?

MongoDB

是一款由C++語言編寫,基於分布式文件存儲的NoSQL數據庫,具有免費、操作簡單、面向文檔存儲、自動分片、可擴展性高、查詢功能強大等特點,旨在為Web應用提供可擴展的高性能數據存儲解決方案。MongoDB將數據存儲為一個文檔,數據結構由鍵值對(key--value)組成。MongoDB的文檔類似於JSON對象,如果你不懂JSON對象的話,也可以理解為Python中的字典

3、MongoDB的下載與安裝

【1】進入官方網站:www.mongodb.com,進入download頁面,選擇“community sever”標簽,下載windows的msi版本。

技術分享

【2】雙擊下載後的安裝程序,選擇“Complete”安裝完整版本。這個過程非常簡單,除了“下一步”就是最後的“完成”。完成後,程序默認安裝在“C:\Program Files\MongoDB中”。

技術分享 技術分享

【3】在C盤創建兩個文件夾,分別為:"C:\MongoDBData\db"和"C:\MongoDBData\log",作為數據日誌的文件夾。db文件夾存放MongoDB的數據庫,log文件夾存放數據庫的操作記錄。在log文件夾中創建一個日誌文件mongodb.log。

技術分享

【4】創建MongoDB的數據庫文件。以管理員身份打開cmd控制臺,將當前路徑切換到MongoDB的安裝目錄的bin目錄,即“C:\Program Files\MongoDB\Server\3.4\bin”。在路徑下輸入“mongod.exe --dbpath c:\MongoDBData\db”。該命令將MongoDB的數據庫文件創建到已經建好的db文件夾中。如果創建成功,可以看到具體的信息。

技術分享

【5】MongoDB主要的啟動方式有兩種:以程序的方式打開和以Windows服務的方式打開。在實際使用中,用Windows服務的方式打開會比較方便。首先以管理員的身份運行cmd控制臺,並且把當前目錄切換到MongoDB安裝目錄的bin目錄,然後輸入:

mongod.exe --logpath "C:\MongoDBData\log\mongodb.log" --logappend --dbpath "c:\MongoDBData\db" --serviceName "MongoDB" --install
通過這個指令安裝Windows服務運行模式,其中“MongoDB”為服務器名稱。然後通過輸入“net start MongoDB”指令,啟動MongoDB。

技術分享

如果看到上述的信息,則表示MongoDB已經成功啟動了。如果你打開計算機管理系統的服務模塊,能清楚看到MongoDB已經啟動了。

技術分享

到這裏,關於MongoDB的下載、安裝、配置、啟動已經全部完成,接下來就可以自由的使用了。在下一次打開電腦的時候,並不需要再次輸入配置和啟動命令,直接進入MongoDB安裝目錄下的bin文件夾,雙擊“Mongo.exe”即可打開數據庫的交互窗口。

技術分享

為了測試MongoDB是否打開成功,可在提示符下輸入“show dbs”查看所有的數據庫。如果成功的話,你能看到以下的返回信息。

技術分享

5、MongoDB的基本操作

【1】查看當前數據庫名稱:db
【2】查看所有數據庫名稱:show dbs
【3】切換數據庫:use 數據庫名稱
如果數據不存在,則則指向數據庫,但不創建,直到插入數據或創建集合時,數據庫才被創建。默認的數據庫為test。如果你沒有創建新的數據庫,集合將存放在test數據庫中。
【4】刪除當前數據庫:db.dropDatabase()
刪除當前指向的數據庫,如果數據庫不存在,則什麽也不做。
【5】創建集合:db.createCollection(name ,option)
不限制集合大小,如:db.createCollection("student")
限制集合大小,如:db.createCollection("student",{capped:true,size:10})
【6】查看當前數據庫的集合:show collections
【7】刪除集合:db.集合名稱.drop()
例1:查看當前的數據庫,並切換到“spider01”數據,然後在該數據庫中創建集合“student”,最後查看當前數據庫中的集合。

技術分享

【8】插入數據:db.集合名稱.insert(document)
如:db.stu.insert({name:"Marry", age:21})
【9】保存數據:db.集合名稱.save(document)
【10】全文檔數據更新:
db.集合名稱.update(
<query>,
<update>,
{multi : <boolean>}
)
第1個參數:查詢條件,即要修改那些數據。
第2個參數:更新內容,即改為什麽數據。
第3個參數:可選,是否多行更新,默認為false,更新一行。
【11】指定屬性更新:
語法如上,通過操作符$set,指定更新的屬性。
【12】刪除數據:
db.集合名稱.update(
<query>,
{justone : <boolean>}
)
第1個參數:查詢條件,要刪除的數據。
第2個參數:默認為false,刪除多條數據。
【13】簡單查詢:db.集合名稱.find({條件文檔})
【14】返回第一個查詢結果:db.集合名稱.findOne({條件文檔})
【15】將結果格式化輸出:db.集合名稱.find({條件文檔}).pretty()
例2:向“student”集合中插入三條數據,通過簡單查詢顯示該集合的數據。

技術分享

例3:將“name”為“Peter”的文檔刪除,將name為“Marry”的“age”改為65,通過查詢,將查詢結果格式化輸出,最後將所有文檔刪除,在通過簡單查詢確認。

技術分享

【16】退出MongoDB數據庫:quit()

6、PyMongo庫的安裝與引入

按裝PyMongo庫就可以使用Python語言操作MongoDB數據庫了。其安裝方式非常簡單:
pip install pymongo
安裝完成後,從pymongo中引入MongoClient:
from pymongo import MongoClient
然後,就可以使用Python對MongoDB數據進行各種操作了。

7、PyMongo庫的基本操作

操作MongoDB數據庫之前,首先需要連接MongoDB客戶端,然後連接數據庫,如果該數據庫不存在,就會創建一個數據庫;接著選擇數據集合,如果該集合不存在,也會創建一個;然後才能進行數據操作。

例4:連接MongoDB客戶端,然後連接數據庫“spider01”,選擇數據集合"student"。

技術分享

【1】插入單條記錄:insert_one()
例5:向"student"集合中插入一條學生記錄。

技術分享

【2】插入多條記錄:insert_many()
在該方法中,要插入的記錄以列表的形式進行傳遞。
例6:向"student"集合中插入三條學生記錄。

技術分享

【3】查找單條記錄:find_one()
例7:查詢"student"集合中,age為28的記錄中的第一條。

技術分享

【4】查找多條記錄:find_many()
例8:查詢"student"集合中,age為28的所有記錄。

技術分享

【5】查詢所有記錄find()
例9:查詢"student"集合的所有記錄。

技術分享

【6】更新單條記錄:update_one()
例10:將"student"集合中,name為“李四”的記錄的“scorce”的值修改為66.6。

技術分享

【7】更新多條記錄:update_many()
例11:將"student"集合中,age為28的記錄的“scorce”的值修改為88.8。

技術分享

【8】刪除單條記錄:delete_one()
例12:將"student"集合中,name為"李四"的記錄刪除。

技術分享

【9】刪除多條記錄:delete_many()
例13:將"student"集合的所有記錄刪除。

技術分享

熟練掌握了數據庫的增、刪、查、改的基本操作之後,再去學習和提升就不會存在太大的障礙了。實際上使用pymongo庫來操作數據庫是非常簡單的,將來碰到更加復雜的需求,在網絡上查一下官方文檔或者技術博客,應該都能很快的順利解決。

7、MongoDB的爬蟲應用

【網絡爬蟲入門01】中,應用Requests和BeautifulSoup技術實現了從“豆瓣電影TOP250”中將電影名稱豆瓣評分相關鏈接爬取下來,並保存到文本文件中的網絡爬蟲。在這裏我們對其進行升級一下,把爬取下來的目標數據存儲到MongoDB數據庫中,其實現的思路很簡單:
<1> 引入pymogo庫。
<2>連接服務器和數據庫。
<3>選擇數據集合進行增、刪、查、改操作。
從實現代碼來看,把爬取到的數據存儲到數據庫只需要一行代碼。這個網絡爬蟲跟MongoDB數據庫相關的代碼,也就下面幾句:

技術分享

整個網絡爬蟲的實現代碼如下:

技術分享

到底爬蟲獲取的數據有沒有存儲到數據庫中指定的集合中呢?我們可以打開mongo.exe的交互終端進行查看。

技術分享

如果你覺得上面通過交互終端進行數據查詢很不方便,你也可以利用Python語句編寫代碼,查詢集合中“評分”為“9.5分”的記錄。其實現代碼也相當的簡潔:

技術分享

如果要將上述代碼放到爬蟲裏面,在程序將數據向數據庫存儲完畢之後,再讀出其中“評分”為“9.5分”的記錄作為驗證。整個代碼可以這樣實現:

技術分享

8、小結

在大數據處理時代中,MongoDB的地位將會非常突出,關鍵它學起來也不難,如果結合Python語句進行開發應用,其效率是非常高的。在網絡爬蟲的應用中,對於關聯度很低、結構很松散的數據,特別是一些JSON格式的數據,使用MongoDB來存儲數據那是再完美不過了。

9、附件:源碼

import requests
from bs4 import BeautifulSoup
from pymongo import MongoClient
db = client.spider01
collection = db.movie250
user_agent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;)"
headers = {"User-Agent":user_agent}
url = "https://movie.douban.com/top250?start="
for i in range(0,10):
    fullurl = url + str(i * 25)
    res = requests.get(fullurl, headers = headers)
    soup = BeautifulSoup(res.text, "lxml")
    mlist = soup.find_all(div, {class:info})
    for m in mlist:
        title = m.find(a).find(span).text
        score = m.find(div,class_=star).find(span,class_=rating_num).text + 
        link = m.find(a)[href]
        dat = {電影:title,評分:score,鏈接:link}
        collection.insert_one(dat)
print("====豆瓣電影TOP250數據爬取分析保存完畢====")
cursor = collection.find({評分:9.5分})
for doc in cursor:
    print(doc)
print("*** 廣東職業技術學院-歐浩源-2017年10月 ***")

【網絡爬蟲入門05】分布式文件存儲數據庫MongoDB的基本操作與爬蟲應用