《Python網(wǎng)絡(luò)爬蟲基礎(chǔ)教程》 課件-第11章 分布式網(wǎng)絡(luò)爬蟲Scrapy-Redis_第1頁(yè)
《Python網(wǎng)絡(luò)爬蟲基礎(chǔ)教程》 課件-第11章 分布式網(wǎng)絡(luò)爬蟲Scrapy-Redis_第2頁(yè)
《Python網(wǎng)絡(luò)爬蟲基礎(chǔ)教程》 課件-第11章 分布式網(wǎng)絡(luò)爬蟲Scrapy-Redis_第3頁(yè)
《Python網(wǎng)絡(luò)爬蟲基礎(chǔ)教程》 課件-第11章 分布式網(wǎng)絡(luò)爬蟲Scrapy-Redis_第4頁(yè)
《Python網(wǎng)絡(luò)爬蟲基礎(chǔ)教程》 課件-第11章 分布式網(wǎng)絡(luò)爬蟲Scrapy-Redis_第5頁(yè)
已閱讀5頁(yè),還剩69頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第11章分布式網(wǎng)絡(luò)爬蟲Scrapy-Redis《Python網(wǎng)絡(luò)爬蟲基礎(chǔ)教程》學(xué)習(xí)目標(biāo)/Target了解分布式網(wǎng)絡(luò)爬蟲,能夠說(shuō)出采用主從模式的分布式網(wǎng)絡(luò)爬蟲的特點(diǎn)熟悉Scrapy-Redis的架構(gòu),能夠歸納Scrapy-Redis架構(gòu)的原理熟悉Scrapy-Redis的運(yùn)作流程,能夠歸納Scrapy-Redis的運(yùn)作流程掌握開發(fā)Scrapy-Redis的準(zhǔn)備工作,能夠搭建Scrapy-Redis的開發(fā)環(huán)境掌握Scrapy-Redis的基本操作,能夠靈活應(yīng)用Scrapy-Redis開發(fā)分布式網(wǎng)絡(luò)爬蟲章節(jié)概述/Summary前面編寫的網(wǎng)絡(luò)爬蟲都運(yùn)行在單臺(tái)計(jì)算機(jī)上,由于受到計(jì)算機(jī)能力和網(wǎng)絡(luò)帶寬的限制,單臺(tái)計(jì)算機(jī)上運(yùn)行的網(wǎng)絡(luò)爬蟲在采集大量數(shù)據(jù)時(shí)需要花費(fèi)很長(zhǎng)的時(shí)間。分布式網(wǎng)絡(luò)爬蟲正好解決了這個(gè)問題,它可以在多臺(tái)計(jì)算機(jī)上同時(shí)運(yùn)行同一個(gè)網(wǎng)絡(luò)爬蟲程序,共同完成一個(gè)采集任務(wù)。在Python中,Scrapy框架本身并不支持分布式,為彌補(bǔ)該框架的不足,Scrapy-Redis為其拓展了分布式功能,兩者結(jié)合便可以實(shí)現(xiàn)分布式網(wǎng)絡(luò)爬蟲。本章將圍繞著分布式網(wǎng)絡(luò)爬蟲Scrapy-Redis的相關(guān)知識(shí)進(jìn)行詳細(xì)的講解。目錄/Contents11.111.211.3分布式網(wǎng)絡(luò)爬蟲簡(jiǎn)介Scrapy-Redis架構(gòu)Scrapy-Redis運(yùn)作流程目錄/Contents11.411.511.6Scrapy-Redis開發(fā)準(zhǔn)備Scrapy-Redis的基本操作實(shí)踐項(xiàng)目:使用RedisCrawlSpider采集暢購(gòu)商城的華為手表信息分布式爬蟲簡(jiǎn)介11.1了解分布式網(wǎng)絡(luò)爬蟲,能夠說(shuō)出采用主從模式的分布式網(wǎng)絡(luò)爬蟲的特點(diǎn)學(xué)習(xí)目標(biāo)11.1分布式網(wǎng)絡(luò)爬蟲簡(jiǎn)介Scrapy框架是一個(gè)通用的網(wǎng)絡(luò)爬蟲框架,應(yīng)用極其廣泛,但Scrapy框架本身并不支持分布式部署,也就是說(shuō)無(wú)法在多臺(tái)計(jì)算機(jī)中同時(shí)執(zhí)行網(wǎng)絡(luò)爬蟲程序,導(dǎo)致采集數(shù)據(jù)的效率受到限制。為了提升網(wǎng)絡(luò)爬蟲的采集效率,Scrapy-Redis在Scrapy的基礎(chǔ)上增加了一些以Redis數(shù)據(jù)庫(kù)為基礎(chǔ)的組件,通過(guò)這些組件可以讓Scrapy框架實(shí)現(xiàn)分布式網(wǎng)絡(luò)爬蟲的功能。11.1分布式網(wǎng)絡(luò)爬蟲簡(jiǎn)介分布式網(wǎng)絡(luò)爬蟲可以理解為集群爬蟲,每個(gè)網(wǎng)絡(luò)爬蟲會(huì)從互聯(lián)網(wǎng)上抓取網(wǎng)頁(yè)數(shù)據(jù),并將解析后提取的目標(biāo)數(shù)據(jù)保存到文件或數(shù)據(jù)庫(kù)中。分布式網(wǎng)絡(luò)爬蟲的設(shè)計(jì)重點(diǎn)在于多臺(tái)計(jì)算機(jī)中的網(wǎng)絡(luò)爬蟲如何進(jìn)行通信,按不同的通信方式可以分為3種模式,分別是主從模式、自治模式與混合模式。11.1分布式網(wǎng)絡(luò)爬蟲簡(jiǎn)介11.1分布式網(wǎng)絡(luò)爬蟲簡(jiǎn)介

