趙鵬程 嚴(yán)軼軒 范巡禮
(西北大學(xué)信息科學(xué)與技術(shù)學(xué)院 陜西省西安市 710127)
如今網(wǎng)上資源魚(yú)龍混雜,資源分布太廣,并且重復(fù)率十分高。一般普通用戶所采用的的搜索引擎大多為百度,必應(yīng)等,如果利用傳統(tǒng)的搜索引擎進(jìn)行民間故事的索引,會(huì)發(fā)現(xiàn)搜索結(jié)果繁多且雜,且網(wǎng)頁(yè)大多含有廣告等無(wú)關(guān)信息。普通人想要進(jìn)行這方面的搜索會(huì)十分困難,而當(dāng)我們的青少年兒童想要進(jìn)行搜索時(shí)則更加容易受到眾多廣告以及不明網(wǎng)頁(yè)的誤導(dǎo)。
項(xiàng)目步驟首先從初始網(wǎng)頁(yè)集合開(kāi)始,分析網(wǎng)頁(yè)布局并提取故事內(nèi)容,然后設(shè)計(jì)分布式結(jié)構(gòu),將爬取內(nèi)容進(jìn)行分類,最后進(jìn)行可視化展示。
網(wǎng)頁(yè)被HTML使用標(biāo)記標(biāo)簽來(lái)進(jìn)行描述,WEB瀏覽器讀取相應(yīng)HTML文檔并且最終用網(wǎng)頁(yè)的形式來(lái)展示給用戶。以chrome瀏覽器為例,打開(kāi)某故事網(wǎng)站,右鍵審查元素,發(fā)現(xiàn)其部分網(wǎng)頁(yè)布局如圖1所示。
發(fā)現(xiàn)大部分正文包含在標(biāo)簽內(nèi),我們可以借此定位全網(wǎng)頁(yè)的標(biāo)簽,然后直接爬取其標(biāo)簽內(nèi)容,也有部分網(wǎng)頁(yè)布局更加復(fù)雜,這時(shí)候需要借助HTML中的其他屬性來(lái)進(jìn)行定位(class,name等)。本項(xiàng)目采用python,借助scrapy這種通用的爬蟲(chóng)框架,此處使用xpath在頁(yè)面中查找元素為例,提取div塊當(dāng)中class名稱為ic的標(biāo)簽內(nèi)容存儲(chǔ)到lists列表變量當(dāng)中:lists = response.xpath(".//div[@class = 'ic']//@href").extract()
爬取獲得的數(shù)據(jù)還需要進(jìn)行去除冗余的處理,按照上面的方法,實(shí)際上已經(jīng)只提取了正文的主要部分,去除了大部分?jǐn)?shù)據(jù),然后對(duì)數(shù)據(jù)進(jìn)行正則匹配等操作,主要去除空格和多余的空行。
基于scrapy框架,首先由spider生成相應(yīng)網(wǎng)絡(luò)的請(qǐng)求,通過(guò)調(diào)度器scheduler將請(qǐng)求發(fā)送給下載器downloader,下載器獲取相應(yīng)的網(wǎng)絡(luò)數(shù)據(jù)之后返回消息response給spiders,最終由spiders將數(shù)據(jù)放在item容器里。其中scrapy engine負(fù)責(zé)整個(gè)框架所有組件數(shù)據(jù)流的流通,并且控制相應(yīng)的動(dòng)作[1],架構(gòu)圖如圖2所示。
圖1
圖2
圖3
在此基礎(chǔ)上,我們將redis數(shù)據(jù)庫(kù)與scrapy相結(jié)合進(jìn)而進(jìn)一步實(shí)現(xiàn)分布式的思想,scrapy-redis的思路便是在原本的基礎(chǔ)上建立一個(gè)隊(duì)列,spiders生成請(qǐng)求之后直接將網(wǎng)絡(luò)請(qǐng)求發(fā)送給redis隊(duì)列,最后經(jīng)過(guò)調(diào)度器scheduler將隊(duì)列中的請(qǐng)求提取出來(lái)。從而我們可以建立多個(gè)調(diào)度器,每個(gè)調(diào)度器都可以從redis當(dāng)中提取相應(yīng)的請(qǐng)求(同時(shí)也可以存入請(qǐng)求),進(jìn)一步實(shí)現(xiàn)了利用多服務(wù)器分布爬取的目的[2],分布式爬蟲(chóng)架構(gòu)圖如圖3所示。
圖4
我們總計(jì)爬取了42847篇民間故事,并且根據(jù)目標(biāo)網(wǎng)站的內(nèi)容分成了十三類:“歷史故事”、“短篇故事”、“民間故事”、“神話故事”、“成語(yǔ)故事”、“中國(guó)野史”、“黨史故事”、“歷史人物”、“野史秘聞”、“文史百科”、“戰(zhàn)史風(fēng)云”、“歷史解密”和“風(fēng)云人物”。統(tǒng)計(jì)出每個(gè)類別的數(shù)據(jù)如圖4所示。
并且在每個(gè)分類中,統(tǒng)計(jì)出頻率最高的詞源繪制成為圖譜詞云(圖5)。
圖5
圖6
租賃服務(wù)器搭建網(wǎng)站,建立一個(gè)簡(jiǎn)潔的搜索系統(tǒng),由于數(shù)據(jù)量較多,并且未來(lái)可能會(huì)爬取更多的數(shù)據(jù),在存儲(chǔ)與搜索方面使用ElasticSearch框架檢索相關(guān)數(shù)據(jù)并且返回統(tǒng)計(jì)結(jié)果。其設(shè)計(jì)理念即在lucene的基礎(chǔ)上,通過(guò)倒排索引的方式進(jìn)行快速查詢。前段技術(shù)棧采用常見(jiàn)的HTML、JS等語(yǔ)言。設(shè)計(jì)效果如圖6所示。
本文敘述了分布式爬蟲(chóng)的基本原理和爬取策略,展示了項(xiàng)目的基本流程,對(duì)數(shù)據(jù)進(jìn)行了分析和可視化處理,搭建了相應(yīng)的檢索工具以便用戶使用。
雖然項(xiàng)目總體進(jìn)展良好,但是也存在一些問(wèn)題,例如許多網(wǎng)站有校驗(yàn)碼限制了爬蟲(chóng)的效率,再者就是爬蟲(chóng)的效率依舊需要提高,對(duì)于校驗(yàn)碼問(wèn)題,可以使用機(jī)器學(xué)習(xí)進(jìn)行圖像識(shí)別進(jìn)行自動(dòng)校驗(yàn),針對(duì)爬蟲(chóng)效率可以設(shè)計(jì)更加優(yōu)化的算法以及增加從機(jī)的數(shù)量。