用python寫網(wǎng)絡(luò)爬蟲三:數(shù)據(jù)庫緩存

數(shù)據(jù)庫緩存:

為 了避免磁盤緩存方案的 己知限制村视,下面我們會在現(xiàn)有數(shù)據(jù)庫系統(tǒng)之上創(chuàng)建緩存 吉挣。 爬取時稍味, 我們可能需要緩存大量數(shù)據(jù)井濒, 但又無須任何復(fù)雜的連接操作灶似, 因此我們將選用 NoSQL 數(shù)據(jù)庫, 這種數(shù)據(jù)庫 比傳統(tǒng)的關(guān)系型數(shù)據(jù)庫更易于擴展瑞你。在本節(jié)中 酪惭, 我們將會選用 目 前非常流行的 MongoDB 作為緩存數(shù)據(jù)庫。

NoSql是什么

NoSQL 全稱為 Not Only SQL者甲, 是一種相對較新的數(shù)據(jù)庫設(shè)計方式春感。 傳統(tǒng)
的關(guān)系模型使用 的是固定模式, 并將數(shù)據(jù)分割到各個表中 虏缸。 然而鲫懒, 對于大數(shù)
據(jù)集的情況, 數(shù)據(jù)量太大使其難 以存放在單一服務(wù)器中 刽辙, 此時就需要擴展到
多 臺服務(wù)器窥岩。 不過, 關(guān)系模型對于這種擴展的支持并不夠好宰缤, 因為在查詢多
個表時颂翼, 數(shù)據(jù)可能在不同的服務(wù)器中 。 相反慨灭, NoSQL 數(shù)據(jù)庫通常是無模式的朦乏,
從設(shè)計之初就考慮了跨服務(wù)器無縫分片 的 問題。 在 NoSQL 中 氧骤, 有多種方式可
以實現(xiàn)該 目 標(biāo)呻疹, 分別是列數(shù)據(jù)存儲 ( 如 HBase)、 鍵值對存儲 (如 Redis)语淘、 面
向文檔的數(shù)據(jù)庫 ( 如 MongoDB) 以及圖形數(shù)據(jù)庫 ( 如 Neo4j ) 诲宇。

windows安裝MongoDB:

下載之后一直點擊下一步安裝完成际歼,
配置環(huán)境變量 我的電腦-屬性-高級系統(tǒng)設(shè)置-環(huán)境變量-path路徑下添加mogodb路徑(D:\mongdb\bin)注意路徑與之前的需要用;分號間隔
在mongodb路徑下建立data文件夾
在cmd中輸入mongod --dbpath D:\mongdb\data 啟動
重開一個cmd然后輸入mongo 看是否鏈接成功
或者在瀏覽器輸入http://localhost:27017/ (27017是默認(rèn)端口)顯示如下則啟動成功

返回結(jié)果顯示.jpg

安裝pymongo python封裝庫
pip install pymongo
在python中使用MongoDB的默認(rèn)端口鏈接MongoDB

from pymongo import MongoClient
client = MongoClient('localhost', 27017)

存取緩存數(shù)據(jù):

from pymongo import MongoClient
client = MongoClient('localhost', 27017)

url = 'http://example.webscraping.com/view/united-kingdom-239'
html = 'f'
db = client.cache
db.webpage.insert({'url': url, 'html': html})
print db.webpage.find_one({'url': url})

db.webpage.insert({'url': url, 'html': html})
print db.webpage.find({'url': url}).count()

如果是想更新內(nèi)容則使用update將上面更改一下

new_html = '<html></html>'
db.webpage.update({'_id': url},{'$set':{'html' : new_html}}, upsert = True)
print db.webpage.find_one({'_id': url})

使用MongoDB實現(xiàn)緩存

from datetime import datetime, timedelta
from pymongo import MongoClient
from link_crawler import link_crawler

class MongoCache:
    def __init__(self, client=None, expires=timedelta(days=30)):
        self.client = MongoClient('localhost', 27017)
        self.db = self.client.cache
        self.db.webpage.create_index('timestamp', expireAfterSeconds=expires.total_seconds())

    def __getitem__(self, url):
        record = self.db.webpage.find_one({'_id': url})
        if record:
            return record['result']
        else:
            raise KeyError(url + 'does not exist')

    def __setitem__(self, url, result):
        record = {'result': result, 'timestamp': datetime.utcnow()}
        self.db.webpage.update({'_id': url}, {'$set': record}, upsert=True)

if __name__ == '__main__':
    link_crawler('http://example.webscraping.com/', '/(index|view)', cache=MongoCache())

總結(jié):

緩存己下載的網(wǎng)頁可以節(jié)省時間 , 并能最小化重新爬取網(wǎng)站所耗費的帶寬 姑蓝。 緩存的主要缺點是會占用磁盤空間 鹅心, 不過我們可 以使用壓縮的方式減少空間 占用 。 此外纺荧, 在類似 MongoDB 等現(xiàn)有數(shù)據(jù)庫的基礎(chǔ)之上創(chuàng)建緩存旭愧, 可以避免文件系統(tǒng)的各種限制。
學(xué)習(xí)《用Python寫網(wǎng)絡(luò)爬蟲》
相關(guān)源碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宙暇,一起剝皮案震驚了整個濱河市输枯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌占贫,老刑警劉巖桃熄,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異型奥,居然都是意外死亡瞳收,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門厢汹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來螟深,“玉大人,你說我怎么就攤上這事烫葬〗缁。” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵搭综,是天一觀的道長垢箕。 經(jīng)常有香客問我,道長设凹,這世上最難降的妖魔是什么舰讹? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮闪朱,結(jié)果婚禮上月匣,老公的妹妹穿的比我還像新娘。我一直安慰自己奋姿,他們只是感情好锄开,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著称诗,像睡著了一般萍悴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天癣诱,我揣著相機與錄音计维,去河邊找鬼。 笑死撕予,一個胖子當(dāng)著我的面吹牛鲫惶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播实抡,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼欠母,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吆寨?” 一聲冷哼從身側(cè)響起赏淌,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎啄清,沒想到半個月后六水,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡辣卒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年缩擂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片添寺。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖懈费,靈堂內(nèi)的尸體忽然破棺而出计露,到底是詐尸還是另有隱情,我是刑警寧澤憎乙,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布票罐,位于F島的核電站,受9級特大地震影響泞边,放射性物質(zhì)發(fā)生泄漏该押。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一阵谚、第九天 我趴在偏房一處隱蔽的房頂上張望蚕礼。 院中可真熱鬧,春花似錦梢什、人聲如沸奠蹬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽囤躁。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間狸演,已是汗流浹背言蛇。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宵距,地道東北人腊尚。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像消玄,于是被迫代替她去往敵國和親跟伏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容