趙鵬程 嚴軼軒 范巡禮
(西北大學信息科學與技術學院 陜西省西安市 710127)
如今網上資源魚龍混雜,資源分布太廣,并且重復率十分高。一般普通用戶所采用的的搜索引擎大多為百度,必應等,如果利用傳統的搜索引擎進行民間故事的索引,會發現搜索結果繁多且雜,且網頁大多含有廣告等無關信息。普通人想要進行這方面的搜索會十分困難,而當我們的青少年兒童想要進行搜索時則更加容易受到眾多廣告以及不明網頁的誤導。
項目步驟首先從初始網頁集合開始,分析網頁布局并提取故事內容,然后設計分布式結構,將爬取內容進行分類,最后進行可視化展示。
網頁被HTML使用標記標簽來進行描述,WEB瀏覽器讀取相應HTML文檔并且最終用網頁的形式來展示給用戶。以chrome瀏覽器為例,打開某故事網站,右鍵審查元素,發現其部分網頁布局如圖1所示。
發現大部分正文包含在標簽內,我們可以借此定位全網頁的標簽,然后直接爬取其標簽內容,也有部分網頁布局更加復雜,這時候需要借助HTML中的其他屬性來進行定位(class,name等)。本項目采用python,借助scrapy這種通用的爬蟲框架,此處使用xpath在頁面中查找元素為例,提取div塊當中class名稱為ic的標簽內容存儲到lists列表變量當中:lists = response.xpath(".//div[@class = 'ic']//@href").extract()
爬取獲得的數據還需要進行去除冗余的處理,按照上面的方法,實際上已經只提取了正文的主要部分,去除了大部分數據,然后對數據進行正則匹配等操作,主要去除空格和多余的空行。
基于scrapy框架,首先由spider生成相應網絡的請求,通過調度器scheduler將請求發送給下載器downloader,下載器獲取相應的網絡數據之后返回消息response給spiders,最終由spiders將數據放在item容器里。其中scrapy engine負責整個框架所有組件數據流的流通,并且控制相應的動作[1],架構圖如圖2所示。

圖1

圖2

圖3
在此基礎上,我們將redis數據庫與scrapy相結合進而進一步實現分布式的思想,scrapy-redis的思路便是在原本的基礎上建立一個隊列,spiders生成請求之后直接將網絡請求發送給redis隊列,最后經過調度器scheduler將隊列中的請求提取出來。從而我們可以建立多個調度器,每個調度器都可以從redis當中提取相應的請求(同時也可以存入請求),進一步實現了利用多服務器分布爬取的目的[2],分布式爬蟲架構圖如圖3所示。

圖4
我們總計爬取了42847篇民間故事,并且根據目標網站的內容分成了十三類:“歷史故事”、“短篇故事”、“民間故事”、“神話故事”、“成語故事”、“中國野史”、“黨史故事”、“歷史人物”、“野史秘聞”、“文史百科”、“戰史風云”、“歷史解密”和“風云人物”。統計出每個類別的數據如圖4所示。
并且在每個分類中,統計出頻率最高的詞源繪制成為圖譜詞云(圖5)。

圖5

圖6
租賃服務器搭建網站,建立一個簡潔的搜索系統,由于數據量較多,并且未來可能會爬取更多的數據,在存儲與搜索方面使用ElasticSearch框架檢索相關數據并且返回統計結果。其設計理念即在lucene的基礎上,通過倒排索引的方式進行快速查詢。前段技術棧采用常見的HTML、JS等語言。設計效果如圖6所示。
本文敘述了分布式爬蟲的基本原理和爬取策略,展示了項目的基本流程,對數據進行了分析和可視化處理,搭建了相應的檢索工具以便用戶使用。
雖然項目總體進展良好,但是也存在一些問題,例如許多網站有校驗碼限制了爬蟲的效率,再者就是爬蟲的效率依舊需要提高,對于校驗碼問題,可以使用機器學習進行圖像識別進行自動校驗,針對爬蟲效率可以設計更加優化的算法以及增加從機的數量。