




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
福建工程學(xué)院本科畢業(yè)設(shè)畢業(yè)設(shè)計(論文)I基于Python的分布式爬蟲系統(tǒng)設(shè)計摘要在這個互聯(lián)網(wǎng)飛速發(fā)展的時代下,隨著互聯(lián)網(wǎng)網(wǎng)絡(luò)規(guī)模和用戶數(shù)量的爆炸性增長,相關(guān)的服務(wù)和信息量也隨之快速增長,單純依賴計算機(jī)單機(jī)處理能力的集中式網(wǎng)絡(luò)爬蟲信息采集的速度已經(jīng)無法滿足快速獲取大量數(shù)據(jù)的需求。分布式網(wǎng)絡(luò)爬蟲由可并行獲取資源的多個節(jié)點爬蟲組成,具有良好的可擴(kuò)展性,它們在數(shù)據(jù)檢索方面的優(yōu)秀表現(xiàn)受到人們的歡迎。因此,本文將根據(jù)平臺的需求,設(shè)計出一個個性化的高效的分布式網(wǎng)絡(luò)爬蟲。本文依托針對上述課題展開研究,設(shè)計并實現(xiàn)了一個分布式網(wǎng)絡(luò)爬蟲。本文在對當(dāng)前流行的分布式網(wǎng)絡(luò)爬蟲的相關(guān)技術(shù)進(jìn)行了一定研究的基礎(chǔ)上,根據(jù)需求分析設(shè)計理念,結(jié)合代碼介紹爬蟲的設(shè)計細(xì)節(jié),通過對比實驗體現(xiàn)分布式爬蟲的優(yōu)勢,并作出總結(jié),提出展望。本文所研究設(shè)計的分布式網(wǎng)絡(luò)爬蟲系統(tǒng),最大限度地利用了爬蟲和網(wǎng)絡(luò)帶寬,不僅提高了計算機(jī)信息采集的速度,降低了系統(tǒng)損耗,而且加強(qiáng)了系統(tǒng)的可擴(kuò)展性,能夠適應(yīng)更多類型的數(shù)據(jù)。關(guān)鍵詞:Python,分布式爬蟲,scrapy,Redis,MongoDB目錄TOC\o"1-3"\h\u24003第1章緒論 1132241.1研究背景及意義 1258171.1.1系統(tǒng)背景 111141.1.2系統(tǒng)開發(fā)意義 1270221.2研究方向與內(nèi)容 26137第2章相關(guān)工具和理論介紹 3141002.1Python概述 3198042.2Hadoop概述 360582.3Scrapy框架簡介 365312.4Redis數(shù)據(jù)庫 564282.5MonggoDB數(shù)據(jù)庫 521645第3章系統(tǒng)需求分析 6221353.1功能需求 6192553.2用例圖 7307073.3架構(gòu)示意圖 885683.4功能架構(gòu)劃分 9255153.5程序流程圖 1014082第4章數(shù)據(jù)庫設(shè)計 11114194.1數(shù)據(jù)庫E-R圖 1111904.2數(shù)據(jù)庫表及其結(jié)構(gòu) 1225065第5章系統(tǒng)詳細(xì)設(shè)計與實現(xiàn) 13163435.1爬蟲的設(shè)計與實現(xiàn) 13236415.1.1爬取策略的設(shè)計的設(shè)計與實現(xiàn) 13224965.1.2爬蟲的具體實現(xiàn) 14221045.1.3去重與增量爬取 1569665.2爬蟲防屏蔽組件的實現(xiàn) 1644775.3數(shù)據(jù)處理 193835第6章系統(tǒng)運行 2210423第7章系統(tǒng)測試 23192767.1測試簡介 23247957.2測試結(jié)果 2414147參考文獻(xiàn) 28第1章緒論1.1研究背景及意義1.1.1系統(tǒng)背景近年來,互聯(lián)網(wǎng)正處于穩(wěn)重求快的階段,互聯(lián)網(wǎng)正在全面滲透于我們的日常生活中,在很多方面改變和改善我們的生活和工作形態(tài)。當(dāng)前互聯(lián)網(wǎng)已經(jīng)成為影響我國經(jīng)濟(jì)社會發(fā)展、改變?nèi)藗兩钚螒B(tài)的關(guān)鍵行業(yè),膨脹的網(wǎng)民數(shù)量給搜索引擎的發(fā)展帶來了極大的機(jī)遇。為了更好地解決這個問題,怎樣從越來越大的數(shù)據(jù)資料源中以更快的速度、極高的效率、很高的安全性尋找到對網(wǎng)絡(luò)使用者有價值的數(shù)據(jù)成為了搜索引擎的主要目標(biāo)。在海量數(shù)據(jù)的現(xiàn)狀下,想要解決網(wǎng)絡(luò)搜索問題,單純地依賴計算機(jī)單機(jī)處理能力是幾乎完成不了的,即使是提升計算機(jī)硬件方面的功能,也不可能趕上信息增長的速度。經(jīng)過研究者的潛心鉆研,他們提出了分布式信息檢索技術(shù)。該技術(shù)一經(jīng)發(fā)布,便得到了極大的關(guān)注,目前幾乎所有的大型搜索系統(tǒng)都使用了分布式的體系構(gòu)造,眾所周知的Google和百度,它們的搜索引擎系統(tǒng)便是采用這一體系,利用分布式網(wǎng)絡(luò)爬蟲提高數(shù)據(jù)檢索的效率。分布式搜索系統(tǒng)采用分布式信息檢索技術(shù),以分布式網(wǎng)絡(luò)爬蟲為基礎(chǔ),聯(lián)結(jié)互聯(lián)網(wǎng)中的多個機(jī)器,協(xié)調(diào)解決大規(guī)模數(shù)據(jù)的處理、索引和檢索問題。其中,分布式搜索引擎的核心功能是由分布式網(wǎng)絡(luò)爬蟲實現(xiàn)的。1.1.2系統(tǒng)開發(fā)意義隨著大數(shù)據(jù)時代的到來,如何采集龐大的數(shù)據(jù)庫也是目前難題之一,這個時候網(wǎng)絡(luò)爬蟲就變成了一個必不可少的東西,其中爬蟲又分為單機(jī)爬蟲和分布式爬蟲。分布式爬蟲是在多臺機(jī)器上運行爬蟲程序,重點是聯(lián)合采集數(shù)據(jù)。在多個服務(wù)器上能夠協(xié)同采集的就是分布式的,分布式實現(xiàn)了多臺主機(jī)使用一個共同的爬蟲程序,可以在多臺電腦上運行,這樣的話可以提高爬蟲效率。像是采集非常大量的數(shù)據(jù),多線程爬蟲是很難做到高效的,所以研究分布式爬蟲是這個大數(shù)據(jù)時代所必須的。無論是單機(jī)或者是多臺主機(jī),分布式爬蟲都對計算機(jī)的性能有一定的要求,首先是處理器,其次是網(wǎng)絡(luò),分布式爬蟲的效率會受這些的影響,如果硬件設(shè)施無法達(dá)到要求甚至不如單機(jī)爬蟲。分布式爬蟲本質(zhì)上就是將程序的運行從一臺機(jī)器擴(kuò)展到多臺機(jī)器,加快運行速率。1.2研究方向與內(nèi)容 本文結(jié)合實際平臺需求,基于分布式搜索引擎的框架,設(shè)計實現(xiàn)分布式網(wǎng)絡(luò)爬蟲。研究內(nèi)容主要包括以下四個方面: (1)查閱當(dāng)前流行的分布式模型的相關(guān)資料,積累相關(guān)分布式網(wǎng)絡(luò)爬蟲的開發(fā)經(jīng)驗和理論基礎(chǔ)。 (2)著重掌握分布式網(wǎng)絡(luò)爬蟲相關(guān)知識,根據(jù)蘇州貸后風(fēng)險平臺的實際需要,分析爬蟲設(shè)計要點,例如爬蟲結(jié)構(gòu)、通信方式、數(shù)據(jù)結(jié)構(gòu)、報文設(shè)計、異常處理方式等。 (3)細(xì)化設(shè)計要點,編碼實現(xiàn)一個分布式網(wǎng)絡(luò)爬蟲,從報文解析和線程控制兩個方面進(jìn)行說明,確保系統(tǒng)正常高效運行。(4)將本文實現(xiàn)的爬蟲運用于模擬的分布式系統(tǒng)環(huán)境下,測試其爬行效率和系統(tǒng)的穩(wěn)定性,并進(jìn)行對比實驗,分析實驗效果,提出改進(jìn)建議。相關(guān)工具和理論介紹2.1Python概述Python是一種代表簡單主義思想的語言。閱讀一個良好的Python程序就感覺像是在讀英語一樣。它使你能夠?qū)W⒂诮鉀Q問題而不是去搞明白語言本身。Python極其容易上手,因為Python有極其簡單的說明文檔。風(fēng)格清晰劃一、強(qiáng)制縮進(jìn),Python的底層是用C語言寫的,很多標(biāo)準(zhǔn)庫和第三方庫也都是用C寫的,運行速度非???。Python既支持面向過程的編程也支持面向?qū)ο蟮木幊?。在“面向過程”的語言中,程序是由過程或僅僅是可重用代碼的函數(shù)構(gòu)建起來的。在“面向?qū)ο蟆钡恼Z言中,程序是由數(shù)據(jù)和功能組合而成的對象構(gòu)建起來的。Python是完全面向?qū)ο蟮恼Z言。函數(shù)、模塊、數(shù)字、字符串都是對象。并且完全支持繼承、重載、派生、多繼承,有益于增強(qiáng)源代碼的復(fù)用性。Python支持重載運算符和動態(tài)類型。相對于Lisp這種傳統(tǒng)的函數(shù)式編程語言,Python對函數(shù)式設(shè)計只提供了有限的支持。有兩個標(biāo)準(zhǔn)庫(functools,itertools)提供了Haskell和StandardML中久經(jīng)考驗的函數(shù)式程序設(shè)計工具。2.2Hadoop概述Hadoop是一個由Apache基金會所開發(fā)的分布式系統(tǒng)基礎(chǔ)架構(gòu)。用戶可以在不了解分布式底層細(xì)節(jié)的情況下,開發(fā)分布式程序。充分利用集群的威力進(jìn)行高速運算和存儲。Hadoop實現(xiàn)了一個分布式文件系統(tǒng),其中一個組件是HDFS。HDFS有高容錯性的特點,并且設(shè)計用來部署在低廉的硬件上;而且它提供高吞吐量來訪問應(yīng)用程序的數(shù)據(jù),適合那些有著超大數(shù)據(jù)集的應(yīng)用程序。HDFS放寬了POSIX的要求,可以以流的形式訪問文件系統(tǒng)中的數(shù)據(jù)。Hadoop的框架最核心的設(shè)計就是:HDFS和MapReduce。HDFS為海量的數(shù)據(jù)提供了存儲,而MapReduce則為海量的數(shù)據(jù)提供了計算。2.3Scrapy框架簡介Scrapy是用Python開發(fā)的一個開源的Web爬蟲框架,可用于快速抓取Web站點病蟲頁面中搞笑提取結(jié)構(gòu)化的數(shù)據(jù)。Scrapy可廣泛應(yīng)用于數(shù)據(jù)挖掘、監(jiān)測和自動化測試等方面,提供了多種類型爬蟲的基類,如BaseSpaider、SitemapSpider等。Scrapy使用了Twisted異步網(wǎng)絡(luò)庫來處理網(wǎng)絡(luò)通訊。整體架構(gòu)大致如下(圖片來源網(wǎng)絡(luò)):圖2-1Scrapy整體架構(gòu)圖Scrapy架構(gòu)組件介紹:ScrapyEngine(引擎):負(fù)責(zé)Spider、ItemPipeline、Downloader、Scheduler中間的通訊,信號、數(shù)據(jù)傳遞等。Scheduler(調(diào)度器):它負(fù)責(zé)接受引擎發(fā)送過來的Request請求,并按照一定的方式進(jìn)行整理排列,入隊,當(dāng)引擎需要時,交還給引擎。Downloader(下載器):負(fù)責(zé)下載ScrapyEngine(引擎)發(fā)送的所有Requests請求,并將其獲取到的Responses交還給ScrapyEngine(引擎),由引擎交給Spider來處理,Spider(爬蟲):它負(fù)責(zé)處理所有Responses,從中分析提取數(shù)據(jù),獲取Item字段需要的數(shù)據(jù),并將需要跟進(jìn)的URL提交給引擎,再次進(jìn)入Scheduler(調(diào)度器),ItemPipeline(管道):它負(fù)責(zé)處理Spider中獲取到的Item,并進(jìn)行進(jìn)行后期處理(詳細(xì)分析、過濾、存儲等)的地方.DownloaderMiddlewares(下載中間件):你可以當(dāng)作是一個可以自定義擴(kuò)展下載功能的組件。SpiderMiddlewares(Spider中間件):你可以理解為是一個可以自定擴(kuò)展和操作引擎和Spider中間通信的功能組件(比如進(jìn)入Spider的Responses;和從Spider出去的Requests)2.4Redis數(shù)據(jù)庫Redis是一個key-value存儲系統(tǒng)。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sortedset--有序集合)和hash(哈希類型)。這些數(shù)據(jù)類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎(chǔ)上,Redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中。區(qū)別的是Redis會周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎(chǔ)上實現(xiàn)了master-slave(主從)同步。2.5MonggoDB數(shù)據(jù)庫MongoDB是一個基于分布式文件存儲的數(shù)據(jù)庫。由C++語言編寫。旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲解決方案。MongoDB是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的。它支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似json的bson格式,因此可以存儲比較復(fù)雜的數(shù)據(jù)類型。Mongo最大的特點是它支持的查詢語言非常強(qiáng)大,其語法有點類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對數(shù)據(jù)建立索引。第3章系統(tǒng)需求分析3.1功能需求隨著網(wǎng)絡(luò)資源的不斷爆炸,社會越來越需要一些自動化的技術(shù)取代傳統(tǒng)的數(shù)據(jù)收集方法,來篩選有用、有價值的信息,并提取出來滿足人們的生活需要。爬蟲程序就是在這樣的要求下產(chǎn)生的,它是大數(shù)據(jù)時代信息收集的必備技能。基于Python的Scrapy框架爬蟲又是其中重要的一員,在搜索引擎、信息檢索和數(shù)據(jù)挖掘中都是十分重要的基礎(chǔ)。通過使用該技術(shù),我們能更好的根據(jù)自己的需要從特定的所需網(wǎng)站里獲取自己所想要的信息,從而滿足自己的需求。本課題研究的是基于Python的分布式爬蟲,是一個以研究Scrapy與hadoop框架為主的分布式爬蟲系統(tǒng)。該系統(tǒng)采用Scrapy框架;Scrapy框架的數(shù)據(jù)流向首先從初始URL開始。調(diào)度程序接受請求,并對URL進(jìn)行排序,再發(fā)送請求給下載器,下載器抓取網(wǎng)頁并將網(wǎng)頁內(nèi)容返回給爬蟲。爬蟲分析出來的結(jié)果有兩種:一種是需要進(jìn)一步抓取的鏈接,放回調(diào)度器;另一種是需要保存的數(shù)據(jù),則被送回項目管道,項目管道負(fù)責(zé)清洗數(shù)據(jù),驗證解析出來的數(shù)據(jù),檢查數(shù)據(jù)是否和已存儲的數(shù)據(jù)重復(fù),有則丟棄,最終將清洗后的數(shù)據(jù)存儲在Redis數(shù)據(jù)庫中。之后將Redis里面的數(shù)據(jù)錄入到MongoDB數(shù)據(jù)庫當(dāng)中,可以做到查看,刪除等功能,除此之外還利用matplolib進(jìn)行可視化處理3.2用例圖圖3-1用戶用例圖圖3-2爬蟲用例圖3.3架構(gòu)示意圖圖3-3架構(gòu)示意圖3.4功能架構(gòu)劃分爬蟲功能的功能需求主要在對于字段的爬取,對網(wǎng)站反爬的處理,內(nèi)容的保存和處理。這就要求爬蟲能夠滿足對于網(wǎng)站各種信息的曬別,提取,能夠應(yīng)對網(wǎng)站的反爬,以及對爬取出來的內(nèi)容進(jìn)行收集和處理。系統(tǒng)功能架構(gòu)如下圖所示:圖3-4功能架構(gòu)圖3.5程序流程圖圖3-5程序流程圖第4章數(shù)據(jù)庫設(shè)計4.1數(shù)據(jù)庫E-R圖系統(tǒng)采用的是MonggoDB數(shù)據(jù)庫,從需求的分析上找出實體,實體和屬性聯(lián)系通過E-R圖表展示,通過優(yōu)化后得到具體模型,系統(tǒng)的E-R圖如下圖所示:圖4-1數(shù)據(jù)庫E-R圖4.2數(shù)據(jù)庫表及其結(jié)構(gòu)該表主要是以主要爬取字段為目標(biāo),由Slave服務(wù)器端解析爬取字段數(shù)據(jù),所以數(shù)據(jù)庫表的內(nèi)容必須符合抓取內(nèi)容。以秀動網(wǎng)演唱會數(shù)據(jù)為主,通過分析內(nèi)部結(jié)構(gòu),內(nèi)容字段如下表所示:表4-1演唱會內(nèi)容表序號字段名稱字段含義1platform平臺2title演唱會標(biāo)題3ShowTime表演時間4actors明星名字5address演出地址6price價格7url頁面地址第5章系統(tǒng)詳細(xì)設(shè)計與實現(xiàn)5.1爬蟲的設(shè)計與實現(xiàn)該系統(tǒng)主要以爬取秀動演唱會網(wǎng)頁內(nèi)容為主來設(shè)計爬蟲,重點考慮爬取策略的設(shè)計,數(shù)據(jù)的抓取、去重和增量功能的實現(xiàn)、爬蟲防屏蔽的實現(xiàn)、數(shù)據(jù)處理與存儲5.1.1爬取策略的設(shè)計的設(shè)計與實現(xiàn)由scrapy的結(jié)構(gòu)分析可知,網(wǎng)絡(luò)爬蟲從初始地址開始,根據(jù)spider中定義的目標(biāo)地址獲的正則表達(dá)式或者Xpath獲得更多的網(wǎng)頁鏈接,并加入到待下載隊列當(dāng)中,進(jìn)行去重和排序之后,等待調(diào)度器的調(diào)度。在這個系統(tǒng)中,新的鏈接可以分為兩類,一類是目錄頁鏈接,也就是我們通??吹降南乱豁摰逆溄?,一類是內(nèi)容詳情頁鏈接,也就是我們需要解析網(wǎng)頁提取字段的鏈接,指向的就是實際的房源信息頁面。網(wǎng)絡(luò)需從每一個目錄頁鏈接當(dāng)中,提取到多個內(nèi)容頁鏈接,加入到待下載隊列準(zhǔn)備進(jìn)一步爬取。具體代碼如下:classMovieSpider(RedisSpider):
name='movie'
allowed_domains=['']
redis_key='xiudong:start_urls'
#foriinrange(1,90):
#start_urls.append('/event/list?cityId=0&siteId=0&isList=1&pageNo=%s'%(i))
index=3
base_url='/event/list?cityId=0&siteId=0&isList=1&pageNo={}'
defparse(self,response):
urls=response.xpath('//ul[@class="g-list-wrapjustifyMT30"]/li/a/@href').extract()
names=response.xpath('//ul[@class="g-list-wrapjustifyMT30"]/li/a/p[@class="g-name"]/text()').extract()
fori,jinzip(names,urls):
yieldscrapy.Request(url=j,callback=self.handle)
ifself.index<100:
yieldscrapy.Request(self.base_url.format(self.index),callback=self.parse)
self.index=self.index+2此處是Master端的目標(biāo)鏈接的爬取策略,因為采取的分布式主從模式,Master端爬蟲主要爬取下載到內(nèi)容詳情頁鏈接,通過redis分享下載任務(wù)給其他slave端的爬蟲。Slave端主要是負(fù)責(zé)對詳情頁鏈接的進(jìn)一步解析提取存儲到數(shù)據(jù)庫中。5.1.2爬蟲的具體實現(xiàn)爬蟲程序的包含四個部分,分別是對象定義程序,數(shù)據(jù)抓取程序,數(shù)據(jù)處理程序和下載設(shè)置程序,此處的組成是Slave端,Master少了對象定義程序以及數(shù)據(jù)處理程序,Master端主要是下載鏈接的爬取。數(shù)據(jù)抓取程序
數(shù)據(jù)抓取程序分Master端和Slave端,數(shù)據(jù)抓取程序從Redis中獲得初始地址,數(shù)據(jù)抓取程序中定義了抓取網(wǎng)頁的規(guī)則和使用Xpath提取字段數(shù)據(jù)的方法等,這里著重介紹Xpath提取字符數(shù)據(jù)的方法,Xapth使用路徑表達(dá)式來選取網(wǎng)頁文檔中的節(jié)點或者節(jié)點集。在Xpath中有其中類型的幾點:元素、屬性、文本、命名空間、處理指令、注釋和文檔節(jié)點。網(wǎng)頁文檔是被當(dāng)做節(jié)點樹來對待,樹的跟被稱為文檔節(jié)點和根節(jié)點,通過Xpath表達(dá)式定位目標(biāo)節(jié)點即可抽取網(wǎng)頁文檔的字段數(shù)據(jù),下面以Master抓取標(biāo)題內(nèi)容頁和Slave提取字段數(shù)據(jù)為例。圖5-1網(wǎng)頁具體字段圖Xpath抽取內(nèi)容詳情頁鏈接的方法關(guān)鍵代碼如下:title=response.xpath('//h1[@class="goods-name"]/text()').extract()[-1].replace('\t','').replace('\n','')
info=response.xpath('//ul[@class="items-list"]/li/text()').extract()
ShowTime=info[0].replace('\t','').replace('\n','')
actors=response.xpath('//ul[@class="items-list"]/li[2]/a/text()').extract()
actors="".join(actors)
address=response.xpath('//ul[@class="items-list"]/li[4]/text()').extract()[0].replace('\t','').replace('\n','')
price=response.xpath('//span[@class="price"]/text()').extract()[0]
url=response.url
url="".join(url)
platform="ShwoStart"5.1.3去重與增量爬取去重與增量爬取,對于服務(wù)器有很重大的意義,能夠減少服務(wù)器的壓力以及保證數(shù)據(jù)的準(zhǔn)確性。如果不采取去重處理,那么抓取的內(nèi)容會抓取大量重復(fù)內(nèi)容,讓爬蟲效率極大的下降。其實去重流程很簡單,核心就是每次請求的時候,先判斷這個請求是否在已經(jīng)爬取的隊列當(dāng)中。如果已存在,則舍棄當(dāng)前請求。(1)
從待爬隊列中獲取url(2)將即將請求的url判斷是否已經(jīng)爬取,若已爬取,則將請求忽略,未爬取,繼續(xù)其他操作并將url插入已爬取隊列中此處使用的是Scrapy-redis組件,關(guān)鍵代碼如下:BOT_NAME='CatEye'
SPIDER_MODULES=['CatEye.spiders']
NEWSPIDER_MODULE='CatEye.spiders'
#Crawlresponsiblybyidentifyingyourself(andyourwebsite)ontheuser-agent
USER_AGENT='Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/88.0.4324.190Safari/537.36'
#Obeyrobots.txtrules
ROBOTSTXT_OBEY=False
REDIS_HOST=''#根據(jù)自己的ip進(jìn)行更改
REDIS_PORT=6379
DUPEFILTER_CLASS="scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER="scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST=True
ITEM_PIPELINES={
'scrapy_redis.pipelines.RedisPipeline':400,5.2爬蟲防屏蔽組件的實現(xiàn)訪問一個網(wǎng)站的網(wǎng)頁的時候,會給網(wǎng)站帶了一定的負(fù)載,而爬蟲程序則是模擬了我們正常訪問網(wǎng)頁的過程,但是。大規(guī)模的爬蟲會給網(wǎng)站增加大量的負(fù)載,影響正常用戶的訪問。為保證網(wǎng)頁能夠別大多數(shù)正常用戶的訪問,大多數(shù)網(wǎng)站都有相應(yīng)的防爬蟲策略。一旦訪問行為被認(rèn)定為爬蟲,網(wǎng)站將會采取一定的措施,限制你的訪問,比如提示你,訪問過于頻繁讓你輸入驗證碼,更嚴(yán)重者,會封掉你的ip,禁止你訪問該網(wǎng)站。本系統(tǒng)定向抓取網(wǎng)頁數(shù)據(jù)的時候,將不間斷的訪問網(wǎng)站內(nèi)容,如果不采取偽裝措施,很容易被網(wǎng)站識別為爬蟲行為而屏蔽掉。本系統(tǒng)采用以下方法來防止爬蟲被屏蔽:1.
模擬不同的瀏覽器行為2.
以一定的頻率更換代理服務(wù)器和網(wǎng)關(guān)3.
本著君子協(xié)議,降低爬蟲爬取網(wǎng)頁的頻率,減少并發(fā)爬取的進(jìn)程,限制每個ip并發(fā)爬取的次數(shù),犧牲一定的效率來換取系統(tǒng)的穩(wěn)定性。(a)模擬不同瀏覽器行為實現(xiàn)思路及代碼原理:從scrapy的介紹我們可以知道,scrapy有下載中間件,在這個中間件我們可以對請求跟響應(yīng)進(jìn)行自定義處理,類似于spring面向切面編程,像一個鉤子嵌入到程序的運行前后。核心就是對請求的屬性進(jìn)行修改首先主要是對下載中間件進(jìn)行了擴(kuò)展,首先在seetings.py上面增加中間件,其次,擴(kuò)展中間件,主要是寫一個useragent列表,將常用的瀏覽器請求頭保存為一個列表,代碼如下所示:#Crawlresponsiblybyidentifyingyourself(andyourwebsite)ontheuser-agent
USER_AGENT='Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/88.0.4324.190Safari/537.36'再讓請求的頭文件隨機(jī)在列表中取一個agent值,然后到下載器進(jìn)行下載。綜上,每次發(fā)出請求的時候模擬使用不同的瀏覽器對目標(biāo)網(wǎng)站進(jìn)行訪問。(b)使用代理ip進(jìn)行爬取的實現(xiàn)思路及代碼。首先在seetings.py上面增加中間件,擴(kuò)展下載組件請求的頭文件隨機(jī)從代理ip池中取出一個代理值然后到下載器進(jìn)行下載。a.
對免費代理ip網(wǎng)站進(jìn)行抓取。b.
對代理ip進(jìn)行存儲并驗證c.
驗證通過存儲進(jìn)數(shù)據(jù)庫d.
如果滿足ip最大數(shù)量,則停止爬去,一定時間后驗證數(shù)據(jù)的ip有效性,將失效的ip刪除e.
直到數(shù)據(jù)庫ip小于0,繼續(xù)爬取ip,重復(fù)步驟a。(c)爬蟲異常狀態(tài)組件的處理沒有被屏蔽運行時,訪問網(wǎng)站不是一直都是200請求成功,而是有各種各樣的狀態(tài),像上述爬蟲被禁的時候,其實返回的狀態(tài)是302,防止屏蔽組件就是捕捉到302狀態(tài)加以實現(xiàn)的。同時異常狀態(tài)的處理有利于爬蟲的健壯性。在settings中擴(kuò)展中間件捕捉到異常的情況之后,將請求Request重新加入到待下載隊列當(dāng)中流程如下:圖5-2異常處理流程圖(d)數(shù)據(jù)存儲模塊數(shù)據(jù)存儲模塊主要負(fù)責(zé)將slave端爬取解析的頁面進(jìn)行存儲。使用Mongodb對數(shù)據(jù)進(jìn)行存儲。Scrapy支持?jǐn)?shù)據(jù)存儲的格式有json,csv和xml等文本格式,用戶可以在運行爬蟲時設(shè)置,例如:scrapycrawlspider-oitems.json-tjson,也可以在Scrapy工程文件額ItemPipline文件中定義,同時,Scrapy也支持?jǐn)?shù)據(jù)庫存儲,如Monogdb,Redis等,當(dāng)數(shù)據(jù)量大到一定程度時,可以做Mongodb或者Reids的集群來解決問題,本系統(tǒng)數(shù)據(jù)存儲如下圖所示:圖5-3數(shù)據(jù)存儲示意圖5.3數(shù)據(jù)處理5.3.1對象定義程序Item是定義抓取數(shù)據(jù)的容器。通過創(chuàng)建一個scrapy.item.Item類來聲明。定義屬性為scrapy.item.Field對象,通過將需要的item實例化,來控制獲得的站點數(shù)據(jù)。本系統(tǒng)定義了九個抓取對象,分別是:標(biāo)題,表演時間,演員名字,地址,價格,url。關(guān)鍵代碼如下:classCateyeItem(scrapy.Item):
#definethefieldsforyouritemherelike:
title=scrapy.Field()
ShowTime=scrapy.Field()
actors=scrapy.Field()
address=scrapy.Field()
price=scrapy.Field()
url=scrapy.Field()5.3.2數(shù)據(jù)處理程序Pipeline類中定義了數(shù)據(jù)的保存和輸出方法,從Spider的parse方法返回的Item,數(shù)據(jù)將對應(yīng)ITEM_PIPELINES列表中的Pipeline類處理后以頂一個格式輸出。本系統(tǒng)傳回管道的數(shù)據(jù)使用Mongodb來進(jìn)行存儲。關(guān)鍵代碼如下:defopen_spider(self,spider):
self.client=connect(host='localhost',port=3306,user='root',password='root',db='yanchu',charset='utf8')
self.cursor=self.client.cursor()
defprocess_item(self,item,spider):
args=[
item["title"],
item["ShowTime"],
item["actors"],
item["address"],
item["price"],
item["url"],
item["platform"],
]
sql='insertintot_showstartVALUE(0,%s,%s,%s,%s,%s,%s,%s)'
self.cursor.execute(sql,args)
mit()
returnitem5.3.3數(shù)據(jù)庫錄入程序數(shù)據(jù)存儲模塊主要負(fù)責(zé)將slave端爬取解析的頁面進(jìn)行存儲。使用Mongodb對數(shù)據(jù)進(jìn)行存儲。classMongoPipeline(object):
defopen_spider(self,spider):
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 四川幼兒師范高等??茖W(xué)?!洞蟮販y量學(xué)實驗》2023-2024學(xué)年第二學(xué)期期末試卷
- 晉中師范高等??茖W(xué)?!毒W(wǎng)絡(luò)及其計算》2023-2024學(xué)年第二學(xué)期期末試卷
- 福建對外經(jīng)濟(jì)貿(mào)易職業(yè)技術(shù)學(xué)院《大學(xué)生勞動教育》2023-2024學(xué)年第二學(xué)期期末試卷
- 天津藝術(shù)職業(yè)學(xué)院《文獻(xiàn)目錄與信息檢索》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025海南省安全員A證考試題庫及答案
- 貴州中醫(yī)藥大學(xué)時珍學(xué)院《安全經(jīng)濟(jì)學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 2024-2025學(xué)年遼寧省七校協(xié)作體高一上學(xué)期12月月考?xì)v史試卷
- 2025江西省建筑安全員-A證考試題庫及答案
- 漯河醫(yī)學(xué)高等??茖W(xué)?!秺W林匹克文化》2023-2024學(xué)年第二學(xué)期期末試卷
- 遼寧輕工職業(yè)學(xué)院《阿拉伯文學(xué)選讀》2023-2024學(xué)年第二學(xué)期期末試卷
- 教科版 二年級下冊科學(xué)教學(xué)計劃
- 中國膿毒癥及膿毒性休克急診治療指南
- 部編版六年級道德與法治下冊《學(xué)會反思》教案
- 人教版體育與健康四年級-《障礙跑》教學(xué)設(shè)計
- DB32-T 2860-2015散裝液體化學(xué)品槽車裝卸安全作業(yè)規(guī)范-(高清現(xiàn)行)
- 部編版四年級下冊語文教案(完整)
- T∕CIS 71001-2021 化工安全儀表系統(tǒng)安全要求規(guī)格書編制導(dǎo)則
- 福利院裝修改造工程施工組織設(shè)計(225頁)
- 環(huán)境空氣中臭氧的測定
- 第七章 化學(xué)物質(zhì)與酶的相互作用
- 機(jī)械畢業(yè)設(shè)計論文鋼筋自動折彎機(jī)的結(jié)構(gòu)設(shè)計全套圖紙
評論
0/150
提交評論