郭鋒鋒
(宿州職業(yè)技術(shù)學(xué)院計(jì)算機(jī)信息系,安徽 宿州 234000)
網(wǎng)絡(luò)爬蟲,又稱蜘蛛機(jī)器人,其實(shí)質(zhì)是程序,是抓取網(wǎng)頁數(shù)據(jù)的程序,最終是根據(jù)用戶需求,在一定規(guī)則下,得到用戶需要的數(shù)據(jù)信息。爬蟲通常分為通用爬蟲和聚焦爬蟲,通用爬蟲對資源進(jìn)行全覆蓋,沒有針對性的數(shù)據(jù),返回結(jié)果可能包含一些用戶不需要的信息,而聚焦爬蟲,聚焦某些點(diǎn),更精確,抓取特定主題的內(nèi)容,獲得相應(yīng)的信息。聚焦爬蟲根據(jù)需要抓取的目標(biāo)描述,用相應(yīng)的算法分析網(wǎng)頁數(shù)據(jù),最后對url制定搜索策略,最終一直爬取到自己需要的信息,最終的結(jié)果按照要求存儲(chǔ)、排序、瀏覽等。
python作為一種語言,1989年便出現(xiàn)了,一路攀升,近幾年熱度大增,2019年已經(jīng)成為僅次于java和c和c++的第四大語言。成為目前最受歡迎的編程語言,目前是作為爬蟲領(lǐng)域的第一語言?;趐ython的爬蟲框架很多,目前用的比較多的是scrapy,pyspider,biautifulsoup等等,每種框架在性能和爬行能力上各有不同,下面對幾個(gè)python爬蟲框架進(jìn)行比較。主要從爬行能力和爬行性能兩方面進(jìn)行比較
表1 幾種python爬蟲框架比較
由于scrapy通用開源爬蟲框架不能滿足我們對特定的內(nèi)容的抓取,本文主要設(shè)計(jì)了基于scrapy的開源爬蟲框架,用貝葉斯分類器進(jìn)行主題相關(guān)性判定,利用搜索策略在網(wǎng)站中采集網(wǎng)頁信息,通過結(jié)合dom樹的分塊聚類算法解析網(wǎng)頁內(nèi)容,通過解析出來的網(wǎng)頁內(nèi)容更新當(dāng)前網(wǎng)頁節(jié)點(diǎn)權(quán)值,通過主題相關(guān)相似性模塊對子urls進(jìn)行鏈接權(quán)值的計(jì)算,然后根據(jù)結(jié)點(diǎn)隊(duì)列中網(wǎng)頁關(guān)系計(jì)算結(jié)點(diǎn)權(quán)值,通過計(jì)算,使用過濾模塊淘汰掉結(jié)點(diǎn)權(quán)值低于urls的內(nèi)容。優(yōu)化scrapy框架下的url去重,下面對系統(tǒng)幾個(gè)重要模塊進(jìn)行說明。
貝葉斯分類的定義
1)設(shè)x={a1,a2,…,am}為一個(gè)集合,其中a1-am為x的一個(gè)屬性。
2)有類別集合C={y1,y2,…,yn}。
3)接下來逐一計(jì)算概率P(y1|x),P(y2|x),…,P(yn|x)。
4)求最大概率。則X屬于概率最大的類別P(yk|x)=max{P(y1|x),P(y2|x),…,P(yn|x)},則x∈yk。
根據(jù)貝葉斯定理,要求P(Y|X),求出P(X|Y) 就可以.這里Y相當(dāng)于A,X相當(dāng)于B.把B分解為各個(gè)屬性,求出每個(gè)類別的屬性即可,如下
1)找到一個(gè)訓(xùn)練樣本集。
2)訓(xùn)練樣本集是已知分類的待分類項(xiàng)集合。
3)經(jīng)過統(tǒng)計(jì)計(jì)算出條件概率估計(jì)。即
P(a1|y1),P(a2|y1),…,P(am|y1);P(a1|y2),
P(a2|y2),…,P(am|y2);…;P(a1|yn),
P(a2|yn),…,P(am|yn)
4)如果各個(gè)特征屬性是條件獨(dú)立的,則:
因?yàn)榉帜窹(x)為常數(shù),所以將分子最大化即可。又因?yàn)楦魈卣鲗傩允菞l件獨(dú)立的,所以有:
P(x|yi)P(yi)=P(a1|yi)P(a2|yi)…
利用貝葉斯分類器進(jìn)行主題相關(guān)性的判定,屬于類別的特征屬性的例子越多,權(quán)值越大,主題相關(guān)性就越大。
重點(diǎn)介紹本系統(tǒng)涉及的幾個(gè)重要模塊,畫出幾個(gè)重要的算法流程圖
本爬蟲系統(tǒng)主要涉及爬蟲模塊、下載模塊、解析存儲(chǔ)模塊、過濾和去重模塊以及數(shù)據(jù)庫存儲(chǔ)模塊等模塊。每個(gè)模塊的作用如下:爬蟲模塊的作用是用本文的搜索策略在網(wǎng)頁采集信息,主體相關(guān)性分析算法利用貝葉斯分類對鏈接進(jìn)行權(quán)重計(jì)算,下載模塊是把爬取的網(wǎng)頁結(jié)構(gòu)下載下來,解析存儲(chǔ)模塊是把解析的內(nèi)容存儲(chǔ)起來把鏈接送到隊(duì)列調(diào)度,過濾和去重模塊負(fù)責(zé)調(diào)度和去重操作,數(shù)據(jù)庫存儲(chǔ)模塊是把爬取的內(nèi)容接收存儲(chǔ)到數(shù)據(jù)庫中。
通用爬蟲原理圖如下:
圖1 通用爬蟲系統(tǒng)
圖2 鏈接處理圖
爬蟲系統(tǒng)中的url鏈接去重、過濾是本爬蟲系統(tǒng)中重要的內(nèi)容,對于鏈接的過濾是對抓到的網(wǎng)頁淘汰掉一部分鏈接,具體原理為,抓取網(wǎng)頁后,通過主體相關(guān)性算法計(jì)算出新的urls的權(quán)重,然后把此權(quán)重值與預(yù)設(shè)的臨界值進(jìn)行對比,如果此權(quán)重值大于臨界值則為相關(guān)鏈接加入到url隊(duì)列,否則直接淘汰掉此鏈接。
過濾后對url去重方法可以有hash表,set,布隆過濾器等。利用兩個(gè)hash表便可以進(jìn)行去重操作,一個(gè)hash表用來記錄正訪問抓取的filename,另一個(gè)hash表用來存放抓取過的host,另外用數(shù)據(jù)庫存儲(chǔ)url,通過判定網(wǎng)頁里的鏈接是否指向當(dāng)前網(wǎng)站,決定繼續(xù)抓取還是結(jié)束。在爬蟲中,已經(jīng)爬取的url鏈接會(huì)被記錄,新的url會(huì)比對判斷是否在已經(jīng)被記錄的集合中,若存放鏈接的集合記錄數(shù)量大,所需要的存儲(chǔ)空間相應(yīng)巨大,此時(shí)可用布隆過濾器來解決。本文采用基于hash存儲(chǔ)的去重方法即可。下圖為鏈接處理流程圖。
基于分塊聚類的網(wǎng)頁解析算法在爬蟲系統(tǒng)的實(shí)現(xiàn)中網(wǎng)頁解析起到重要作用,網(wǎng)頁解析算法用到了結(jié)合dom樹的分塊算法,dom樹中的結(jié)構(gòu)信息提供給算法文本,標(biāo)簽等提示?;诿芏榷x的聚類算法可以處理噪聲能力,不足之處在于對象類之間差異較大時(shí),效果不好。 以基于dom樹分塊算法為核心,基于scrapy爬蟲框架,設(shè)計(jì)基于scrapy的爬蟲系統(tǒng),爬蟲對獲得的url鏈接進(jìn)行相關(guān)性判斷,接下來用分塊算法對網(wǎng)頁結(jié)構(gòu)進(jìn)行解析,根據(jù)urls鏈接權(quán)重,把不相關(guān)的urls去掉,最后留下的交給引擎處理。下圖給出scrapy爬蟲框架和改進(jìn)后的爬蟲框架圖。
圖3 scrapy的整體架構(gòu)
通用爬蟲架構(gòu)描述了scrapy的各個(gè)組件和數(shù)據(jù)流情況圖。
Scrapy engine:引擎是核心,相當(dāng)于計(jì)算機(jī)的cpu,控制整個(gè)數(shù)據(jù)和信號的傳遞處理。
Scheduler:調(diào)度器作用是把引擎發(fā)送過來的請求requests存儲(chǔ)在隊(duì)列中,交給下載器。
Downloader:下載器是爬蟲系統(tǒng)與互聯(lián)網(wǎng)連接的組件,通過核心組件引擎,獲取響應(yīng)結(jié)果(responses)交給爬蟲組件處理。
Spiders:接收從下載器模塊傳遞過來的信息,分析獲得item即自己需要的信息,獲取數(shù)據(jù)和urls,然后將獲取內(nèi)容送給item pipeline。
Item pipeline:處理從爬蟲獲得的數(shù)據(jù)和urls,處理網(wǎng)頁數(shù)據(jù)。
Downloader:下載器中間件起到橋梁作用,處理引擎和下載器之間的請求和響應(yīng)。
對于scrapy架構(gòu),它的爬蟲和項(xiàng)目管道模塊可以自由編寫,圖4為改進(jìn)后的結(jié)構(gòu)圖,改進(jìn)后的結(jié)構(gòu)圖比之前的框架多了個(gè)貝葉斯分類計(jì)算主題相關(guān)性模塊,連接加到爬蟲模塊中以實(shí)現(xiàn)精確的爬取需求。此模塊的核心是主題相關(guān)性分析。用貝葉斯分類器進(jìn)行主題相關(guān)性分析,網(wǎng)頁解析用分塊算法,用過濾模塊淘汰掉部分urls,獲得需要的網(wǎng)頁內(nèi)容,最終回傳爬蟲模塊。
圖4 改進(jìn)后的整體架構(gòu)
基于以上算法流程圖,設(shè)計(jì)基于python的scrapy改進(jìn)爬蟲系統(tǒng),系統(tǒng)測試要求如下:
操作系統(tǒng):Windows
處理器:要求900MHZ以上
RAM:2G或以上
存儲(chǔ):64G
軟件:python3 Mysqlv5.6以上 redis server v3.2及以上
通過對主題詞宿州 城市發(fā)展 政治 經(jīng)濟(jì) 文化 成果 成績 文化 收入 等對相關(guān)網(wǎng)頁的網(wǎng)頁進(jìn)行抓取,衡量指標(biāo)以查準(zhǔn)率和耗時(shí)來衡量,性能比較結(jié)果如下:
表2 爬蟲算法抓取300個(gè)網(wǎng)頁情況
表3 爬蟲算法抓取8000個(gè)網(wǎng)頁情況
介紹了目前較火的python語言,以及爬蟲框架系統(tǒng),可以提取很多類型的網(wǎng)站數(shù)據(jù),通過配置好一定的實(shí)驗(yàn)環(huán)境,設(shè)定主題詞,對相關(guān)網(wǎng)頁進(jìn)行抓取,通過改進(jìn)scrapy框架下的url過濾、基于hash表的去重算法,通過新算法抓取不同數(shù)目的網(wǎng)頁鏈接入手,新提出的爬蟲算法查準(zhǔn)率更高,時(shí)間更短,有良好的性能,能更快的得到和用戶要求主題一致的網(wǎng)頁。對以后的爬蟲研究有借鑒作用。另外,只是提取了源網(wǎng)頁的部分鏈接,更深層次內(nèi)容的獲取將有待進(jìn)一步研究。