




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、Python Crawler Development 極客學院 J互聯(lián)網(wǎng)+職業(yè)技能系列Python爬蟲開發(fā) 從入門到實戰(zhàn)(微課版)人民郵電出版社謝乾坤著第6章 Python與數(shù)據(jù)庫 使用爬蟲可以在短時間內(nèi)積累大量數(shù)據(jù)。在本書的前面章節(jié)中,數(shù)據(jù)是通過文本文件來存放的。這種方式存放少量數(shù)據(jù)沒有問題,但是一旦數(shù)據(jù)量太大,就會變得難以檢索,難以管理。因此,我們有必要學習使用數(shù)據(jù)庫來保存、管理和檢索數(shù)據(jù)。 本章將會講解MongoDB和Redis這兩個數(shù)據(jù)庫。其中MongoDB用來保存大量數(shù)據(jù),Redis用于作為緩存和隊列保存臨時數(shù)據(jù)。 通過這一章的學習,你將會掌握如下知識。(1)MongoDB與Redi
2、s的安裝。(2)MongoDB的增刪改查操作。(3)Redis的列表與集合的操作。6.1 MongoDB MongoDB是一款基于C+開發(fā)的開源文檔數(shù)據(jù)庫,數(shù)據(jù)在MongoDB中以Key-Value的形式存儲,就像是Python中的字典一樣。 使用MongoDB管理軟件RoboMongo,可以看到數(shù)據(jù)在MongoDB中的存儲方式如圖6-1所示。需要注意的是,RoboMongo已經(jīng)被Studio 3T所在的3T Software Labs收購,因此RoboMongo的后續(xù)版本改名為Robo 3T。Robo 3T與RoboMongo除了名字不一樣以外,其他地方都是一樣的。圖6-1 使用RoboMo
3、ngo查看MongoDB里面數(shù)據(jù)的存儲方式6.1.1 MongoDB的安裝1在Mac OS下安裝MongoDB(1)Mac OS系統(tǒng)下面有一個非常有名的包管理工具,即Homebrew。如果讀者的計算機上已經(jīng)有了,可以使用它安裝并啟動MongoDB。brew updatebrew install mongodb#啟動MongoDBmongod -config /usr/local/etc/mongod.conf(2)使用普通方式安裝。 如果讀者的Mas OS系統(tǒng)沒有安裝Home brew,或者讀者希望手動安裝MongoDB,那么在終端中輸入以下命令來下載、解壓MongoDB到/book/chap
4、ter_6/program/mongodb文件夾中。cd /book/chapter_6/programcurl -O /osx/mongodb-osx-x86_64-3.4.4.tgztar zxvf mongodb-osx-x86_64-3.4.4.tgzmkdir p mongodbcp R n mongodb-osx-x86_64-3.4.4/ mongodb 運行結(jié)果如圖6-2所示。 在/book/chapter_6/program/mongodb/bin文件夾下,可以看到圖6-3所示的各個文件。圖6-2 手動安裝MongoDB 圖6-3 MongoDB的文件 使用這種方式,Mong
5、oDB不會自動創(chuàng)建配置文件,因此需要進一步配置。在這個文件夾下面手動創(chuàng)建兩個文件夾“l(fā)og”和“data”。使用任何一個文本編輯器編寫如下內(nèi)容:systemLog: destination: file path: log/mongo.log logAppend: truestorage: dbPath: datanet: bindIp: 保存到/book/chapter_6/program/mongodb/bin/mongodb.conf,配置好以后,文件結(jié)構(gòu)如圖6-4所示。 圖6-4 添加配置文件以后的文件結(jié)構(gòu) 接下來的啟動方式就和使用Homebrew安裝的方式差不多了。在終端中,先進入存放
6、MongoDB的文件夾,再啟動MongoDB:cd book/chapter_6/program/mongodb/binmongod -config mongodb.conf 運行結(jié)果如圖6-5所示。 運行MongoDB以后,不會在終端打印任何Log。這是因為Log都已經(jīng)被寫到文件中了。因此控制臺上面就什么都沒有顯示。這是正?,F(xiàn)象。 圖6-5 運行MongoDB的結(jié)果2在Ubuntu下安裝MongoDB 首先添加MongoDB的源:sudo apt-key adv -keyserver hkp:/:80 -recv 0C49F3730359C711F9BA15703C
7、6echo deb arch=amd64,arm64 /apt/ubuntu xenial/mongodb-org/3.4 multiverse | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list 然后安裝MongoDB:sudo apt-get updatesudo apt-get install -y mongodb-org Ubuntu版的MongoDB自帶了一個配置文件,這個配置文件在/etc/mongod.conf中,所以可以使用下面的命令來啟動MongoDB:mongod -config /etc/mongod.conf3
8、在Windows下安裝MongoDB 首先從MongoDB官網(wǎng)下載Windows版本的MongoDB,如圖6-6所示。圖6-6 從MongoDB官網(wǎng)下載Windows版MongoDB 接下來需要雙擊下載的文件,若無特殊說明,只需要單擊“Next”按鈕即可。在安裝過程中,將會看到圖6-7所示的選擇安裝方式界面。 單擊“Custom”按鈕,將文件的安裝路徑修改為C:Program FilesMongoDB,如圖6-8所示。 圖6-7 選擇安裝方式 圖6-8 修改文件安裝路徑 單擊“Next”按鈕進行安裝。安裝完成以后,進入C:Program FilesMongoDBbin,可以看到圖6-9所示的內(nèi)
9、容。圖6-9 Windows版MongoDB安裝完成以后生成的文件 創(chuàng)建存放數(shù)據(jù)的文件夾C:MongoDBData和存放日志的文件夾C:MongoDBLog。最后使用記事本創(chuàng)建配置文件,配置文件的內(nèi)容如下:systemLog: destination: file path: Logmongo.log logAppend: truestorage: dbPath: Datanet: bindIp: 將配置文件放在C:MongoDBmongod.conf,此時,C:MongoDB的內(nèi)容如圖6-10所示。圖6-10 創(chuàng)建了文件夾和配置文件以后的MongoDB文件夾 在C:MongoDB的安裝文件夾中
10、,按住Shift鍵并單擊鼠標右鍵,選擇“在此處打開命令窗口”,然后輸入以下代碼來啟動MongoDB:mongod.exe -config mongod.conf 如同另外兩個系統(tǒng)一樣,運行以后雖然不會有內(nèi)容在CMD中打印出來(如圖6-11所示),但是MongoDB已經(jīng)正常啟動了。圖6-11 MongoDB在Windows中運行也不會打印任何信息4圖形化管理工具RoboMongo RoboMongo是一個跨平臺的MongoDB管理工具,可以在圖形界面中查詢或者修改MongoDB。 下載并安裝,打開以后可以看到圖6-12所示的界面。 單擊“Create”鏈接,如果MongoDB就在本地計算機上面運
11、行,那只需要在“Name”這一欄填寫一個名字即可,其他地方不需要修改,直接單擊“Save”按鈕即可,如圖6-13所示。圖6-12 初次運行RoboMongo的界面圖6-13 如果數(shù)據(jù)庫就在本地計算機,只需要在Name一欄隨便取個名字即可 回到圖6-12所示的界面,單擊“Connect”按鈕就可以連接MongoDB了。 數(shù)據(jù)在MongoDB中的存儲格式如圖6-14所示。圖6-14 數(shù)據(jù)在MongoDB中的存儲格式 數(shù)據(jù)在MongoDB中是按照“庫(Database)”“集合(Collections)”“文檔(Document)”的層級關系來存儲的。如果使用Python的數(shù)據(jù)結(jié)構(gòu)來做類比的話,文檔
12、相當于一個字典,集合相當于一個包含了很多字典的列表,庫相當于一個大字典,大字典里面的每一個鍵值對都對應了一個集合,Key為集合的名字,Value就是一個集合。6.1.2 PyMongo的安裝與使用 PyMongo模塊是Python對MongoDB操作的接口包,能夠?qū)崿F(xiàn)對MongoDB的增刪改查及排序等操作。1PyMongo的安裝 直接使用pip安裝:pip install pymongo 安裝的結(jié)果如圖6-15所示。圖6-15 使用pip安裝PyMongo 直接使用pip安裝可能會遇到網(wǎng)絡問題導致安裝失敗,因此,對于Windows系統(tǒng)可以訪問/gohlke/pythonlibs/。 在這個網(wǎng)站
13、上找到PyMongo,并將whl包下載到本地,然后使用以下命令安裝:pip install 下載下來的whl文件名 安裝完成后,打開Python的交互環(huán)境,輸入以下代碼并按Enter鍵,如果不報錯,就表示安裝成功,如圖6-16所示。import pymongo圖6-16 導入PyMongo不報錯就表示安裝成功2PyMongo的使用(1)使用PyMongo初始化數(shù)據(jù)庫 要使用PyMongo操作MongoDB,首先需要初始化數(shù)據(jù)庫連接。如果MongoDB運行在本地計算機上,而且也沒有修改端口或者添加用戶名及密碼,那么初始化MongoClient的實例的時候就不需要帶參數(shù),直接寫為:from pym
14、ongo import MongoClientclient = MongoClient() 如果MongoDB是運行在其他服務器上面的,那么就需要使用“URI(Uniform Resource Identifier,統(tǒng)一資源標志符)”來指定連接地址。MongoDB URI的格式為:mongodb:/用戶名:密碼服務器IP或域名:端口 PyMongo初始化數(shù)據(jù)庫與集合有兩種方式。方式1:from pymongo import MongoClientclient = MongoClient()database= client.Chapter6collection = database.spider
15、 需要注意,使用方式1的時候,代碼中的“Chapter6”和“spider”都不是變量名,它們直接就是庫的名字和集合的名字。方式2:from pymongo import MongoClientclient = MongoClient()database = clientChapter6collection = db1spider 使用方式2時,在方括號中指定庫名和集合名。這種情況下,方括號里除了直接寫普通的字符串以外,還可以寫一個變量。 方式1和方式2是完全等價的。但是當需要批量操作數(shù)據(jù)庫的時候,方式2的優(yōu)越性就能體現(xiàn)出來。因為可以將多個數(shù)據(jù)庫的名字或者是多個集合的名字保存在列表中,然后使用
16、循環(huán)來進行操作:database_name_list = db1, db2, db3, db4for each_db in database_name_list: database = clienteach_db collection = db.test . 這樣就可以很方便地操作多個數(shù)據(jù)庫了。對于同一個數(shù)據(jù)庫里面的多個集合,也可以使用這個方法來操作。 默認情況下,MongoDB只允許本機訪問數(shù)據(jù)庫。這是因為MongoDB默認沒有訪問密碼,出于安全性的考慮,不允許外網(wǎng)訪問。 如果需要從外網(wǎng)訪問數(shù)據(jù)庫,那么需要修改安裝MongoDB時用到的配置文件mongod.conf。 使用任意文本編輯器打開
17、這個配置文件,就可以看到它的內(nèi)容,如圖6-17所示。圖6-17 MongoDB配置文件內(nèi)容(2)插入數(shù)據(jù) MongoDB的插入操作非常簡單。用到的方法為insert(參數(shù)),插入的參數(shù)就是Python的字典。插入一條數(shù)據(jù)的代碼如下。from pymongo import MongoClientclient = MongoClient()database = clientChapter6collection = db1spiderdata = id: 123, name: kingname, age: 20, salary: 999999collection.insert(data) 運行后,通
18、過RoboMongo可以看到數(shù)據(jù)庫中的數(shù)據(jù),如圖6-18所示。 圖6-18 插入一條數(shù)據(jù)以后的集合 MongoDB會自動添加一列“_id”,這一列里面的數(shù)據(jù)叫作ObjectId,ObjectId是在數(shù)據(jù)被插入MongoDB的瞬間,通過一定的算法計算出來的。因此,_id這一列就代表了數(shù)據(jù)插入的時間,它不重復,而且始終遞增。通過一定的算法,可以把ObjectId反向恢復為時間。 將多個字典放入列表中,并將列表作為insert()方法的參數(shù),即可實現(xiàn)批量插入數(shù)據(jù),代碼如下。more_data = id: 2, name: 張三, age: 10, salary: 0, id: 3, name: 李四
19、, age: 30, salary: -100, id: 4, name: 王五, age: 40, salary: 1000, id: 5, name: 外國人, age: 50, salary: 未知,collection.insert(more_data) 運行結(jié)果如圖6-19所示。 在爬蟲開發(fā)中,主要用MongoDB來存儲數(shù)據(jù)。所以爬蟲主要用到的MongoDB方法就是這個insert()方法。圖6-19 批量插入數(shù)據(jù)以后的集合(3)普通查找 MongoDB的查找功能對應的方法是:find(查詢條件, 返回字段)find_one(查詢條件,返回字段) 普通查詢方法有以下3種寫法。cont
20、ent = collection.find()content = collection.find(age: 29)content = collection.find(age: 29, _id: 0, name: 1, salary: 1) 假設當前MongoDB中的全部內(nèi)容如圖6-20所示。 在不寫find()方法的參數(shù)時,表示獲取指定集合中所有內(nèi)容的所有字段。運行結(jié)果如圖6-21所示,即調(diào)試模式窗口中content的內(nèi)容。圖6-20 當前數(shù)據(jù)庫spider集合下的內(nèi)容 從圖6-21可以看到,返回的數(shù)據(jù)有9條,也就是目前數(shù)據(jù)庫里面的所有內(nèi)容。 在find()中添加第1個參數(shù),只查詢所有年齡為2
21、9歲的人,代碼和運行結(jié)果如圖6-22所示,即調(diào)試模式中的content內(nèi)容。圖6-21 不寫find()參數(shù),返回所有數(shù)據(jù) 從圖6-22可以看到,返回的數(shù)據(jù)只有4條,也就是所有“age”為29的記錄。圖6-22 查詢所有年齡為29歲的人 通過find()的第2個參數(shù)可以限定需要返回哪些內(nèi)容,運行結(jié)果如圖6-23所示,即調(diào)試窗口中的content內(nèi)容。 從圖6-23可以看到,返回的數(shù)據(jù)只有4項,并且每項里面只有name和salary的內(nèi)容。圖6-23 限定只返回name和salary的內(nèi)容(4)邏輯查詢 PyMongo也支持大于、小于、大于等于、小于等于、等于、不等于這類邏輯查詢。 它們對應的關
22、鍵詞如表6-1所示。符號意義 $gt大于 $lt小于 $gte大于等于 $lte小于等于 $eq等于$ne不等于表6-1 PyMongo的邏輯查詢符號和意義 它們的用法為:collection.find(age: $gt: 29) #查詢所有age 29的記錄collection.find(age: $gte: 29, $lte: 40) #查詢29 age 40的記錄collection.find(salary: $ne: 29) #查詢所有salary不等于29的記錄 以查詢所有age大于等于29歲、小于等于40歲的記錄為例,運行結(jié)果如圖6-24所示。圖6-24 查詢所有29age40的記
23、錄(5)對查詢結(jié)果排序 MongoDB支持對查詢到的結(jié)果進行排序。排序的方法為sort()。它的格式為:handler.find().sort(列名, 1或-1) 查詢一般和find()配合在一起使用。例如:collection.find(age: $gte: 29, $lte: 40).sort(age, -1)collection.find(age: $gte: 29, $lte: 40).sort(age, 1) 首先查詢所有年齡大于等于29歲、小于等于40歲的記錄,然后按年齡來進行排序。 sort()方法接收兩個參數(shù):第1個參數(shù)指明需要以哪一項進行排序;第2個參數(shù)-1表示降序,1表示升
24、序。上面兩行代碼的運行結(jié)果分別如圖6-25、圖6-26所示。圖6-25 查詢29age40的記錄并對age降序排列圖6-26 查詢所有29age40的記錄并對age升序排列(6)更新記錄 更新可使用update_one()和update_many()方法。它們的格式為:collection.update_one(參數(shù)1, 參數(shù)2)collection.update_many(參數(shù)1, 參數(shù)2)(7)刪除記錄 刪除可使用delete_one()和delete_many()方法。它們的格式為:collection.delete_one(參數(shù))collection.delete_many(參數(shù))(8
25、)對查詢結(jié)果去重 去重使用distinct()方法,其格式為:collection.distinct(列名) 這個方法返回一個去重后的列表。在圖6-20中可以看到年齡這一列中有很多個29歲?,F(xiàn)在想查看一下有多少個不同的年齡,就可以使用distinct()方法。其運行結(jié)果如圖6-27所示,調(diào)試窗口中的變量content包含了去重以后的年齡信息。圖6-27 對年齡去重后的結(jié)果6.1.3 使用RoboMongo執(zhí)行MongoDB命令 通過PyMongo能執(zhí)行的絕大多數(shù)命令可以原樣照搬到RoboMongo中執(zhí)行,并且得到的結(jié)果比在Python中運行的結(jié)果更加直觀。 在RoboMongo中雙擊打開一個集
26、合,可以在圖6-28所示的方框框住的位置輸入MongoDB的相關命令。 例如要查詢所有年齡大于等于29歲、小于等于40歲的記錄,只需要修改find()方法的參數(shù)即可,如圖6-29所示。 圖6-28 在方框框住的位置輸入MongoDB的各種命令 圖6-29 在RoboMongo中查詢所有29age40的記錄 也可以使用distinct()函數(shù)來實現(xiàn)去重,如圖6-30所示。 排序功能也可以正常使用,如圖6-31所示。 圖6- 30 在RoboMongo中使用distinct()函數(shù)實現(xiàn)去重 圖6-31 在RoboMongo中對查詢的結(jié)果排序6.2 Redis 在開始介紹Redis之前,請讀者思考一
27、個問題:如何設計一個開關,實現(xiàn)在不結(jié)束程序進程的情況下,從全世界任何一個有網(wǎng)絡的地方既能隨時暫停程序,又能隨時恢復程序的運行。 最簡單的方法就是用數(shù)據(jù)庫來實現(xiàn)。在能被程序和控制者訪問的服務器中創(chuàng)建一個數(shù)據(jù)庫,數(shù)據(jù)庫名為“Switch_DB”。數(shù)據(jù)庫里面創(chuàng)建一個集合“Switch”,這個集合里面只有一個記錄,就是“Status”,它只有兩個值,“On”和“Off”,如圖6-32所示。圖6-32 創(chuàng)建數(shù)據(jù)庫并設置參數(shù) 程序每秒鐘就讀一次數(shù)據(jù)庫,發(fā)現(xiàn)Status為“Off”時就暫停運行,發(fā)現(xiàn)“Status”為“On”時就繼續(xù)運行。如果控制者想讓程序暫停運行,就去數(shù)據(jù)庫里面把“Status”修改為“O
28、ff”,反之如果想讓程序恢復運行,就去數(shù)據(jù)庫里面把“Status”修改為“On”。6.2.1 環(huán)境搭建1在Mac OS下安裝Redis 使用Homebrew安裝:brew updatebrew install redis#運行Redisredis-server /usr/local/etc/redis.conf2在Ubuntu下安裝Redis 在Ubuntu下安裝Redis,需要下載Redis的源代碼并進行編譯。wget http:/download.redis.io/releases/redis-3.2.1.tar.gztar xzf redis-3.2.1.tar.gzcd redis-3
29、.2.1make#運行解壓以后的文件夾下面的src文件夾中的redis-server文件啟動redis服務src/redis-server3在Windows下安裝Redis Redis沒有Windows的官方安裝包,但是有第三方的安裝包。從https:/ServiceStack/redis-windows/raw/master/downloads/ redis-latest.zip下載第三方Redis并解壓后,使用CMD進入解壓以后的文件夾并運行命令redis-server.exe redis.windows.conf啟動Redis。6.2.2 Redis交互環(huán)境的使用 與MongoDB不一樣
30、,要使用Redis的各種簡單功能,只需要使用Redis自帶的交互環(huán)境即可,沒有必要安裝一個第三方的客戶端。在安裝了Redis以后,先啟動Redis-Server,接著啟動Redis的交互環(huán)境。 對于使用Homebrew安裝Redis的Mac OS,進入Redis交互環(huán)境非常簡單,打開終端輸入redis-cli,并按Enter鍵即可。對于Ubuntu和Windows,需要先在終端或者CMD下進入Redis的安裝文件夾,然后在里面運行命令redis-cli來啟動Redis的交互環(huán)境。 在交互環(huán)境中,使用keys *可以查看當前有多少的“Key”,如圖6-33所示。圖6-33 在Redis交互環(huán)境中
31、查看當前的Key 在Redis中有多種不同的數(shù)據(jù)類型。不同的數(shù)據(jù)類型有不同的操作方法。在爬蟲開發(fā)的過程中主要會用到Redis的列表與集合,因此本小節(jié)講解這兩種數(shù)據(jù)類型不同的操作方式。(1)列表 Redis的列表是一個可讀可寫的雙向隊列,可以把數(shù)據(jù)從左側(cè)或者右側(cè)插入到列表中,也可以從左側(cè)或者右側(cè)讀出數(shù)據(jù),還可以查看列表的長度。從左側(cè)寫數(shù)據(jù)到列表中,使用的關鍵字為“l(fā)push”,這里的“l(fā)”為英文“l(fā)eft”(左)的首字母。使用方法為:lpush key value1 value2 value 3 如果想查看一個列表的長度,可使用關鍵字為“l(fā)len”。這個關鍵字的第1個“l(fā)”對應的是英文“l(fā)ist
32、”(列表)的首字母。其運行結(jié)果如圖6-34所示。 圖6-34 查看列表長度 如果不刪除列表中的數(shù)據(jù),又要把數(shù)據(jù)讀出來,就需要使用關鍵字“l(fā)range”,這里的“l(fā)”對應的是英文“l(fā)ist”的首字母?!眑range”的使用格式為:lrange key start end 其中,start為起始位置,end為結(jié)束位置。例如:lrange chapter_6 0 3 讀取chapter_6這個列表中下標從03的4個值,并顯示到屏幕上,如圖6-35所示。圖6-35 使用lrange讀取下標為0、1、2、3的4個數(shù)據(jù) 需要特別注意的是,在Python中,切片是左閉右開區(qū)間,例如,test0:3表示讀列表
33、的第0、1、2個共3個值。但是lrange的參數(shù)是一個閉區(qū)間,包括開始,也包括結(jié)束,因此在圖6-35中會包含下標為0、1、2、3的4個值。(2)集合 Redis的集合與Python的集合一樣,沒有順序,值不重復。往集合中添加數(shù)據(jù),使用的關鍵字為“sadd”。這里的“s”對應的是英文單詞“set”(集合)。使用格式為:sadd key value1 value2 value36.2.3 Redis-py1安裝Redis-py 使用pip安裝:pip install redis 安裝結(jié)果如圖6-38所示。 安裝完成以后,打開Python 交互環(huán)境,輸入以下代碼并按Enter鍵,如果沒有報錯,則表示
34、安裝成功。import redis2使用Redis-py 在Python中使用Redis-py,只需要簡單的兩步:連接Redis,操作Redis。圖6-38 使用pip安裝Redis-py6.3 MongoDB的優(yōu)化建議6.3.1 少讀少寫少更新 雖然MongoDB相比于MySQL來說,速度快了很多,但是頻繁讀寫MongoDB還是會嚴重拖慢程序的執(zhí)行速度。 以插入數(shù)據(jù)為例,對于相同的數(shù)據(jù),進行逐條插入和批量插入,速度差異非常顯著,其速度效率對比如圖6-39所示。圖6-39 逐條插入與批量插入速度效率對比 同樣是插入10000條數(shù)據(jù),逐條插入耗時約3.7s,批量插入耗時約0.2s。這個差距看起來
35、已經(jīng)很顯著了吧。這還只是在本地測試的數(shù)據(jù),如果使用遠程的MongoDB服務器且數(shù)據(jù)量足夠大,這個時間差甚至可以高達數(shù)小時。 建議把要插入到MongoDB中的數(shù)據(jù)先統(tǒng)一放到一個列表中,等積累到一定量再一次性插入。 對于讀數(shù)據(jù),在內(nèi)存允許的情況下,應該一次性把數(shù)據(jù)讀入內(nèi)存,盡量減少對MongoDB的讀取操作。 在某些情況下,更新操作不得不逐條進行,例如,對于圖6-40所示的一個集合“Data_bat”,需要將time這一列的值延后一天?!?017-07-10”變?yōu)椤?017-07-11”,“2017-07-09”變?yōu)椤?017-07-10”,以此類推。 如果使用常規(guī)操作,需要一條一條更新,如圖6-
36、41所示。 圖6-40 time這一列必須逐條更新 圖6-41 在Python中逐條更新數(shù)據(jù) 首先把所有數(shù)據(jù)讀入內(nèi)存,根據(jù)_id查找每一條記錄后再逐一更新。每一條數(shù)據(jù)都不一樣,似乎沒有辦法批量更新。 對于這種情況,是否有辦法優(yōu)化呢?答案當然是有,那就是不更新!這句話的意思是說,不要執(zhí)行“更新”這個動作。把更新這個動作改為插入。這樣就可以實現(xiàn)批量更新的效果了。具體來說,就是把數(shù)據(jù)批量插入到一個新的MongoDB集合中,再把原來的集合刪除,最后將新的集合改為原來集合的名字。 如圖6-42所示,把更新操作改為插入操作,耗時約為逐條更新的十分之一。圖6-42 把更新操作改為插入操作 為了提高效率,就需
37、要引入Redis。由于Redis是基于內(nèi)存的數(shù)據(jù)庫,因此即使頻繁對其讀/寫,對性能的影響也遠遠小于頻繁讀/寫MongoDB。在Redis中創(chuàng)建一個集合“crawled_url”,爬蟲在爬一個網(wǎng)址之前,先把這個網(wǎng)址sadd到這個集合中。如果返回為1,那么表示這個網(wǎng)址之前沒有爬過,爬蟲需要去爬取詳情頁。如果返回0,表示這個網(wǎng)址之前已經(jīng)爬過了,就不需要再爬了。示例代碼片段如下:6.3.2 能用Redis就不用MongoDBfor url in url_list: #url_list為在貼吧列表頁得到的每一個帖子的詳情頁網(wǎng)址列表 if client.sadd(crawled_url, url) = 1: crawl(url)6.4 階段
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 借款投資合作合同范本
- 公司廠房抵押合同范本
- ktv經(jīng)營合同范本
- 與商戶合同范本
- 親戚之間租車合同范本
- 勞動合同范本 日語
- 2024年重慶市榮昌區(qū)人民醫(yī)院招聘筆試真題
- 中國監(jiān)理合同范本
- 中山餐飲合同范本
- 2024年河源市紫金縣藍塘鎮(zhèn)招聘考試真題
- 2025年不停電電源(UPS)項目合作計劃書
- 2025年國家林業(yè)和草原局直屬事業(yè)單位第一批招聘應屆畢業(yè)生96人歷年高頻重點模擬試卷提升(共500題附帶答案詳解)
- 2025年春季開學典禮校長講話稿-少年無畏凌云志扶搖直上入云蒼
- 2025年湖南食品藥品職業(yè)學院高職單招職業(yè)適應性測試近5年??及鎱⒖碱}庫含答案解析
- 碳酸鈣脫硫劑項目可行性研究報告立項申請報告模板
- 山東省泰安市新泰市2024-2025學年(五四學制)九年級上學期1月期末道德與法治試題(含答案)
- 1《北京的春節(jié)》課后練習(含答案)
- (完整版)陸河客家請神書
- 2025年行業(yè)協(xié)會年度工作計劃
- DB3502T 160-2024 工業(yè)產(chǎn)品質(zhì)量技術(shù)幫扶和質(zhì)量安全監(jiān)管聯(lián)動工作規(guī)范
- 2025年學校教師政治理論學習計劃
評論
0/150
提交評論