




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
基于Python的分布式爬蟲研究摘要在這個(gè)互聯(lián)網(wǎng)飛速發(fā)展的時(shí)代下,隨著互聯(lián)網(wǎng)服務(wù)規(guī)模的不斷增長以及當(dāng)代爆發(fā)式的信息規(guī)模,與之相關(guān)的數(shù)據(jù)服務(wù)也隨其增長,只靠單機(jī)的集中式處理的能力是很難滿足當(dāng)代龐大的數(shù)據(jù)源采集需求。國內(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ò)爬蟲是由多個(gè)可以并行爬取所需內(nèi)容的爬蟲組成,這樣的系統(tǒng)兼?zhèn)淞肆己玫目蓴U(kuò)展性,這些爬蟲在數(shù)據(jù)檢索上的優(yōu)秀表現(xiàn)也受到了人們的喜愛。在這樣的這樣的互聯(lián)網(wǎng)發(fā)展環(huán)境下,文章將根據(jù)需求,設(shè)計(jì)并實(shí)現(xiàn)一個(gè)具有針對(duì)性的簡便高效的分布式網(wǎng)絡(luò)爬蟲?;谏鲜鲅芯浚疚脑O(shè)計(jì)并且實(shí)現(xiàn)了一個(gè)分布式結(jié)構(gòu)的爬蟲。對(duì)現(xiàn)在流行的分布式爬蟲的相關(guān)技術(shù)基礎(chǔ)上,對(duì)需求進(jìn)行設(shè)計(jì)和分析,結(jié)合具體的代碼展示了分布式爬蟲的設(shè)計(jì)細(xì)節(jié),通過實(shí)驗(yàn)表明了分布式網(wǎng)絡(luò)爬蟲在爬取龐大數(shù)據(jù)時(shí)的優(yōu)點(diǎn),并且最后進(jìn)行技術(shù)總結(jié)和展望。本文中設(shè)計(jì)并且實(shí)現(xiàn)的分布式爬蟲系統(tǒng),充分的利用了網(wǎng)絡(luò)寬帶和計(jì)算機(jī)硬件系統(tǒng),這樣不但大大的提高了數(shù)據(jù)采集的速度,還降低了此系統(tǒng)的損耗。此外,它增強(qiáng)了系統(tǒng)的可擴(kuò)展性,可以適應(yīng)更多類型的數(shù)據(jù)。關(guān)鍵詞:分布式爬蟲,Python,Scrapy,Redis,MongoDB 目錄TOC\o"1-3"\h\u25201第1章緒論 I第1章緒論1.1系統(tǒng)研究背景及意義1.1.1系統(tǒng)研究背景這幾年,中國互聯(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)給我們生活與工作帶來了很多便利與高效?,F(xiàn)在的互聯(lián)網(wǎng)發(fā)展給我們的社會(huì)的發(fā)展帶來了極大推動(dòng)力、極大的改善了人民生活的方式,爆發(fā)式增長的網(wǎng)民數(shù)量給大數(shù)據(jù)的發(fā)展帶來了空前絕后的機(jī)遇。如果想要更好地解決這個(gè)需求矛盾,就要以解決怎樣從越來越龐大的數(shù)據(jù)海洋里面極快的速度、極高的效率和安全性中找到用戶所需數(shù)據(jù)成為了數(shù)據(jù)收集引擎的主要實(shí)現(xiàn)的目標(biāo)。在不斷龐大的數(shù)據(jù)源的現(xiàn)狀下,想解決數(shù)據(jù)挖掘問題,單方面的依賴單機(jī)處理是幾乎不可能去完成的,即使是把單機(jī)的硬件水平提高到一定的檔次,也不可能追趕的上信息發(fā)展的速度。經(jīng)過很多專家日日夜夜的苦心鉆研,他們提出了一種新的數(shù)據(jù)檢索技術(shù),那就是分布式檢索技術(shù)。這個(gè)新技術(shù)發(fā)布之后,許多業(yè)內(nèi)人士對(duì)這個(gè)持有高度關(guān)注,現(xiàn)在幾乎所以的搜索引擎都采用了這個(gè)技術(shù),就比如著名的搜索引擎:“Google”和“百度”,這些搜索引擎采用的就是這種新的數(shù)據(jù)檢索技術(shù),采用分布式的爬蟲的技術(shù)方式來實(shí)現(xiàn)增強(qiáng)數(shù)據(jù)檢索的效率。分布式爬蟲系統(tǒng)采用分布式數(shù)據(jù)采集技術(shù),基于分布式網(wǎng)絡(luò)爬蟲,連接的多臺(tái)機(jī)器,并行爬取所需內(nèi)容,通過中心節(jié)點(diǎn)協(xié)調(diào),解決龐大的數(shù)據(jù)采集、存儲(chǔ)和處理的問題。1.1.2系統(tǒng)開發(fā)意義隨著大數(shù)據(jù)時(shí)代的到來,如何采集龐大的數(shù)據(jù)庫也是目前難題之一,這個(gè)時(shí)候網(wǎng)絡(luò)爬蟲就變成了一個(gè)必不可少的東西,其中爬蟲又分為單機(jī)爬蟲和分布式爬蟲。分布式爬蟲是在多臺(tái)機(jī)器上運(yùn)行爬蟲程序,重點(diǎn)是聯(lián)合采集數(shù)據(jù)。在多個(gè)服務(wù)器上能夠協(xié)同采集的就是分布式的,分布式實(shí)現(xiàn)了多臺(tái)主機(jī)使用一個(gè)共同的爬蟲程序,可以在多臺(tái)電腦上運(yùn)行,這樣的話可以提高爬蟲效率。像是采集非常大量的數(shù)據(jù),多線程爬蟲是很難做到高效的,所以研究分布式爬蟲是這個(gè)大數(shù)據(jù)時(shí)代所必須的。無論是單機(jī)或者是多臺(tái)主機(jī),分布式爬蟲都對(duì)計(jì)算機(jī)的性能有一定的要求,首先是處理器,其次是網(wǎng)絡(luò),分布式爬蟲的效率會(huì)受這些的影響,如果硬件設(shè)施無法達(dá)到要求甚至不如單機(jī)爬蟲。分布式爬蟲本質(zhì)上就是將程序的運(yùn)行從一臺(tái)機(jī)器擴(kuò)展到多臺(tái)機(jī)器,加快運(yùn)行速率。1.2研究方向與內(nèi)容 本文結(jié)合實(shí)際的系統(tǒng)需求,基于Python語言和Hadoop分布式框架,設(shè)計(jì)并且實(shí)現(xiàn)分布式爬蟲系統(tǒng),完成對(duì)秀動(dòng)網(wǎng)的內(nèi)容字段爬取、存儲(chǔ)和處理,研究方向以及內(nèi)容主要包括以下方面: (1)上網(wǎng)查閱學(xué)習(xí)現(xiàn)在較為常用的分布式爬蟲系統(tǒng)的模型,在學(xué)習(xí)和實(shí)操的過程中積累相關(guān)語言開發(fā)經(jīng)驗(yàn)和分布式框架的使用方法,為系統(tǒng)的開發(fā)打下實(shí)戰(zhàn)和理論的基礎(chǔ)。 (2)主要去學(xué)習(xí)與分布式爬蟲相關(guān)的理論知識(shí)和模型,對(duì)秀動(dòng)網(wǎng)的字段進(jìn)行具體分析,以便于系統(tǒng)需求的具體實(shí)現(xiàn),根據(jù)分布式爬蟲的特點(diǎn),分析其所需的結(jié)構(gòu)、框架、數(shù)據(jù)的具體結(jié)構(gòu)以及一些異常狀態(tài)的處理方式。 (3)細(xì)化分布式爬蟲系統(tǒng)設(shè)計(jì)的結(jié)構(gòu)重點(diǎn),通過編寫代碼具體實(shí)現(xiàn)一個(gè)分布式的爬蟲系統(tǒng),從字段解析和線程的控制方面進(jìn)行解釋,保障系統(tǒng)能夠正常的爬取用戶所需要的內(nèi)容。(4)將本文的分布式爬蟲系統(tǒng)應(yīng)用于實(shí)戰(zhàn)環(huán)境,對(duì)其爬取的效率和穩(wěn)定性進(jìn)行測(cè)試,分析其爬取字段的具體效果,提出對(duì)此系統(tǒng)的改進(jìn)意見。相關(guān)工具和理論介紹2.1Python概述Python是一種簡單易學(xué)的編程語言。如果你嘗試去閱讀一個(gè)已經(jīng)編譯好的優(yōu)秀的Python程序就像是在閱讀一篇通俗易懂的英文文章一樣簡單。它主要的重點(diǎn)是去具體實(shí)現(xiàn)需求解決問題而不是去把語言本身搞明白。Python對(duì)新手及其友好且易上手,因?yàn)镻ython本身具有它自帶的編譯說明書。它的風(fēng)格清晰劃一并且強(qiáng)制縮進(jìn),這讓整個(gè)編寫和閱讀的過程非常愉快,但Python是用c語言來編寫的底層,所以現(xiàn)在大多數(shù)的標(biāo)準(zhǔn)庫和第三方庫基本上也都是通過c語言來編寫的,用Python編寫好的程序運(yùn)行的效率非常高。Python是一個(gè)既支持面向過程也支持面向?qū)ο蟮木幊陶Z言。在面向過程的編程語言中,是用可重用代碼的函數(shù)來構(gòu)建程序的。在面向?qū)ο蟮木幊陶Z言中,是用數(shù)據(jù)和功能組合起來的對(duì)象來構(gòu)建程序的。Python一個(gè)面向?qū)ο蟮木幊陶Z言。它的字符串、模塊、數(shù)字等都是對(duì)象。而且還支持繼承、重載、派生、多繼承。這樣能夠加強(qiáng)源代碼的復(fù)用性。Python語言是能夠支持重載運(yùn)算符和動(dòng)態(tài)類型的。但是對(duì)比類似于Lisp這種比較傳統(tǒng)的編程語言,Python只能夠很有限的去支持函數(shù)式的設(shè)計(jì)。2.2Hadoop概述Hadoop是由ApacheFoundation開發(fā)的分布式系統(tǒng)框架。使用者可以在對(duì)底層的具體細(xì)節(jié)不了解的情況下,去編寫分布式程序。Hadoop可以對(duì)集群進(jìn)行充分的利用來進(jìn)行高效的運(yùn)算和數(shù)據(jù)存儲(chǔ)。Hadoop能夠?qū)崿F(xiàn)一個(gè)分布式的文件系統(tǒng),其中的一個(gè)組件就是HDFS。容錯(cuò)性高是HDFS的一個(gè)重要特點(diǎn),設(shè)計(jì)可以在比較落后的硬件上部署;并且它能夠提供比較高數(shù)據(jù)吞吐量用來訪問文件中的數(shù)據(jù),對(duì)于那些有大量數(shù)據(jù)集的系統(tǒng)就比較合適了。而且HDFS還可以以數(shù)據(jù)流的方式來訪問。2.3Scrapy框架簡介Scrapy是基于Python編寫的一個(gè)網(wǎng)絡(luò)爬蟲框架,用來抓取網(wǎng)站頁面中一些結(jié)構(gòu)化的數(shù)據(jù)。在數(shù)據(jù)挖掘中,Scrapy是一個(gè)常用的框架。在編寫爬蟲的過程中,Scrapy提供了許多類型的基類,如CrawlSpider、SitemapSpider等。Scrapy的整體架構(gòu)大致如下(圖片來源網(wǎng)絡(luò)):圖2-1Scrapy整體架構(gòu)圖Scrapy架構(gòu)組件介紹:ScrapyEngine(引擎):是整個(gè)框架非常重要的核心,處理系統(tǒng)的數(shù)據(jù)流,完成各個(gè)部分的通信。Scheduler(調(diào)度器):作為調(diào)度器,它主要功能是接受引擎發(fā)送過的請(qǐng)求,把這些請(qǐng)求進(jìn)行一定的排列和整理,按照順序?qū)φ?qǐng)求進(jìn)行調(diào)度。Downloader(下載器):下載器是接收引擎發(fā)送過來的下載請(qǐng)求,然后去網(wǎng)頁上面把需求的數(shù)據(jù)下載下來,之后返回到引擎當(dāng)中。Spider(爬蟲):爬蟲把爬取的鏈接發(fā)送給引擎,引擎通過其他模塊返回的數(shù)據(jù)交給爬蟲,然后解析這些返回的數(shù)據(jù)。ItemPipeline(管道):管道就是能夠把爬蟲發(fā)送的數(shù)據(jù)進(jìn)行保存DownloaderMiddlewares(下載中間件):這個(gè)主要就是一個(gè)擴(kuò)展的中間件,主要影響的是下載器和引擎之間的通信功能。SpiderMiddlewares(Spider中間件):與下載中間件類似,也是擴(kuò)展爬蟲和引擎兩者通信的中間件。2.4Redis數(shù)據(jù)庫Redis是一個(gè)完全開源的數(shù)據(jù)庫,性能極高的key-value數(shù)據(jù)庫,Redis數(shù)據(jù)庫支持?jǐn)?shù)據(jù)的長久保存,它能夠把保存在內(nèi)存里面的數(shù)據(jù)轉(zhuǎn)存在硬盤當(dāng)中,哪怕電腦重啟之后也可以訪問,而且Redis數(shù)據(jù)庫還支持多種類型的數(shù)據(jù),可以以不同的數(shù)據(jù)結(jié)構(gòu)進(jìn)行存儲(chǔ)。它還能夠?qū)?shù)據(jù)進(jìn)行備份保存。Redis的優(yōu)點(diǎn)包括它具有極高的讀寫速度,具備非常豐富的數(shù)據(jù)類型操作,Redis還具備原子性,什么是原子性呢,簡單來說就是執(zhí)行成功或者失敗完全不執(zhí)行。2.5MongoDB數(shù)據(jù)庫MongoDB是一個(gè)基于分布式的數(shù)據(jù)庫系統(tǒng)。底層是由C++編寫。它主要是為WEB應(yīng)用程序提供可伸縮的高性能數(shù)據(jù)存儲(chǔ)解決方案。MongoDB數(shù)據(jù)庫是主要面向文檔類型的存儲(chǔ),操作簡便易行,可以設(shè)置任何屬性的索引來做到很快的進(jìn)行排序,還可以利用創(chuàng)建鏡像來增強(qiáng)其拓展性,如果在高負(fù)載的情況下,它可以做到利用分布式來處理數(shù)據(jù),通過不同的節(jié)點(diǎn)。其可利用JSON標(biāo)記的形式的查詢指令輕松查詢對(duì)象和數(shù)組。MongoDB還支持很多編程語言,比如Python,Java,C++等各種類型的語言。其中它的Map函數(shù)是通過調(diào)用二叉樹來遍歷集合中的數(shù)據(jù),最后傳達(dá)Reduce來進(jìn)行處理。最后它的安裝非常簡單,無論是在Linux還是windows。第3章系統(tǒng)需求分析3.1功能需求對(duì)于現(xiàn)代大數(shù)據(jù)的網(wǎng)絡(luò)社會(huì),如何從龐大的數(shù)據(jù)海洋中大量的采集數(shù)據(jù)成為了我們需要去解決的問題,基于這個(gè)需求我設(shè)計(jì)了該項(xiàng)目本文基于Python語言來編寫爬蟲程序,用來爬取秀動(dòng)網(wǎng)演唱會(huì)的內(nèi)容,利用hadoop搭建分布式框架,將一臺(tái)主機(jī)作為Master主機(jī),設(shè)置兩臺(tái)主機(jī)作為Slave主機(jī),通過Master主機(jī)來協(xié)調(diào)兩臺(tái)Slave主機(jī)進(jìn)行內(nèi)容的爬取,并且將爬取的內(nèi)容存儲(chǔ)在Master機(jī)上,爬蟲具備爬取策略的設(shè)計(jì),能夠?qū)⑽宜枨蟮淖侄芜M(jìn)行爬取,比如演出地址,演唱會(huì)名稱等,不會(huì)爬取其他多余字段,并能夠做到增量和去重,對(duì)秀動(dòng)網(wǎng)的反爬,能夠通過減慢爬取速度和通過ip池做到反反爬,之后將爬取的內(nèi)容存儲(chǔ)到數(shù)據(jù)庫當(dāng)中,對(duì)于爬取的內(nèi)容做到可視化處理。3.2用例圖圖3-1用戶用例圖圖3-2爬蟲用例圖3.3架構(gòu)示意圖圖3-3架構(gòu)示意圖3.4功能架構(gòu)劃分爬蟲功能的功能需求主要在對(duì)于字段的爬取,對(duì)網(wǎng)站反爬的處理,內(nèi)容的保存和處理。這就要求爬蟲能夠滿足對(duì)于網(wǎng)站各種信息的曬別,提取,能夠應(yīng)對(duì)網(wǎng)站的反爬,以及對(duì)爬取出來的內(nèi)容進(jìn)行收集和處理。系統(tǒng)功能架構(gòu)如下圖所示:圖3-4功能架構(gòu)圖3.5程序流程圖圖3-5程序流程圖第4章數(shù)據(jù)庫設(shè)計(jì)4.1數(shù)據(jù)庫E-R圖系統(tǒng)采用的是MonggoDB數(shù)據(jù)庫,從需求的分析上找出實(shí)體,實(shí)體和屬性聯(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)容。以秀動(dòng)網(wǎng)演唱會(huì)數(shù)據(jù)為主,通過分析內(nèi)部結(jié)構(gòu),內(nèi)容字段如下表所示:表4-1演唱會(huì)內(nèi)容表序號(hào)字段名稱字段含義1platform平臺(tái)2title演唱會(huì)標(biāo)題3ShowTime表演時(shí)間4actors明星名字5address演出地址6price價(jià)格7url頁面地址第5章系統(tǒng)詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)5.1爬蟲的設(shè)計(jì)與實(shí)現(xiàn)該系統(tǒng)主要以爬取秀動(dòng)演唱會(huì)網(wǎng)頁內(nèi)容為主來設(shè)計(jì)爬蟲,重點(diǎn)考慮爬取策略的設(shè)計(jì),數(shù)據(jù)的抓取、去重和增量功能的實(shí)現(xiàn)、爬蟲防屏蔽的實(shí)現(xiàn)、數(shù)據(jù)處理與存儲(chǔ)5.1.1爬取策略的設(shè)計(jì)的設(shè)計(jì)與實(shí)現(xiàn)在Scrapy的結(jié)構(gòu)里面,爬蟲是從我們?cè)O(shè)置的初始的URL來開始數(shù)據(jù)爬取,爬蟲從我們所設(shè)置的目標(biāo)地址中獲得我們所需要的正則表達(dá)式,之后通過Xpath來獲取接下來需要爬取的URL,并把這些地址存入接下來需要爬取的隊(duì)列中。在對(duì)爬取的內(nèi)容進(jìn)行去重并且進(jìn)行排序之后,等待調(diào)度器對(duì)其進(jìn)行調(diào)度。在這個(gè)爬蟲系統(tǒng)中,爬取下來的URL可以分為兩種,一種是下標(biāo)頁碼的鏈接,也就是我們?cè)诰W(wǎng)站里面看到的下一頁的鏈接,另一種是這個(gè)這個(gè)頁面的中我們需要爬取的相關(guān)字段的鏈接,之后我們需要對(duì)這個(gè)網(wǎng)頁需要爬取的有關(guān)字段進(jìn)行解析,我們所指向的就是秀動(dòng)演唱會(huì)頁面的相關(guān)信息頁面。并把網(wǎng)頁中我們解析好的內(nèi)容字段進(jìn)行采集存儲(chǔ)。功能實(shí)現(xià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))#初始URL
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這個(gè)部分就是對(duì)于我們初始鏈接開始爬取的相關(guān)策略,采用的模式是分布式的主從模式,就是把Master端爬取下來的相關(guān)詳情頁面的URL,存儲(chǔ)在Redis當(dāng)中,并且把這些需要爬取的地址發(fā)送給Slave端的爬蟲進(jìn)行爬取。5.1.2爬蟲的具體實(shí)現(xiàn)關(guān)于爬蟲系統(tǒng)相關(guān)的功能的具體實(shí)現(xiàn),包括了四個(gè)基本功能的實(shí)現(xiàn),分別是數(shù)據(jù)抓取,數(shù)據(jù)存儲(chǔ),相關(guān)對(duì)象的定義以及內(nèi)容下載。先從數(shù)據(jù)抓取來說,數(shù)據(jù)抓取我分為兩個(gè)部分,其中先是Master端的抓取程序,Master端主要是爬取所需的相關(guān)頁面的URL,并且把這些地址存入Redis中,Slave端從Redis中獲取地址并且按順序?qū)@些網(wǎng)頁進(jìn)行抓取,抓取的字段的規(guī)則和Xpath提取字段的方法等都在程序中做了定義,所以爬蟲能夠?qū)⒃敿?xì)頁面中需求的數(shù)據(jù)爬取下來,在Xpath中包括了多種類型,分別是元素、文本、屬性、命名空間、處理指令和文檔節(jié)點(diǎn),其中把網(wǎng)頁文檔當(dāng)作節(jié)點(diǎn)樹,通過Xpath當(dāng)中的正則表達(dá)式來對(duì)目標(biāo)節(jié)點(diǎn)進(jìn)行定位就可以抽取頁面的具體字段。圖5-1網(wǎng)頁具體字段圖Xpath抽取方法詳細(xì)代碼如下: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去重與增量爬取在爬取的過程中可能會(huì)爬取到相同的內(nèi)容,這個(gè)時(shí)候就需要對(duì)爬取內(nèi)容進(jìn)行增量和去重,這樣可以極大的減少服務(wù)器的負(fù)擔(dān)并且能夠讓爬取的數(shù)據(jù)更加準(zhǔn)確,如果沒有去重的處理,可能會(huì)產(chǎn)生大量重復(fù)的內(nèi)容,導(dǎo)致服務(wù)器爬取有效內(nèi)容的效率大大下降,那么去重的過程是怎樣實(shí)現(xiàn)的呢,其實(shí)非常簡單,就是查看這個(gè)請(qǐng)求是不是已經(jīng)爬取過,是否在已經(jīng)爬取的隊(duì)列里面,如果在爬取的隊(duì)列里面,就放棄這次請(qǐng)求。(1)獲取Redis里面的等待爬取的隊(duì)列中的URL(2)判斷請(qǐng)求的URL是否已經(jīng)在已爬取的隊(duì)列當(dāng)中,如果不在則進(jìn)行爬取,如果在則放棄爬取。此處功能的實(shí)現(xiàn)使用的是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爬蟲防屏蔽的實(shí)現(xiàn)我們正常訪問一個(gè)網(wǎng)頁的時(shí)候,不會(huì)對(duì)網(wǎng)頁產(chǎn)生什么影響,因?yàn)槲覀冊(cè)L問的速度和次數(shù)不是很多,處于一個(gè)服務(wù)器正常的接受范圍內(nèi)。但是,我們?nèi)绻褂门老x去訪問網(wǎng)站可能會(huì)因?yàn)樗俣冗^快和訪問次數(shù)過多導(dǎo)致網(wǎng)站的服務(wù)器負(fù)載過大,從另一方面來說,網(wǎng)站的管理員有時(shí)候并不想因?yàn)榕老x增加服務(wù)器的負(fù)載,也不想讓自己網(wǎng)站的數(shù)據(jù)被大規(guī)模的爬取,所以為了保障服務(wù)器狀態(tài)正常能夠讓普通的用戶訪問且不會(huì)導(dǎo)致自己網(wǎng)站的數(shù)據(jù)被大規(guī)模爬取,許多網(wǎng)站為了應(yīng)對(duì)爬蟲寫了相關(guān)的反爬策略。如果你使用爬蟲爬取對(duì)方網(wǎng)站的內(nèi)容的時(shí)候觸發(fā)了這個(gè)網(wǎng)站的反爬程序,普通情況下可能會(huì)激活一些機(jī)器人檢測(cè)程序由此過濾掉你的那些爬蟲,讓你的爬蟲無法工作,更嚴(yán)重的會(huì)直接封鎖你的IP地址讓你永遠(yuǎn)無法使用這個(gè)IP訪問這個(gè)網(wǎng)站,所以我們的爬蟲就要模仿普通用戶來訪問這個(gè)網(wǎng)站,以此來繞過這個(gè)網(wǎng)站的檢測(cè)程序,所以如果不加思索的暴力爬取網(wǎng)頁可能會(huì)讓你的數(shù)據(jù)挖掘過程舉步維艱,所以我們就要對(duì)自己的爬蟲進(jìn)行偽裝,繞開屏蔽程序。本文的爬蟲系統(tǒng)使用的是以下反反爬策略:1.通過模擬偽裝成不同的瀏覽器模式來訪問網(wǎng)站2.設(shè)置IP池,并以IP池里面的IP更換爬蟲訪問時(shí)的IP3.通過調(diào)節(jié)爬蟲爬取的速率來降低反爬程序檢測(cè)到的可能性。5.2.1偽裝瀏覽器的實(shí)現(xiàn)利用Scrapy框架中下載中間件的模塊可以自定義的特點(diǎn),對(duì)我們請(qǐng)求的屬性進(jìn)行修改來實(shí)現(xiàn)偽裝首先就要在setting.py中添加中間件模塊,之后就是對(duì)中間件進(jìn)行拓展的,通過制作一個(gè)useragent列表,將我們需要修改的瀏覽器請(qǐng)求寫入列表并進(jìn)行保存具體代碼如下所示:#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'請(qǐng)求列表中任意的一個(gè)agent值,之后便使用這個(gè)值來下載內(nèi)容。每次爬取內(nèi)容時(shí)都會(huì)模擬不同的瀏覽器模式來進(jìn)行訪問。5.2.2代理IP爬取的實(shí)現(xiàn)代理IP的實(shí)現(xiàn)也是要通過設(shè)置中間件來實(shí)現(xiàn),首先與上面瀏覽器的模擬一樣,先在settings.py里面對(duì)中間件進(jìn)行設(shè)置,之后擴(kuò)展組件設(shè)置對(duì)請(qǐng)求的頭文件從IP池中隨機(jī)選取一個(gè)IP作為訪問的代理IP,之后下載器便使用這個(gè)來進(jìn)行下載。5.2.3爬蟲異常狀態(tài)的處理爬蟲的異常處理是爬蟲系統(tǒng)正常運(yùn)行的保障,在沒有被網(wǎng)站屏蔽的時(shí)候,其實(shí)不止請(qǐng)求成功這一個(gè)狀態(tài),而是有很多種不同的狀態(tài),對(duì)于如何設(shè)計(jì)爬蟲異常狀態(tài)的處理是爬蟲系統(tǒng)擁有健壯性的關(guān)鍵。在settings.py中我們所拓展的中間件捕捉到了爬蟲運(yùn)行的異常狀態(tài)之后,將請(qǐng)求Request重新加入到待下載隊(duì)列當(dāng)中流程如下:圖5-2異常處理流程圖5.2.4數(shù)據(jù)存儲(chǔ)模塊實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)模塊的實(shí)現(xiàn)主要是通過Slave端將爬蟲爬取出來的數(shù)據(jù)進(jìn)行存儲(chǔ),其中所使用到的數(shù)據(jù)庫是MongoDB。Scrapy擁有很多種數(shù)據(jù)存儲(chǔ)的格式,比如json,csv和xml等文本格式,使用者需要對(duì)爬蟲進(jìn)行設(shè)置。需要在Scrapy工程文件中的ItemPipline.py中對(duì)文本格式進(jìn)行設(shè)置,同時(shí),Scrapy也支持?jǐn)?shù)據(jù)庫存儲(chǔ),如MonogDB和Redis等,當(dāng)爬取非常龐大的數(shù)據(jù)的時(shí)候,也可以通過數(shù)據(jù)庫的集群來解決問題。本文系統(tǒng)的數(shù)據(jù)存儲(chǔ)流程如下圖:圖5-3數(shù)據(jù)存儲(chǔ)示意圖5.3數(shù)據(jù)處理5.3.1對(duì)象定義程序數(shù)據(jù)存儲(chǔ)需要一個(gè)定義采集數(shù)據(jù)的容器,本系統(tǒng)使用的是Item。系統(tǒng)聲明對(duì)象是通過創(chuàng)建一個(gè)scrapy.item.Item類來聲明。通過scrapy.item.Field類來定義對(duì)象,我們需要定義與之相關(guān)的對(duì)象,來控制從網(wǎng)頁中獲得的數(shù)據(jù)。本文中的系統(tǒng)分別定義了九個(gè)抓取對(duì)象,分別是:標(biāo)題,表演時(shí)間,演員名字,地址,價(jià)格,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ù)處理程序爬取下來的數(shù)據(jù)需要使用Pipeline這個(gè)類來實(shí)現(xiàn),這個(gè)類定義了爬取數(shù)據(jù)輸出和保存的方法,用爬蟲的Parse的方法把數(shù)據(jù)返回到Item,把與列表對(duì)應(yīng)的Pipeline類進(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()
returnitem數(shù)據(jù)存儲(chǔ)模塊主要負(fù)責(zé)將slave端爬取解析的頁面進(jìn)行存儲(chǔ)。使用Mongodb對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)。classMongoPipeline(object):
defopen_spider(self,spider):
self.client=pymongo.MongoClient()
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國鎳鋅電池市場(chǎng)運(yùn)行狀況及發(fā)展前景分析報(bào)告
- 2025-2030年中國遮陽蓬市場(chǎng)運(yùn)行動(dòng)態(tài)及投資戰(zhàn)略研究報(bào)告
- 2025江蘇省建筑安全員A證考試題庫
- 2025-2030年中國被褥行業(yè)市場(chǎng)運(yùn)行狀況及發(fā)展趨勢(shì)分析報(bào)告
- 2025-2030年中國花露水行業(yè)運(yùn)行狀況與投資戰(zhàn)略研究報(bào)告
- 2025-2030年中國腮紅(胭脂)行業(yè)發(fā)展趨勢(shì)與十三五規(guī)劃分析報(bào)告
- 2025-2030年中國粗糧飲料產(chǎn)業(yè)需求狀況及發(fā)展策略分析報(bào)告
- 2025-2030年中國稀土拋光粉市場(chǎng)發(fā)展趨勢(shì)規(guī)劃研究報(bào)告
- 2025-2030年中國真空鍍膜機(jī)市場(chǎng)運(yùn)行現(xiàn)狀及投資規(guī)劃研究報(bào)告
- 2025-2030年中國男士香水行業(yè)運(yùn)行態(tài)勢(shì)及發(fā)展前景分析報(bào)告
- 電網(wǎng)工程設(shè)備材料信息參考價(jià)(2024年第四季度)
- PDCA項(xiàng)目降低非計(jì)劃性拔管發(fā)生率持續(xù)改進(jìn)
- 質(zhì)量問題檢出獎(jiǎng)勵(lì)申請(qǐng)表模板
- 中職學(xué)生日常行為規(guī)范主題班會(huì)講稿
- 組織行為學(xué)13-組織文化
- 供應(yīng)鏈管理課件第5章供應(yīng)鏈合作伙伴選擇與評(píng)價(jià)
- 餐飲店面投資預(yù)算(900平方米)
- 預(yù)應(yīng)力工程施工質(zhì)量驗(yàn)收標(biāo)準(zhǔn)
- 旅游資源規(guī)劃與開發(fā)實(shí)訓(xùn)指導(dǎo)書
- 立體幾何專題:距離和角
- DBJ-T01-43-2003_(北京)通用家庭居室裝飾工程質(zhì)量驗(yàn)收標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論