主從模式主從模式指由一臺(tái)主機(jī)作為控制節(jié)點(diǎn),負(fù)責(zé)管理所有運(yùn)行網(wǎng)絡(luò)爬蟲的主機(jī),即爬蟲節(jié)點(diǎn),爬蟲節(jié)點(diǎn)只需要從控制節(jié)點(diǎn)處接收任務(wù),并把新生成的任務(wù)提交給控制節(jié)點(diǎn)即可,在整個(gè)運(yùn)行過(guò)程中不必與其他爬蟲節(jié)點(diǎn)進(jìn)行通信。Scrapy-Redis實(shí)現(xiàn)的分布式網(wǎng)絡(luò)爬蟲默認(rèn)采用了主從模式。11.1分布式網(wǎng)絡(luò)爬蟲簡(jiǎn)介

主從模式主從模式易于實(shí)現(xiàn)且利于管理,在這種模式下,控制節(jié)點(diǎn)會(huì)與所有爬蟲節(jié)點(diǎn)進(jìn)行通信。它通過(guò)一個(gè)地址列表保存系統(tǒng)中所有爬蟲節(jié)點(diǎn)的信息,一旦遇到系統(tǒng)中的網(wǎng)絡(luò)爬蟲數(shù)量發(fā)生變化,就會(huì)更新這個(gè)地址列表。這一過(guò)程對(duì)于系統(tǒng)中的爬蟲是透明的。不過(guò),隨著網(wǎng)絡(luò)爬蟲采集的網(wǎng)頁(yè)數(shù)量逐漸增加,控制節(jié)點(diǎn)會(huì)成為整個(gè)系統(tǒng)的瓶頸,導(dǎo)致整個(gè)分布式網(wǎng)絡(luò)爬蟲的系統(tǒng)性能下降。11.1分布式網(wǎng)絡(luò)爬蟲簡(jiǎn)介

自治模式自治模式是指沒有協(xié)調(diào)者,所有的爬蟲節(jié)點(diǎn)相互通信的模式,它的通信方式主要有兩種:全連接通信和環(huán)形通信,其中全連接通信是指所有的爬蟲節(jié)點(diǎn)間相互發(fā)送信息;環(huán)形通信是指爬蟲節(jié)點(diǎn)在邏輯上構(gòu)成一個(gè)環(huán)形,數(shù)據(jù)沿著環(huán)形按順時(shí)針或逆時(shí)針單向傳輸。11.1分布式網(wǎng)絡(luò)爬蟲簡(jiǎn)介

自治模式左圖是采用全連接通信方式的自治模式,右圖是采用環(huán)形通信方式的自治模式。采用全連接通信方式的每個(gè)爬蟲節(jié)點(diǎn)會(huì)維護(hù)一個(gè)地址列表,列表中存儲(chǔ)了系統(tǒng)所有爬蟲節(jié)點(diǎn)的位置。每次通信時(shí)可以直接將數(shù)據(jù)發(fā)送給需要此數(shù)據(jù)的爬蟲節(jié)點(diǎn)。采用環(huán)形通信方式的每個(gè)爬蟲節(jié)點(diǎn)只會(huì)保存前驅(qū)和后繼的信息,爬蟲節(jié)點(diǎn)在接收到數(shù)據(jù)之后會(huì)判斷數(shù)據(jù)是否是發(fā)送給自己的。如果數(shù)據(jù)不是發(fā)送給自己的,則爬蟲節(jié)點(diǎn)會(huì)把數(shù)據(jù)轉(zhuǎn)發(fā)給后繼爬蟲節(jié)點(diǎn),否則不再轉(zhuǎn)發(fā)數(shù)據(jù)。11.1分布式網(wǎng)絡(luò)爬蟲簡(jiǎn)介

混合模式混合模式是指結(jié)合上面兩種模式的特點(diǎn)生成的一種折中模式,該模式下的所有爬蟲節(jié)點(diǎn)都可以相互通信

,同時(shí)都具有任務(wù)分配的功能,只不過(guò)所有爬蟲節(jié)點(diǎn)中有一個(gè)特殊的爬蟲節(jié)點(diǎn),該爬蟲節(jié)點(diǎn)會(huì)對(duì)無(wú)法分配的任務(wù)進(jìn)行集中分配。11.1分布式網(wǎng)絡(luò)爬蟲簡(jiǎn)介

