【《基于Python的分布式爬蟲(chóng)探究7800字(論文)》】_第1頁(yè)
【《基于Python的分布式爬蟲(chóng)探究7800字(論文)》】_第2頁(yè)
【《基于Python的分布式爬蟲(chóng)探究7800字(論文)》】_第3頁(yè)
【《基于Python的分布式爬蟲(chóng)探究7800字(論文)》】_第4頁(yè)
【《基于Python的分布式爬蟲(chóng)探究7800字(論文)》】_第5頁(yè)
已閱讀5頁(yè),還剩39頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

摘要在這個(gè)互聯(lián)網(wǎng)飛速發(fā)展的時(shí)代下,隨著互聯(lián)網(wǎng)服務(wù)規(guī)模的不斷增長(zhǎng)以及當(dāng)代爆發(fā)式的信息規(guī)模,與之相關(guān)的數(shù)據(jù)服務(wù)也隨其增長(zhǎng),只靠單機(jī)的集中式處理的能力是很難滿(mǎn)足當(dāng)代龐大的數(shù)據(jù)源采集需求。國(guó)內(nèi)外互聯(lián)網(wǎng)的使用人數(shù)在當(dāng)代的互聯(lián)網(wǎng)發(fā)展下只多不少,互聯(lián)網(wǎng)的數(shù)據(jù)也是隨其在不斷擴(kuò)大,單純靠以前的收集方式很難去高效的完成數(shù)據(jù)采集,那么數(shù)據(jù)的采集技術(shù)必然要隨其發(fā)展,所以在這樣的需求下便產(chǎn)生了分布式的網(wǎng)絡(luò)數(shù)據(jù)采集技術(shù),基于分布式的網(wǎng)絡(luò)爬蟲(chóng)是由多個(gè)可以并行爬取所需內(nèi)容的爬蟲(chóng)組成,這樣的系統(tǒng)兼?zhèn)淞肆己玫目蓴U(kuò)展性,這些爬蟲(chóng)在數(shù)據(jù)檢索上的優(yōu)秀表現(xiàn)也受到了人們的喜愛(ài)。在這樣的這樣的互聯(lián)網(wǎng)發(fā)展環(huán)境下,文章將根據(jù)需求,設(shè)計(jì)并實(shí)現(xiàn)一個(gè)具有針對(duì)性的簡(jiǎn)便高效的分布式網(wǎng)絡(luò)基于上述研究,本文設(shè)計(jì)并且實(shí)現(xiàn)了一個(gè)分布式結(jié)構(gòu)的爬蟲(chóng)。對(duì)現(xiàn)在流行的分布式爬蟲(chóng)的相關(guān)技術(shù)基礎(chǔ)上,對(duì)需求進(jìn)行設(shè)計(jì)和分析,結(jié)合具體的代碼展示了分布式爬蟲(chóng)的設(shè)計(jì)細(xì)節(jié),通過(guò)實(shí)驗(yàn)表明了分布式網(wǎng)絡(luò)爬蟲(chóng)在爬取龐大數(shù)據(jù)時(shí)的優(yōu)點(diǎn),并且最后進(jìn)行技術(shù)總結(jié)和展望。本文中設(shè)計(jì)并且實(shí)現(xiàn)的分布式爬蟲(chóng)系統(tǒng),充分的利用了網(wǎng)絡(luò)寬帶和計(jì)算機(jī)硬件系統(tǒng),這樣不但大大的提高了數(shù)據(jù)采集的速度,還降低了此系統(tǒng)的損耗。此外,它增強(qiáng)了系統(tǒng)的可擴(kuò)展性,可以適應(yīng)更多類(lèi)型的數(shù)據(jù)。關(guān)鍵詞:分布式爬蟲(chóng),Python,Scrapy,Redis,Mo 1 1 1 1 2 2 2 3 32.4Redis數(shù)據(jù)庫(kù) 42.5MongoDB數(shù)據(jù)庫(kù) 4第3章系統(tǒng)需求分析 53.1功能需求 53.2用例圖 53.3架構(gòu)示意圖 63.4功能架構(gòu)劃分 73.5程序流程圖 8第4章數(shù)據(jù)庫(kù)設(shè)計(jì) 94.1數(shù)據(jù)庫(kù)E-R圖 94.2數(shù)據(jù)庫(kù)表及其結(jié)構(gòu) 第5章系統(tǒng)詳細(xì)設(shè)計(jì)與實(shí)現(xiàn) 5.1爬蟲(chóng)的設(shè)計(jì)與實(shí)現(xiàn) 5.1.2爬蟲(chóng)的具體實(shí)現(xiàn) 5.2爬蟲(chóng)防屏蔽的實(shí)現(xiàn) 5.2.1偽裝瀏覽器的實(shí)現(xiàn) 5.2.2代理IP爬取的實(shí)現(xiàn) 5.3.1對(duì)象定義程序 5.3.2數(shù)據(jù)處理程序 5.3.4數(shù)據(jù)可視化程序 第6章系統(tǒng)運(yùn)行 第7章系統(tǒng)測(cè)試 7.1測(cè)試簡(jiǎn)介 207.2測(cè)試結(jié)果 1第1章緒論1.1系統(tǒng)研究背景及意義1.1.1系統(tǒng)研究背景這幾年,中國(guó)互聯(lián)網(wǎng)的發(fā)展?fàn)顟B(tài)已經(jīng)到了穩(wěn)中求快階段,互聯(lián)網(wǎng)已經(jīng)全面參與了我們生活的方方面面,在很多地方互聯(lián)網(wǎng)已經(jīng)給我們生活與工作帶來(lái)了很多便利與高效?,F(xiàn)在的互聯(lián)網(wǎng)發(fā)展給我們的社會(huì)的發(fā)展帶來(lái)了極大推動(dòng)力、極大的改善了人民生活的方式,爆發(fā)式增長(zhǎng)的網(wǎng)民數(shù)量給大數(shù)據(jù)的發(fā)展帶來(lái)了空前絕后的機(jī)遇。如果想要更好地解決這個(gè)需求矛盾,就要以解決怎樣從越來(lái)越龐大的數(shù)據(jù)海洋里面極快的速度、極高的效率和安全性中找到用戶(hù)所需數(shù)據(jù)成為了數(shù)據(jù)收集引擎的主要實(shí)現(xiàn)的目標(biāo)。在不斷龐大的數(shù)據(jù)源的現(xiàn)狀下,想解決數(shù)據(jù)挖掘問(wèn)題,單方面的依賴(lài)單機(jī)處理是幾乎不可能去完成的,即使是把單機(jī)的硬件水平提高到一定的檔次,也不可能追趕的上信息發(fā)展的速度。經(jīng)過(guò)很多專(zhuān)家日日夜夜的苦心鉆研,他們提出了一種新的數(shù)據(jù)檢索技術(shù),那就是分布式檢索技術(shù)。這個(gè)新技術(shù)發(fā)布之后,許多業(yè)內(nèi)人士對(duì)這個(gè)持有高度關(guān)注,現(xiàn)在幾乎所以的搜索引擎都采用了這個(gè)技術(shù),就比如著名的搜索引擎:“Google”和“百度”,這些搜索引擎采用的就是這種新的數(shù)據(jù)檢索技術(shù),采用分布式的爬蟲(chóng)的技術(shù)方式來(lái)實(shí)現(xiàn)增強(qiáng)數(shù)據(jù)檢索的效率。分布式爬蟲(chóng)系統(tǒng)采用分布式數(shù)據(jù)采集技術(shù),基于分布式網(wǎng)絡(luò)爬蟲(chóng),連接的多臺(tái)機(jī)器,并行爬取所需內(nèi)容,通過(guò)中心節(jié)點(diǎn)協(xié)調(diào),解決龐大的數(shù)據(jù)采集、存儲(chǔ)和處理的問(wèn)題。1.1.2系統(tǒng)開(kāi)發(fā)意義隨著大數(shù)據(jù)時(shí)代的到來(lái),如何采集龐大的數(shù)據(jù)庫(kù)也是目前難題之一,這個(gè)時(shí)候網(wǎng)絡(luò)爬蟲(chóng)就變成了一個(gè)必不可少的東西,其中爬蟲(chóng)又分為單機(jī)爬蟲(chóng)和分布式爬蟲(chóng)。分布式爬蟲(chóng)是在多臺(tái)機(jī)器上運(yùn)行爬蟲(chóng)程序,重點(diǎn)是聯(lián)合采集數(shù)據(jù)。在多個(gè)服務(wù)器上能夠協(xié)同采集的就是分布式的,分布式實(shí)現(xiàn)了多臺(tái)主機(jī)使用一個(gè)共同的爬蟲(chóng)程序,可以在多臺(tái)電腦上運(yùn)行,這樣的話(huà)可以提高爬蟲(chóng)效率。像是采集非常大量的數(shù)據(jù),多線(xiàn)程爬蟲(chóng)是很難做到高效的,所以研究分布式爬蟲(chóng)是這個(gè)大數(shù)據(jù)時(shí)代所必須的。無(wú)論是單機(jī)或者是多臺(tái)主機(jī),分布式爬蟲(chóng)都對(duì)計(jì)算機(jī)的性能有一定的要求,首先是處理器,其次是網(wǎng)絡(luò),分布式爬蟲(chóng)的效率會(huì)受這些的影響,如果硬件設(shè)施無(wú)法達(dá)到要求甚至不如單機(jī)爬蟲(chóng)。分布式爬蟲(chóng)本質(zhì)上就是將程序的運(yùn)行從一臺(tái)機(jī)器擴(kuò)展到多臺(tái)機(jī)器,21.2研究方向與內(nèi)容本文結(jié)合實(shí)際的系統(tǒng)需求,基于Python語(yǔ)言和Hadoop分布式框架,設(shè)計(jì)并且(1)上網(wǎng)查閱學(xué)習(xí)現(xiàn)在較為常用的分布式爬蟲(chóng)系統(tǒng)的模型,在學(xué)習(xí)和實(shí)操(2)主要去學(xué)習(xí)與分布式爬蟲(chóng)相關(guān)的理論知識(shí)和模型,對(duì)秀動(dòng)網(wǎng)的字段進(jìn)行具(3)細(xì)化分布式爬蟲(chóng)系統(tǒng)設(shè)計(jì)的結(jié)構(gòu)重點(diǎn),通過(guò)編寫(xiě)代碼具體實(shí)現(xiàn)一個(gè)分布式(4)將本文的分布式爬蟲(chóng)系統(tǒng)應(yīng)用于實(shí)戰(zhàn)環(huán)境,對(duì)其爬取的效率和穩(wěn)定性進(jìn)行測(cè)第2章相關(guān)工具和理論介紹Python是一種簡(jiǎn)單易學(xué)的編程語(yǔ)言。如果你嘗試去閱讀一個(gè)已經(jīng)編譯好的優(yōu)秀的現(xiàn)需求解決問(wèn)題而不是去把語(yǔ)言本身搞明白。Python對(duì)新手及其友好且易上手,因?yàn)楹烷喿x的過(guò)程非常愉快,但Python是用c語(yǔ)言來(lái)編寫(xiě)的底層,所以現(xiàn)在大多數(shù)的標(biāo)準(zhǔn)庫(kù)和第三方庫(kù)基本上也都是通過(guò)c語(yǔ)言來(lái)編寫(xiě)的,用Python編寫(xiě)好的程序運(yùn)行的效率3Hadoop是由ApacheFoundation開(kāi)發(fā)的分布式系統(tǒng)框架。使用者可以在對(duì)底層的具行高效的運(yùn)算和數(shù)據(jù)存儲(chǔ)。Hadoop能夠?qū)崿F(xiàn)一個(gè)分布就是HDFS。容錯(cuò)性高是HDFS的一個(gè)重要特點(diǎn),設(shè)計(jì)可以在比較落后的硬件上部署;Scrapy的整體架構(gòu)大致如下(圖片來(lái)源網(wǎng)絡(luò)):圖2-1Scrapy整體架構(gòu)圖4ScrapyEngine(引擎):是整個(gè)框架非常重要的核心,處理系統(tǒng)的數(shù)據(jù)流,完成各個(gè)部分的通信。Scheduler(調(diào)度器):作為調(diào)度器,它主要功能是接受引擎發(fā)送過(guò)的請(qǐng)求,把這些請(qǐng)求進(jìn)行一定的排列和整理,按照順序?qū)φ?qǐng)求進(jìn)行調(diào)度。Downloader(下載器):下載器是接收引擎發(fā)送過(guò)來(lái)的下載請(qǐng)求,然后去網(wǎng)頁(yè)上面把需求的數(shù)據(jù)下載下來(lái),之后返回到引擎當(dāng)中。Spider(爬蟲(chóng)):爬蟲(chóng)把爬取的鏈接發(fā)送給引擎,引擎通過(guò)其他模塊返回的數(shù)據(jù)交給爬蟲(chóng),然后解析這些返回的數(shù)據(jù)。ItemPipeline(管道):管道就是能夠把爬蟲(chóng)發(fā)送的數(shù)據(jù)進(jìn)行保存DownloaderMiddlewares(下載中間件):這個(gè)主要就是一個(gè)擴(kuò)展的中間件,主要影響的是下載器和引擎之間的通信功能。SpiderMiddlewares(Spider中間件):與下載中間件類(lèi)似,也是擴(kuò)展爬蟲(chóng)和引擎兩者通信的中間件。Redis是一個(gè)完全開(kāi)源的數(shù)據(jù)庫(kù),性能極高的key-value數(shù)據(jù)庫(kù),Redis數(shù)據(jù)庫(kù)支持?jǐn)?shù)據(jù)的長(zhǎng)久保存,它能夠把保存在內(nèi)存里面的數(shù)據(jù)轉(zhuǎn)存在硬盤(pán)當(dāng)中,哪怕電腦重啟之后也可以訪(fǎng)問(wèn),而且Redis數(shù)據(jù)庫(kù)還支持多種類(lèi)型的數(shù)據(jù),可以以不同的數(shù)據(jù)結(jié)構(gòu)進(jìn)行存儲(chǔ)。它還能夠?qū)?shù)據(jù)進(jìn)行備份保存。Redis的優(yōu)點(diǎn)包括它具有極高的讀寫(xiě)速度,具備非常豐富的數(shù)據(jù)類(lèi)型操作,Redis還具備原子性,什么是原子性呢,簡(jiǎn)單來(lái)說(shuō)就是執(zhí)行成功或者失敗完全不執(zhí)行。MongoDB是一個(gè)基于分布式的數(shù)據(jù)庫(kù)系統(tǒng)。底層是由C++編寫(xiě)。它主要是為WEB應(yīng)用程序提供可伸縮的高性能數(shù)據(jù)存儲(chǔ)解決方案。MongoDB數(shù)據(jù)庫(kù)是主要面向文檔類(lèi)型的存儲(chǔ),操作簡(jiǎn)便易行,可以設(shè)置任何屬性的索引來(lái)做到很快的進(jìn)行排序,還可以利用創(chuàng)建鏡像來(lái)增強(qiáng)其拓展性,如果在高負(fù)載的情況下,它可以做到利用分布式來(lái)處理數(shù)據(jù),通過(guò)不同的節(jié)點(diǎn)。其可利用JSON標(biāo)記的形式的查詢(xún)指令輕松查詢(xún)對(duì)象和數(shù)組。MongoDB還支持很多編程語(yǔ)言,比如Python,Java,C++等各種類(lèi)型的語(yǔ)言。其中它的Map函數(shù)是通過(guò)調(diào)用二叉樹(shù)來(lái)遍歷集合中的數(shù)5第3章系統(tǒng)需求分析3.1功能需求需要去解決的問(wèn)題,基于這個(gè)需求我設(shè)計(jì)了該項(xiàng)目3.2用例圖O退出系統(tǒng)圖3-2爬蟲(chóng)用例圖中間代理層中間代理層因特網(wǎng)pongoDBpongoDB圖3-3架構(gòu)示意圖67爬蟲(chóng)功能的功能需求主要在對(duì)于字段的爬取,對(duì)網(wǎng)站反爬的處理,內(nèi)容的保存和處理。這就要求爬蟲(chóng)能夠滿(mǎn)足對(duì)于網(wǎng)站各種信息的曬別,提取,能夠應(yīng)對(duì)網(wǎng)站的反爬,以及對(duì)爬取出來(lái)的內(nèi)容進(jìn)行收集和處理。系統(tǒng)功能架構(gòu)如下圖所示:爬蟲(chóng)下載異常處理爬取策略設(shè)計(jì)爬取內(nèi)容存儲(chǔ)爬取字段設(shè)計(jì)反反爬處理增量與去重字段提取從初始頁(yè)面開(kāi)是否匹配爬取內(nèi)容是否有下一頁(yè)鏈接是否匹配爬取內(nèi)容隊(duì)列起取列表是否為空89第4章數(shù)據(jù)庫(kù)設(shè)計(jì)4.1數(shù)據(jù)庫(kù)E-R圖系統(tǒng)采用的是MonggoDB數(shù)據(jù)庫(kù),從需求的分析上找出實(shí)體,實(shí)體和屬性聯(lián)系通過(guò)E-RE-R圖表展示,通過(guò)優(yōu)化后得到具體模型,系統(tǒng)的E-R圖如下圖所示:圖4-1數(shù)據(jù)庫(kù)E-R圖4.2數(shù)據(jù)庫(kù)表及其結(jié)構(gòu)該表主要是以主要爬取字段為目標(biāo),由Slave服務(wù)器端解析爬取字段數(shù)據(jù),所以數(shù)據(jù)庫(kù)表的內(nèi)容必須符合抓取內(nèi)容。以秀動(dòng)網(wǎng)演唱會(huì)數(shù)據(jù)為主,通過(guò)分析內(nèi)部結(jié)構(gòu),內(nèi)容字段如下表所示:1平臺(tái)23表演時(shí)間4明星名字567頁(yè)面地址第5章系統(tǒng)詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)該系統(tǒng)主要以爬取秀動(dòng)演唱會(huì)網(wǎng)頁(yè)內(nèi)容為主來(lái)設(shè)計(jì)爬蟲(chóng),重點(diǎn)考慮爬取策略的設(shè)計(jì),數(shù)據(jù)的抓取、去重和增量功能的實(shí)現(xiàn)、爬蟲(chóng)防屏在Scrapy的結(jié)構(gòu)里面,爬蟲(chóng)是從我們?cè)O(shè)置的初始的URL來(lái)開(kāi)始數(shù)據(jù)爬取,爬蟲(chóng)從需要爬取的URL,并把這些地址存入接下來(lái)需要爬取的隊(duì)列中。在對(duì)爬取的內(nèi)容進(jìn)行去重并且進(jìn)行排序之后,等待調(diào)度器對(duì)其進(jìn)行調(diào)度。在這個(gè)爬蟲(chóng)系統(tǒng)中,爬取下來(lái)的URL可以分為兩種,一種是下標(biāo)頁(yè)碼的鏈接,也就是我們?cè)诰W(wǎng)站里面看到的下一頁(yè)的allowed_domains=['showsredis_key='xiudong:start_ur#foriinrange(1,90):#start_urls.append('/event/list?cityId=0No=%s'%(i)#初始URLbase_url='/event/list?cityId=0&siteld=defparse(self,response):urls=response.xpath('//ul[@class="g-list-wrapjustifyMT30"]/li/a/@href).extract()names=response.xpath(//ul[@class="g-list-wrapjustifyyieldscrapy.Request(url=j,callback=self.handle)ifself.index<100:yieldscrapy.Request(self.base_url.format(self.index),callback=self.parse)self.index=self.index這個(gè)部分就是對(duì)于我們初始鏈接開(kāi)始爬取的相關(guān)策略,采用的模式是分布式的主從模式,就是把Master端爬取下來(lái)的相關(guān)詳情頁(yè)面的URL,存儲(chǔ)在Redis當(dāng)中,并且把這些需要爬取的地址發(fā)送給Slave端的爬蟲(chóng)進(jìn)行爬取。5.1.2爬蟲(chóng)的具體實(shí)現(xiàn)關(guān)于爬蟲(chóng)系統(tǒng)相關(guān)的功能的具體實(shí)現(xiàn),包括了四個(gè)基本功能的實(shí)現(xiàn),分別是數(shù)據(jù)抓取,數(shù)據(jù)存儲(chǔ),相關(guān)對(duì)象的定義以及內(nèi)容下載。先從數(shù)據(jù)抓取來(lái)說(shuō),數(shù)據(jù)抓取我分為兩個(gè)部分,其中先是Master端的抓取程序,Master端主要是爬取所需的相關(guān)頁(yè)面的URL,并且把這些地址存入Redis中,Slave端從Redis中獲取地址并且按順序?qū)@些網(wǎng)頁(yè)進(jìn)行抓取,抓取的字段的規(guī)則和Xpath提取字段的方法等都在程序中做了定義,所以爬蟲(chóng)能夠?qū)⒃敿?xì)頁(yè)面中需求的數(shù)據(jù)爬取下來(lái),在Xpath中包括了多種類(lèi)型,分別是元素、文本、屬性、命名空間、處理指令和文檔節(jié)點(diǎn),其中把網(wǎng)頁(yè)文檔當(dāng)作節(jié)點(diǎn)樹(shù),通過(guò)Xpath當(dāng)中的正則表達(dá)式來(lái)對(duì)目標(biāo)節(jié)點(diǎn)進(jìn)行定位就可以抽取頁(yè)面的具體字段。獨(dú)家【秀動(dòng)呈獻(xiàn)】天聲樂(lè)隊(duì)[感官五部曲]-1rcdivclass="auto-widthclea?ahref="httos://52.sh「盲」巡演杭州站55992.0xe.ieg"class="posters-fancybox11場(chǎng)地:杭州杭州MAOLivehouse地址:浙江省杭州市上城區(qū)中山南路77號(hào)尚MAOLiveHouse杭州查看地圖<spanclass="sole"><divclass="goods-type">_</divXpath抽取方法詳細(xì)代碼如下:title=response.xpathC/h1[@class="goods-name"]/text(').extract)[-1].replace('\t',"info=response.xpath('//ul[@class="items-list"]/li/texShowTime=info[0].replace('\t',").repactors=response.xpath(//ul[@class="items-list"]/li[2]/a/text(')response.xpath(//ul[@class="items-list"]/li[4]/text()').extract([0].replace(\t',").repprice=response.xpath('//span[@class="price"]/text()').extract()[0]5.1.3去重與增量爬取(1)獲取Redis里面的等待爬取的隊(duì)列中的URL(2)判斷請(qǐng)求的URL是否已經(jīng)在已爬取的隊(duì)列當(dāng)中,如果不在則進(jìn)行爬取,如果NEWSPIDER_MODULE='CatEye.spider#Crawlresponsiblybyidentifyingyourself(andyourwebsite)ontheuser-agentUSER_AGENT='Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/88.0.4324.190REDIS_HOST=''#根據(jù)自己的ip進(jìn)行更改DUPEFILTER_CLASS="scrapy_redis.dupefilter.RFPSCHEDULER="scrapy_redis'scrapy_redis.pipelines.Redis5.2爬蟲(chóng)防屏蔽的實(shí)現(xiàn)我們正常訪(fǎng)問(wèn)一個(gè)網(wǎng)頁(yè)的時(shí)候,不會(huì)對(duì)網(wǎng)頁(yè)產(chǎn)生什么影響,因?yàn)槲覀冊(cè)L問(wèn)的速度和次數(shù)不是很多,處于一個(gè)服務(wù)器正常的接受范圍內(nèi)。但是,我們?nèi)绻褂门老x(chóng)去訪(fǎng)問(wèn)網(wǎng)站可能會(huì)因?yàn)樗俣冗^(guò)快和訪(fǎng)問(wèn)次數(shù)過(guò)多導(dǎo)致網(wǎng)站的服務(wù)器負(fù)載過(guò)大,從另一方面來(lái)說(shuō),網(wǎng)站的管理員有時(shí)候并不想因?yàn)榕老x(chóng)增加服務(wù)器的負(fù)載,也不想讓自己網(wǎng)站的數(shù)據(jù)被大規(guī)模的爬取,所以為了保障服務(wù)器狀態(tài)正常能夠讓普通的用戶(hù)訪(fǎng)問(wèn)且不會(huì)導(dǎo)致自己網(wǎng)站的數(shù)據(jù)被大規(guī)模爬取,許多網(wǎng)站為了應(yīng)對(duì)爬蟲(chóng)寫(xiě)了相關(guān)的反爬策略。如果你使用爬蟲(chóng)爬取對(duì)方網(wǎng)站的內(nèi)容的時(shí)候觸發(fā)了這個(gè)網(wǎng)站的反爬程序,普通情況下可能會(huì)激活一些機(jī)器人檢測(cè)程序由此過(guò)濾掉你的那些爬蟲(chóng),讓你的爬蟲(chóng)無(wú)法工作,更嚴(yán)重的會(huì)直接封鎖你的IP地址讓你永遠(yuǎn)無(wú)法使用這個(gè)IP訪(fǎng)問(wèn)這個(gè)網(wǎng)站,所以我們的爬蟲(chóng)就要模仿普通用戶(hù)來(lái)訪(fǎng)問(wèn)這個(gè)網(wǎng)站,以此來(lái)繞過(guò)這個(gè)網(wǎng)站的檢測(cè)程序,所以如果不加思索的暴力爬取網(wǎng)頁(yè)可能會(huì)讓你的數(shù)據(jù)挖掘過(guò)程舉步維艱,所以我們就要對(duì)自己的爬蟲(chóng)進(jìn)行偽裝,繞開(kāi)屏蔽程本文的爬蟲(chóng)系統(tǒng)使用的是以下反反爬策略:1.通過(guò)模擬偽裝成不同的瀏覽器模式來(lái)訪(fǎng)問(wèn)網(wǎng)站2.設(shè)置IP池,并以IP池里面的IP更換爬蟲(chóng)訪(fǎng)問(wèn)時(shí)的IP3.通過(guò)調(diào)節(jié)爬蟲(chóng)爬取的速率來(lái)降低反爬程序檢測(cè)到的可能性。5.2.1偽裝瀏覽器的實(shí)現(xiàn)利用Scrapy框架中下載中間件的模塊可以自定義的特點(diǎn),對(duì)我們請(qǐng)求的屬性進(jìn)行修改來(lái)實(shí)現(xiàn)偽裝首先就要在setting.py中添加中間件模塊,之后就是對(duì)中間件進(jìn)行拓展的,通過(guò)制作一個(gè)useragent列表,將我們需要修改的瀏覽器請(qǐng)求寫(xiě)入列表并進(jìn)行保存#Crawlresponsiblybyidentifyingyourself(andyourwebsite)ontheusUSER_AGENT='Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/88.0.4324.190Safari/537.36'請(qǐng)求列表中任意的一個(gè)agent值,之后便使用這個(gè)值來(lái)下載內(nèi)容。每次爬取內(nèi)容時(shí)都會(huì)模擬不同的瀏覽器模式來(lái)進(jìn)行訪(fǎng)問(wèn)。settings.py里面對(duì)中間件進(jìn)行設(shè)置,之后擴(kuò)展組件設(shè)置對(duì)請(qǐng)求的頭文件從IP池中隨機(jī)選取一個(gè)IP作為訪(fǎng)問(wèn)的代理IP,之后下載器便使用這個(gè)來(lái)進(jìn)行下載。爬蟲(chóng)的異常處理是爬蟲(chóng)系統(tǒng)正常運(yùn)行的保障,在沒(méi)有被網(wǎng)站爬蟲(chóng)系統(tǒng)擁有健壯性的關(guān)鍵。在settings.py中我們所拓展的中間件捕捉到了爬蟲(chóng)運(yùn)行的異常狀態(tài)之后,將請(qǐng)求Request重新加入到待下載隊(duì)列當(dāng)中流程如下:圖5-2異常處理流程圖數(shù)據(jù)存儲(chǔ)模塊的實(shí)現(xiàn)主要是通過(guò)Slave端將爬蟲(chóng)爬取出來(lái)的數(shù)據(jù)進(jìn)行存儲(chǔ),其中所使用到的數(shù)據(jù)庫(kù)是MongoDB。Scrapy擁有很多種數(shù)據(jù)存儲(chǔ)的格式,比如json,csv和xml等文本格式,使用者需要對(duì)爬蟲(chóng)進(jìn)行設(shè)置。需要在Scrapy工程文件中的ItemPipline.py中對(duì)文本格式進(jìn)行設(shè)置,同時(shí),Scrapy也支持?jǐn)?shù)據(jù)庫(kù)存儲(chǔ),如MonogDB和Redis等,當(dāng)爬取非常龐大的數(shù)據(jù)的時(shí)候,也可以通過(guò)數(shù)據(jù)庫(kù)的集群來(lái)解決問(wèn)題。本文系統(tǒng)的數(shù)據(jù)存儲(chǔ)流程如下圖:爬蟲(chóng)下載提取數(shù)據(jù)5.3.1對(duì)象定義程序數(shù)據(jù)存儲(chǔ)需要一個(gè)定義采集數(shù)據(jù)的容器,本系統(tǒng)使用的是Item。系統(tǒng)聲明對(duì)象是通定義與之相關(guān)的對(duì)象,來(lái)控制從網(wǎng)頁(yè)中獲得的數(shù)據(jù)。本文中的系統(tǒng)分別定義了九個(gè)抓取對(duì)象,分別是:標(biāo)題,表演時(shí)間,演員名字,地址,價(jià)格,url。關(guān)鍵代碼如下:actors=scrapy.5.3.2數(shù)據(jù)處理程序爬取下來(lái)的數(shù)據(jù)需要使用Pipeline這個(gè)類(lèi)來(lái)實(shí)現(xiàn),這個(gè)類(lèi)定義了爬取數(shù)據(jù)輸出和保存的方法,用爬蟲(chóng)的Parse的方法把數(shù)據(jù)返回到Item,把與列表對(duì)應(yīng)的Pipeline類(lèi)進(jìn)行處理之后輸出,關(guān)鍵代碼如下:defopen_spider(self,spider):connect(host='localhost',port=3306,user='root',password='root',db='yanchu'defprocess_item(self,item,spider):]sql='insertintot_showstart數(shù)據(jù)存儲(chǔ)模塊主要負(fù)責(zé)將slave端爬取解析的頁(yè)面進(jìn)行存儲(chǔ)。使用Mongodb對(duì)數(shù)據(jù)defopen_spider(self,spider):defprocess_item(self,item,spider):self.client.yanchanghui.xiudefclose_spider(self,spider):數(shù)據(jù)庫(kù)實(shí)現(xiàn)界面:DocumentsAaaregationsSchemaExplainPlan數(shù)據(jù)可視化是一種利于人們閱讀的一種數(shù)據(jù)轉(zhuǎn)換模式,本文的系統(tǒng)通過(guò)使用MongoDB數(shù)據(jù)庫(kù)來(lái)保存數(shù)據(jù)。然后利用Matplotlib把數(shù)據(jù)進(jìn)行可視化的處理,Matplotlib其實(shí)是一個(gè)通過(guò)Python來(lái)開(kāi)發(fā)的二維數(shù)據(jù)繪圖庫(kù)。效果如下圖所示:圖5-5可視化實(shí)現(xiàn)圖nevent04月17日event04月22日event04月16日喜客賬國(guó)hips初相遇西安市碼林區(qū)王府井百貨南門(mén)店04月17日情定event04月24日event04月18日?qǐng)D5-6可視化實(shí)現(xiàn)圖第6章系統(tǒng)運(yùn)行Slave1端運(yùn)行截圖:(referer:/event/list?cityId-06siteId-06isL22:00°,actors':'THEONE玩兒樂(lè)隊(duì),address':‘地址:包河區(qū)寧國(guó)南路與水陽(yáng)江路交口垂街二期15號(hào)樓安微原創(chuàng)音樂(lè)基地3樓場(chǎng)地聯(lián)系電話(huà):153-0560-8564,'price':'80','url:'https://Mwactors':‘新生樂(lè)團(tuán)(NCO),'address':‘地址:天河區(qū)天河路228號(hào)正佳廣場(chǎng)七樓正佳演藝劇院正佳演藝劇院','price':'520','url':'/event2021-04-2400:13:01[scrapy.core.engine]DEBUG:Crawled(200)<GET/event/137284>(referer:/event/list?cityId=0SsiteId=06isLis2021-04-2400:13:09[scrapy.core.engine]DEBUG:Crawled(200)<GEThttps:/(referer:/event/list?cityId=0SsiteId-0sis2021-04-2400:13:05[scrapy.core.scraper]DEBUG:Scrapedfrom<200https:/M/e日19:30-20:30°,'actors':‘待定,address':‘地址:北京市朝陽(yáng)區(qū)安立路28號(hào)院3號(hào)樓華創(chuàng)生活廣場(chǎng)一層元影城(安2021-04-2400:12:57[scrapy.core.engine]DEBUG:Crawled(200)<GEThttps://M/e(referer:/event/list?cityId=0SsiteId=05is(referer:/event/list?cityId=05siteId=05isDuruIns,vaueETrOT:unsupp

溫馨提示

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

評(píng)論

0/150

提交評(píng)論