經(jīng)過了前面幾個小節(jié)的操作,現(xiàn)在我們手里已經(jīng)有了爬蟲.可以為我們爬取成堆的數(shù)據(jù)了,所以到了最后一步,是時候找個地方存放起來了,不然的話,數(shù)據(jù)就沒法分析,數(shù)據(jù)本身的價值也就沒了.而數(shù)據(jù)庫作為當今最主要的數(shù)據(jù)存儲工具,自然我們得了解一下.數(shù)據(jù)庫是一種按照數(shù)據(jù)結(jié)構(gòu)來組織、存儲和管理數(shù)據(jù)的倉庫.可以分成SQL數(shù)據(jù)庫和NOSQL數(shù)據(jù)庫.
關(guān)系型數(shù)據(jù)庫,現(xiàn)在熱門的有世界上最廣泛使用的Mysql還有后起之秀Postgresql以及其他數(shù)據(jù)庫等等.他們具備復(fù)雜查詢和事務(wù)的功能,可以用于復(fù)雜數(shù)據(jù)的存儲和需求安全性高的情況.對于爬蟲來說,與數(shù)據(jù)庫建立連接靠的是數(shù)據(jù)庫驅(qū)動庫,比如說golang的mysql-go,javascript的mysqljs,python的python-mysql等等.但關(guān)系型數(shù)據(jù)庫因為重心在安全和數(shù)據(jù)復(fù)雜性上,在應(yīng)對超大規(guī)模和高并發(fā)的SNS類型的web2.0純動態(tài)網(wǎng)站已經(jīng)顯得力不從心,暴露了很多難以克服的問題.
這時候,非關(guān)系型數(shù)據(jù)庫就應(yīng)運而生.他們通過非結(jié)構(gòu)化的存儲和基于多維關(guān)系模型在面對互聯(lián)網(wǎng)上非結(jié)構(gòu)化信息上有著明顯的優(yōu)勢.非關(guān)系型數(shù)據(jù)庫一般分為四種.鍵值(Key-Value)存儲數(shù)據(jù)庫(優(yōu)勢是簡單易部署,例如redis),列存儲數(shù)據(jù)庫(優(yōu)勢是應(yīng)對分布式存儲的海量數(shù)據(jù),例如Hbase),文檔型數(shù)據(jù)庫(查詢效率提升的鍵值數(shù)據(jù)庫升級版,例如Mongodb)和圖形數(shù)據(jù)庫(大多用來存儲關(guān)聯(lián)性數(shù)據(jù),例如Neo4J).我們可以通過需求合理選擇.同樣,爬蟲與非關(guān)系型數(shù)據(jù)庫也是通過數(shù)據(jù)庫驅(qū)動所連接的.比如golang的go-mgo,javascript的mongoose,python的mongo-python-driver等等。不過由于追求性能和可擴展性,所以在復(fù)雜數(shù)據(jù)上和安全性上會比關(guān)系型數(shù)據(jù)庫要差。
選擇好了對應(yīng)的驅(qū)動,我們開始insert數(shù)據(jù).你會發(fā)現(xiàn),每次我們insert一次都得向數(shù)據(jù)庫發(fā)送一個insert請求.一來二去的很費時間.所以這時候,我們就得用ORM來實現(xiàn)批量插入.ORM是一種程序技術(shù),用于實現(xiàn)面向?qū)ο缶幊陶Z言里不同類型系統(tǒng)的數(shù)據(jù)之間的轉(zhuǎn)換。從效果上說,它其實是創(chuàng)建了一個可在編程語言里使用的--“虛擬對象數(shù)據(jù)庫”.簡單來說,就是驅(qū)動有的功能ORM都有還更加方便,而ORM的有些功能驅(qū)動內(nèi)卻沒有提供.ORM框架有很多很多,可以自行查找.
最后來個總結(jié).如果你想要安全,可進行復(fù)雜SQL語句查詢同時對性能不是很敏感的話。請選擇關(guān)系型數(shù)據(jù)庫.如果你的數(shù)據(jù)沒有復(fù)雜的結(jié)構(gòu)而且需要極高的性能,或者你的數(shù)據(jù)多是非結(jié)構(gòu)化數(shù)據(jù)而且不需要復(fù)雜語句查詢的話,請選擇非關(guān)系型數(shù)據(jù)庫.那么,你想好存在哪里了么?