混合模式混合模式下的每個(gè)爬蟲節(jié)點(diǎn)只需要維護(hù)自己采集范圍的地址列表,而特殊爬蟲節(jié)點(diǎn)除了保存自己采集范圍的地址列表外,還需要保存需要進(jìn)行集中分配的地址列表。值得一提的是,Scrapy-Redis實(shí)現(xiàn)的分布式網(wǎng)絡(luò)爬蟲默認(rèn)采用了主從模式,即一臺(tái)作為控制節(jié)點(diǎn)的主機(jī)和若干臺(tái)作為爬蟲節(jié)點(diǎn)的主機(jī)。每個(gè)網(wǎng)絡(luò)爬蟲的功能相同,都是負(fù)責(zé)將服務(wù)器返回的Item數(shù)據(jù)和URL提交給控制節(jié)點(diǎn)的主機(jī)。控制節(jié)點(diǎn)會(huì)統(tǒng)一分配爬蟲節(jié)點(diǎn)提交的任務(wù),它在分配時(shí)并非是將某臺(tái)主機(jī)提交的任務(wù)分配給該主機(jī),而是發(fā)現(xiàn)哪臺(tái)主機(jī)處于空閑狀態(tài),便為該主機(jī)分配任務(wù)。Scrapy-Redis架構(gòu)11.2熟悉Scrapy-Redis的架構(gòu),能夠歸納Scrapy-Redis架構(gòu)的原理學(xué)習(xí)目標(biāo)11.2Scrapy-Redis架構(gòu)11.2Scrapy-Redis架構(gòu)Scrapy-Redis不是一個(gè)框架,而是一些組件。借用下面的一個(gè)例子區(qū)分Scrapy和Scrapy-Redis的關(guān)系:假如把Scrapy看作一個(gè)工廠,這個(gè)工廠主要負(fù)責(zé)根據(jù)用戶的需求生產(chǎn)網(wǎng)絡(luò)爬蟲,那么Scrapy-Redis便是其他廠商,它為了幫助工廠更好地完成生產(chǎn)任務(wù)制造了一些新設(shè)備,以替換Scrapy工廠的原有設(shè)備。11.2Scrapy-Redis架構(gòu)對(duì)比Scrapy的架構(gòu)可知,Scrapy-Redis在Scrapy架構(gòu)的基礎(chǔ)上增加了兩個(gè)組件,分別是Redis和ItemProcesses,其中Redis是一個(gè)Key-Value數(shù)據(jù)庫(kù),它負(fù)責(zé)存放由Scheduler傳遞的待抓取請(qǐng)求,如此每臺(tái)計(jì)算機(jī)上的爬蟲都會(huì)訪問同一個(gè)Redis數(shù)據(jù)庫(kù),通過(guò)這個(gè)數(shù)據(jù)庫(kù)實(shí)現(xiàn)對(duì)請(qǐng)求的調(diào)度和判重進(jìn)行統(tǒng)一管理;ItemProcesses組件表示Item集群。11.2Scrapy-Redis架構(gòu)根據(jù)Redis的特性,Scrapy-Redis在Scrapy原生組件的基礎(chǔ)上拓展了4個(gè)組件:Scheduler、ItemPipeline、Spiders和DuplicationFilter。

SchedulerScrapy框架對(duì)Python原有的雙向隊(duì)列進(jìn)行了改造,形成了自己的ScrapyQueue,但ScrapyQueue不能被多個(gè)Spiders共用,使得Scrapy框架不支持分布式采集。為此Scrapy-Redis將ScrapyQueue替換成了Redis數(shù)據(jù)庫(kù),由一個(gè)Redis數(shù)據(jù)庫(kù)統(tǒng)一存放待發(fā)送的請(qǐng)求,這樣可以讓多個(gè)Spiders從同一數(shù)據(jù)庫(kù)中讀取請(qǐng)求。在Scrapy框架中,與待發(fā)送請(qǐng)求直接相關(guān)的組件是調(diào)度器Scheduler,該組件負(fù)責(zé)將新的請(qǐng)求添加到隊(duì)列中,并從該隊(duì)列中取出下一個(gè)要發(fā)送的請(qǐng)求。Scrapy原有的Scheduler已經(jīng)無(wú)法使用,換成了Scrapy-Redis的Scheduler組件。11.2Scrapy-Redis架構(gòu)

ItemPipeline在Scrapy框架中,當(dāng)Spiders采集到Item數(shù)據(jù)時(shí),ScrapyEngine會(huì)把Item數(shù)據(jù)交給ItemPipeline,再由ItemPipeline把Item數(shù)據(jù)保存到Redis數(shù)據(jù)庫(kù)中。Scrapy-Redis對(duì)Scrapy框架的ItemPipeline組件進(jìn)行了修改,它可以很方便地根據(jù)鍵訪問Redis數(shù)據(jù)庫(kù)中的Item數(shù)據(jù),從而實(shí)現(xiàn)Item集群。11.2Scrapy-Redis架構(gòu)

SpidersScrapy-Redis中Spiders組件不再使用Scrapy原有的Spider類表示爬蟲,而使用重寫的RedisSpider類。RedisSpider類繼承了Spider類和RedisMixin這兩個(gè)類。當(dāng)創(chuàng)建了一個(gè)繼承自RedisSpider的子類對(duì)象時(shí),該對(duì)象調(diào)用setup_redis()方法后會(huì)連接Redis數(shù)據(jù)庫(kù),滿足一定條件后會(huì)設(shè)置如下兩個(gè)信號(hào)。爬蟲節(jié)點(diǎn)的主機(jī)處于空閑狀態(tài)的信號(hào),這個(gè)信號(hào)會(huì)被ScrapyEngine識(shí)別,判斷網(wǎng)絡(luò)爬蟲當(dāng)下是否處于空閑狀態(tài)。采集到一個(gè)Item數(shù)據(jù)的信號(hào),這個(gè)信號(hào)仍然會(huì)被ScrapyEngine識(shí)別,判斷網(wǎng)絡(luò)爬蟲是否采集到Item數(shù)據(jù)。11.2Scrapy-Redis架構(gòu)

DuplicationFilter11.2Scrapy-Redis架構(gòu)Scrapy使用集合實(shí)現(xiàn)請(qǐng)求的去重功能。它會(huì)把已經(jīng)發(fā)送的請(qǐng)求指紋(請(qǐng)求的特征值)放到一個(gè)集合中,然后在該集合中比對(duì)下一個(gè)請(qǐng)求指紋。如果該請(qǐng)求指紋存在于該集合中,則說(shuō)明這個(gè)請(qǐng)求已經(jīng)被發(fā)送,否則繼續(xù)操作。Scrapy-Redis中使用DuplicationFilter組件實(shí)現(xiàn)的請(qǐng)求的去重功能,該組件利用Redis中set集合元素不重復(fù)的特點(diǎn),巧妙地實(shí)現(xiàn)了這個(gè)功能。首先Scheduler接收ScrapyEngine傳遞的請(qǐng)求指紋,然后將這個(gè)請(qǐng)求指紋存入set集合中檢查是否重復(fù),并把不重復(fù)的請(qǐng)求指紋加入到Redis的請(qǐng)求隊(duì)列中。Scrapy-Redis運(yùn)作流程11.3熟悉Scrapy-Redis的運(yùn)作流程,能夠歸納Scrapy-Redis的運(yùn)作流程學(xué)習(xí)目標(biāo)11.3Scrapy-Redis運(yùn)作流程(1)ScrapyEngine從Spiders中獲取初始URL。(2)ScrapyEngine將初始URL封裝成請(qǐng)求,并將該請(qǐng)求交給Scheduler。(3)Scheduler訪問Redis數(shù)據(jù)庫(kù)對(duì)請(qǐng)求進(jìn)行判重,如果該請(qǐng)求不是重復(fù)的,就將該請(qǐng)求添加到Redis數(shù)據(jù)庫(kù)中。(4)當(dāng)調(diào)度條件滿足時(shí),Scheduler會(huì)從Redis數(shù)據(jù)庫(kù)中取出Request交給ScrapyEngine,ScrapyEngine將這個(gè)Request通過(guò)DownloaderMiddlewares轉(zhuǎn)交給Downloader。11.3Scrapy-Redis運(yùn)作流程Scrapy-Redis的運(yùn)作流程如下。11.3Scrapy-Redis運(yùn)作流程Scrapy-Redis的運(yùn)作流程如下。(5)一旦頁(yè)面下載完畢,Downloader會(huì)將服務(wù)器返回的響應(yīng)通過(guò)DownloaderMiddlewares交給ScrapyEngine。(6)ScrapyEngine通過(guò)SpiderMiddlewares發(fā)送給Spiders進(jìn)行處理。(7)Spiders處理響應(yīng),并返回采集到的Item數(shù)據(jù)以及新Request交給ScrapyEngine。(8)ScrapyEngine將爬取到的Item數(shù)據(jù)通過(guò)ItemPipeline交給Redis數(shù)據(jù)庫(kù),將Request給Scheduler。(9)從第2步開始重復(fù),直到Scheduler中沒有更多的Request為止。Scrapy-Redis開發(fā)準(zhǔn)備11.4掌握Scrapy-Redis安裝方式,能夠在Windows7操作系統(tǒng)中通過(guò)pip進(jìn)行安裝學(xué)習(xí)目標(biāo)11.4.1安裝Scrapy-Redis安裝Scrapy-Redis的方式非常簡(jiǎn)單,可以直接通過(guò)pip工具安裝Scrapy-Redis庫(kù)。pipinstallscrapy-redis==0.7.111.4.1安裝Scrapy-Redis運(yùn)行上述命令,在命令行窗口中可以看到不斷輸出的安裝信息。Scrapy-Redis庫(kù)安裝完成的窗口。安裝成功掌握修改Redis配置文件的方式,能夠通過(guò)修改配置文件允許其他客戶端遠(yuǎn)程連接到Redis服務(wù)學(xué)習(xí)目標(biāo)11.4.2修改配置文件11.4.2修改配置文件在Windows系統(tǒng)下,Redis數(shù)據(jù)庫(kù)的配置文件是redis.windows.conf,該文件默認(rèn)位于數(shù)據(jù)庫(kù)的安裝目錄下。在配置文件中,bind配置項(xiàng)用于指定綁定的主機(jī)地址,默認(rèn)值為bind,即本機(jī)地址,說(shuō)明只允許本機(jī)的客戶端訪問Redis服務(wù),而不允許其他客戶端遠(yuǎn)程連接Redis服務(wù),防止Redis服務(wù)暴露于危險(xiǎn)的網(wǎng)絡(luò)環(huán)境中,被其他客戶端隨意連接。11.4.2修改配置文件以Windows7系統(tǒng)為例,使用文本編輯工具打開redis.windows.conf文件,將該文件中的配置項(xiàng)bind改為bind。redis.windows.conf文件中默認(rèn)開啟了保護(hù)模式,此時(shí)需要將配置項(xiàng)protected-modeyes改為protected-modeno,以關(guān)閉保護(hù)模式。熟悉測(cè)試遠(yuǎn)程連接的步驟,能夠測(cè)試爬蟲節(jié)點(diǎn)的設(shè)備是否能讀取Redis數(shù)據(jù)庫(kù)中數(shù)據(jù)學(xué)習(xí)目標(biāo)11.4.3測(cè)試遠(yuǎn)程連接11.4.3測(cè)試遠(yuǎn)程連接為保證爬蟲節(jié)點(diǎn)的設(shè)備能夠讀取Redis數(shù)據(jù)庫(kù)中的數(shù)據(jù),我們?cè)谠趫?zhí)行分布式網(wǎng)絡(luò)爬蟲程序之前需要進(jìn)行遠(yuǎn)程連接測(cè)試,保證爬蟲節(jié)點(diǎn)(Slave端)的所有設(shè)備可以正常遠(yuǎn)程連接控制節(jié)點(diǎn)(Master端)的Redis數(shù)據(jù)庫(kù)。假設(shè)現(xiàn)有3臺(tái)分別裝有Windows7、macOS和Ubuntu系統(tǒng)的計(jì)算機(jī),其中裝有Windows7系統(tǒng)的計(jì)算機(jī)為Master端,其他兩臺(tái)計(jì)算機(jī)為Slave端,需要測(cè)試Slave端能否可以正常連接到Master端并訪問Redis數(shù)據(jù)庫(kù)。11.4.3測(cè)試遠(yuǎn)程連接測(cè)試遠(yuǎn)程連接具體步驟如下。(1)在Master端的計(jì)算機(jī)上以管理員身份打開命令行窗口,然后根據(jù)指定的配置文件啟動(dòng)redis-server。redis-serverredis.windows.conf(2)在Master端的計(jì)算機(jī)上再次打開新命令行窗口,使用如下命令啟動(dòng)本地客戶端redis-cli。redis-cli11.4.3測(cè)試遠(yuǎn)程連接測(cè)試遠(yuǎn)程連接具體步驟如下。(3)在本地客戶端中輸入ping命令檢測(cè)本地客戶端是否可以連接Redis服務(wù),若連接正常再使用set命令向Redis數(shù)據(jù)庫(kù)添加兩個(gè)鍵值對(duì)。ping命令結(jié)果為PONG,說(shuō)明客戶端可以正常連接Redis服務(wù)11.4.3測(cè)試遠(yuǎn)程連接測(cè)試遠(yuǎn)程連接具體步驟如下。(4)Slave端的計(jì)算機(jī)要想連接Master端的Redis數(shù)據(jù)庫(kù),需要在啟動(dòng)客戶端時(shí)指定Master端的IP地址,若本例中Master端的IP地址為08。在Slave端的終端中輸入如下命令啟動(dòng)redis-cli。redis-cli-h08-h參數(shù)表示連接到指定主機(jī)的Redis數(shù)據(jù)庫(kù)。值得一提的是,Slave端的計(jì)算機(jī)無(wú)需無(wú)須啟動(dòng)redis-server。11.4.3測(cè)試遠(yuǎn)程連接測(cè)試遠(yuǎn)程連接具體步驟如下。(5)因?yàn)樵谇懊嬉呀?jīng)向Redis數(shù)據(jù)庫(kù)中存入了兩個(gè)鍵值對(duì),所以可以在Slave端中直接使用get命令獲取Redis數(shù)據(jù)庫(kù)中的鍵值對(duì)進(jìn)行測(cè)試,一旦準(zhǔn)確獲取到該鍵對(duì)應(yīng)的值,說(shuō)明Slave端的網(wǎng)絡(luò)爬蟲可以正常訪問Redis數(shù)據(jù)庫(kù)。裝有macOS系統(tǒng)的計(jì)算機(jī)執(zhí)行命令后的結(jié)果裝有Ubuntu系統(tǒng)的計(jì)算機(jī)執(zhí)行命令后的結(jié)果多學(xué)一招查看計(jì)算機(jī)的IP地址在Windows系統(tǒng)的命令提示符窗口中,可使用如下命令查看IP地址。ipconfig以上命令執(zhí)行后,可以看到WindowsIP配置的具體信息,其中IPv4地址選項(xiàng)對(duì)應(yīng)的值便是當(dāng)前計(jì)算機(jī)的IP地址,具體如下所示。WindowsIP配置以太網(wǎng)適配器本地連接:

連接特定的DNS后綴.......:

本地鏈接IPv6地址........:fe80::8d8d:90f0:3afd:f945%11IPv4地址............:08...省略N行...Scrapy-Redis的基本操作11.5Scrapy-Redis可以看作Scrapy框架的插件,它里面重新實(shí)現(xiàn)了Scrapy框架中部分組件的功能,使Scrapy框架支持開發(fā)分布式網(wǎng)絡(luò)爬蟲。因此,可以先創(chuàng)建一個(gè)Scrapy項(xiàng)目,然后在Scrapy項(xiàng)目中增加Scrapy-Redis的相關(guān)配置,并使用替換的組件進(jìn)行開發(fā)。11.5Scrapy-Redis的基本操作掌握內(nèi)置下載中間件的使用,能夠在爬蟲項(xiàng)目啟用下載中間件學(xué)習(xí)目標(biāo)11.5.1新建Scrapy-Redis項(xiàng)目打開命令提示符窗口,先切換當(dāng)前工作路徑為項(xiàng)目要存放的目錄,再輸入創(chuàng)建Scrapy項(xiàng)目的命令,具體命令如下。11.5.1新建Scrapy-Redis項(xiàng)目scrapystartprojectmyDistributedSpider運(yùn)行上述命令,可以在爬蟲目錄下看到剛剛創(chuàng)建的myDistributedSpider項(xiàng)目。11.5.1新建Scrapy-Redis項(xiàng)目DUPEFILTER_CLASS用于設(shè)置檢測(cè)與過(guò)濾重復(fù)請(qǐng)求的類。需要使用Scrapy-Redis的去重組件,交由Redis數(shù)據(jù)庫(kù)執(zhí)行去重操作。DUPEFILTER_CLASSDUPEFILTER_CLASS="scrapy_redis.dupefilter.RFPDupeFilter"SCHEDULER用于設(shè)置調(diào)度器。這里,我們需要使用Scrapy-Redis的調(diào)度器,交由Redis分配請(qǐng)求。SCHEDULERSCHEDULER="scrapy_redis.scheduler.Scheduler"在創(chuàng)建的Scrapy-Redis項(xiàng)目的settings.py文件可增加或修改與Scrapy-Redis相關(guān)的配置項(xiàng)。11.5.1新建Scrapy-Redis項(xiàng)目在創(chuàng)建的Scrapy-Redis項(xiàng)目的settings.py文件可增加或修改與Scrapy-Redis相關(guān)的配置項(xiàng)。SCHEDULER_PERSIST用于設(shè)置是否在Redis數(shù)據(jù)庫(kù)中保持用到的隊(duì)列。這里,我們無(wú)須清理Redis中使用的隊(duì)列,允許項(xiàng)目在執(zhí)行中暫停和暫停后恢復(fù)。SCHEDULER_PERSISTSCHEDULER_PERSIST=TrueITEM_PIPELINES用于設(shè)置啟用管道,它的值是一個(gè)包含所有項(xiàng)目管道的字典,默認(rèn)是不啟用的。啟用該配置項(xiàng)后,Scrapy-Redis會(huì)將爬蟲抓取的Item數(shù)據(jù)存儲(chǔ)到Redis數(shù)據(jù)庫(kù)中。ITEM_PIPELINESITEM_PIPELINES={'myDistributedSpider.pipelines.MydistributedspiderPipeline':100,}11.5.1新建Scrapy-Redis項(xiàng)目REDIS_HOST用于設(shè)置Redis數(shù)據(jù)庫(kù)的連接信息,分別表示Redis所在主機(jī)的IP地址。REDIS_HOSTREDIS_HOST='08'REDIS_HOST用于設(shè)置Redis數(shù)據(jù)庫(kù)的連接信息,分別表示Redis所在主機(jī)的端口。REDIS_PORTREDIS_PORT=6379在創(chuàng)建的Scrapy-Redis項(xiàng)目的settings.py文件可增加或修改與Scrapy-Redis相關(guān)的配置項(xiàng)。明確爬蟲項(xiàng)目中明確采集目標(biāo),能夠在Scrapy-Redis中添加爬取字段學(xué)習(xí)目標(biāo)11.5.2明確采集目標(biāo)11.5.2明確采集目標(biāo)myDistributedSpider項(xiàng)目要采集的目標(biāo)數(shù)據(jù)仍然是某培訓(xùn)公司的講師詳情頁(yè)中的講師信息,包括講師的姓名、級(jí)別和履歷,由于采集目標(biāo)與第9章案例的采集目標(biāo)一致,所以仍然添加3個(gè)表示講師姓名、講師級(jí)別和講師履歷的屬性。importscrapyclassMydistributedspiderItem(scrapy.Item):name=scrapy.Field()#表示講師姓名

level=scrapy.Field()#表示講師級(jí)別

resume=scrapy.Field()#表示講師履歷將mySpider\items.py文件中添加屬性的代碼復(fù)制到myDistributedSpider\items.py文件中掌握制作Scrapy爬蟲,能夠使用Scrapy-Redis提取指定數(shù)據(jù)學(xué)習(xí)目標(biāo)11.5.3制作爬蟲Scrapy-Redis的scrapy_redis.spiders模塊中定義了兩個(gè)代表爬蟲的類:RedisSpider和RedisCrawlSpider,其中RedisSpider是Spider的派生類,RedisCrawlSpider是CrawlSpider類的派生類,這兩個(gè)類默認(rèn)已經(jīng)擁有了父類中的成員,此外也定義了自己的屬性,如redis_key和allowed_domains屬性。11.5.3制作爬蟲

redis_key屬性redis_key屬性用于設(shè)置Redis數(shù)據(jù)庫(kù)從哪里獲取初始URL,作用類似于start_urls屬性。redis_key屬性的值是一個(gè)字符串,字符串中的內(nèi)容一般是爬蟲名稱和start_urls,且兩者之間以冒號(hào)進(jìn)行分隔。redis_key=‘itcast:start_urls‘#itcast為爬蟲名稱

運(yùn)行Scrapy-Redis項(xiàng)目后,所有的爬蟲不會(huì)立即執(zhí)行抓取操作,而是在原地等待Master端發(fā)布指令,這是因?yàn)樗械呐老x已經(jīng)沒有初始URL了,而是由Redis數(shù)據(jù)庫(kù)統(tǒng)一分配與調(diào)度采集任務(wù),從Redis數(shù)據(jù)庫(kù)中獲取請(qǐng)求。11.5.3制作爬蟲

allowed_domains屬性11.5.3制作爬蟲allowed_domains屬性的作用與之前allowed_domains屬性相同,用于設(shè)置爬蟲搜索的域名范圍。allowed_domains屬性的值有兩種設(shè)置方式,一種是按照Spider的原有寫法,直接賦值為爬蟲搜索的域名范圍,另一種方式是動(dòng)態(tài)地獲取域名。def__init__(self,*args,**kwargs):domain=kwargs.pop('domain','')self.allowed_domains=filter(None,domain.split(','))super(當(dāng)前類名,self).__init__(*args,**kwargs)11.5.3制作爬蟲我們?cè)趍yDistributedSpider項(xiàng)目下創(chuàng)建一個(gè)爬蟲:爬蟲的名稱為itcast,爬蟲搜索的域名范圍為,具體命令如下。scrapygenspideritcast""運(yùn)行上述命令,可以看到myDistributedSpider/spiders目錄下增加了itcast.py文件。在itcast.py文件需要將ItcastSpider的父類修改為RedisSpider類,刪除start_urls屬性的代碼,增加設(shè)置redis_key屬性的代碼,并在parse()方法中實(shí)現(xiàn)解析目標(biāo)網(wǎng)頁(yè)數(shù)據(jù)的功能。[單擊查看源碼]掌握如何運(yùn)行Scrapy-Redis爬蟲,能夠啟動(dòng)分布式爬蟲學(xué)習(xí)目標(biāo)11.5.4運(yùn)行爬蟲11.5.4運(yùn)行爬蟲制作爬蟲完成之后,我們就可以采用分布式方式運(yùn)行網(wǎng)絡(luò)爬蟲程序了。在執(zhí)行爬蟲之前,需要先確定計(jì)算機(jī)的分配情況,選擇哪臺(tái)計(jì)算機(jī)為控制節(jié)點(diǎn)的主機(jī),負(fù)責(zé)給其他計(jì)算機(jī)提供URL分發(fā)服務(wù),哪臺(tái)計(jì)算機(jī)為爬蟲節(jié)點(diǎn)的主機(jī),負(fù)責(zé)執(zhí)行網(wǎng)頁(yè)的采集任務(wù),并保證爬蟲節(jié)點(diǎn)可以成功讀取控制節(jié)點(diǎn)上Redis數(shù)據(jù)庫(kù)中存放的數(shù)據(jù)。運(yùn)行分布式爬蟲的步驟如下。(1)在Master端的計(jì)算機(jī)中,打開命令行窗口,切換當(dāng)前路徑為Redis數(shù)據(jù)庫(kù)的安裝目錄,之后輸入如下命令啟動(dòng)redis-server。redis-serverredis.windows.conf11.5.4運(yùn)行爬蟲(2)將myDistributedSpider項(xiàng)目復(fù)制到Slave端。在Slave端的計(jì)算機(jī)中打開命令行窗口,將當(dāng)前工作路徑切換至myDistributedSpider/spiders目錄下。scrapyrunspideritcast.py運(yùn)行以上命令,此時(shí)Slave端的計(jì)算機(jī)會(huì)暫停執(zhí)行,等待Master端發(fā)布指令。值得一提的是,多個(gè)Slave端在運(yùn)行爬蟲時(shí)無(wú)需區(qū)分先后順序。(3)在Master端的計(jì)算機(jī)中,再次打開一個(gè)命令行窗口,輸入如下命令啟動(dòng)redis-cli。redis-cli(4)使用lpush命令發(fā)布指令到Slave端。lpush命令有著固定的格式,具體如下。11.5.4運(yùn)行爬蟲lpushredis_key初始URL例如,使用lpush命令發(fā)布指令采集講師的信息,具體命令如下lpushitcast:start_urls/channel/teacher.shtml運(yùn)行上述命令,Slave端的命令行窗口中不斷地輸出提示信息,開始爬取數(shù)據(jù)。掌握如何在Scrapy-Redis中使用管道,能夠使用管道存儲(chǔ)數(shù)據(jù)學(xué)習(xí)目標(biāo)11.5.5使用管道存儲(chǔ)數(shù)據(jù)在Scrapy-Redis項(xiàng)目中,同樣也可以定義多個(gè)管道,并讓這些管道按照一定的順序依次處理Item數(shù)據(jù)。11.5.5使用管道存儲(chǔ)數(shù)據(jù)每個(gè)管道都是一個(gè)獨(dú)立的Python類,并在該類中必須實(shí)現(xiàn)process_item()方法。例如,定義3個(gè)管道類:ItacstCsvPipeline類、ItacstRedisPipeline類和ItacstMongoPipeline類。11.5.5使用管道存儲(chǔ)數(shù)據(jù)

定義管道11.5.5使用管道存儲(chǔ)數(shù)據(jù)

定義管道ItacstCsvPipeline類ItacstCsvPipeline類負(fù)責(zé)將數(shù)據(jù)保存到CSV文件。為方便開發(fā)人員讀寫CSV格式的文件,這里需要結(jié)合scrapy.exporters模塊中CsvItemExporter類的功能,對(duì)Item數(shù)據(jù)進(jìn)行相應(yīng)的處理。open_spider()方法指定了爬蟲運(yùn)行前執(zhí)行的操作,process_item()方法指定了爬蟲對(duì)Item數(shù)據(jù)的處理操作,close_spider()方法指定了爬蟲運(yùn)行后執(zhí)行的操作,fromscrapy.exportersimportCsvItemExporterclassItcastCsvPipeline(object):defopen_spider(self,spider):self.file=open("itcast.csv","w")#根據(jù)CSV文件創(chuàng)建文件對(duì)象self.csv_exporter=CsvItemExporter(self.file)#創(chuàng)建CsvItemExporter類的對(duì)象self.csv_exporter.start_exporting()#標(biāo)識(shí)開始導(dǎo)出文件defprocess_item(self,item,spider):self.csv_exporter.export_item(item)#將Item數(shù)據(jù)寫入文件中returnitemdefclose_spider(self,spider):self.csv_exporter.finish_exporting()#標(biāo)識(shí)結(jié)束導(dǎo)出文件

self.file.close()#關(guān)閉文件11.5.5使用管道存儲(chǔ)數(shù)據(jù)

定義管道ItacstCsvPipeline類ItcastCsvPipeline類的定義如右。importredis,jsonclassItcastRedisPipeline(object):defopen_spider(self,spider):#建立與Redis數(shù)據(jù)庫(kù)的連接

self.redis_cli=redis.Redis(host="9",port=6379)#建立與Redis數(shù)據(jù)庫(kù)的連接defprocess_item(self,item,spider):#指定了爬蟲對(duì)Item數(shù)據(jù)的處理操作。

content=json.dumps(dict(item),ensure_ascii=False)#將Item數(shù)據(jù)轉(zhuǎn)換成JSON對(duì)象self.redis_cli.lpush("ITCAST_List",content)#將content插入Redis數(shù)據(jù)庫(kù)returnitem11.5.5使用管道存儲(chǔ)數(shù)據(jù)

定義管道ItacstRedisPipeline類ItacstRedisPipeline類負(fù)責(zé)將數(shù)據(jù)保存到Redis數(shù)據(jù)庫(kù)。importpymongoclassLtcastMongoPipeline(object):#指定了爬蟲運(yùn)行前執(zhí)行的操作defopen_spider(self,spider):

self.mongo_cli=pymongo.MongoClient(host="",port=27017)#建立與MongoDB數(shù)據(jù)庫(kù)的連接

self.db=self.mongo_cli["itcast"]#創(chuàng)建數(shù)據(jù)庫(kù)

self.sheet=self.db['itcast_item']#創(chuàng)建集合defprocess_item(self,item,spider):#指定了爬蟲對(duì)Item數(shù)據(jù)的處理操作self.sheet.insert(dict(item))returnitem11.5.5使用管道存儲(chǔ)數(shù)據(jù)

定義管道ItacstMongoPipeline類ItacstMongoPip

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論