陳歡 黃勃 劉文竹

摘 要:網絡上存在眾多新聞門戶網站,新聞信息繁多,造成嚴重的新聞信息過載。針對該類問題,設計一個基于Python的網絡新聞信息搜集與檢索系統。該系統通過使用Scrapy網絡爬蟲框架進行網絡新聞信息搜集,同時對新聞鏈接、標題進行去重,最后使用Slor檢索服務對爬蟲獲得的新聞數據進行全文檢索。與傳統方法相比,該系統設計的去重方法在保證鏈接不重復的情況下,對標題進行去重,并引入Solr檢索服務,可以幫助讀者更快速地找到想要閱讀的新聞。
關鍵詞:爬蟲;信息檢索;Scrapy;Solr;數據去重
DOI:10. 11907/rjdk. 191232
中圖分類號:TP393 文獻標識碼:A 文章編號:1672-7800(2019)005-0168-04
Abstract:There are many news portals on the Internet, and there are many news information which causes serious news information overload. Aiming at this kind of problem, this paper designs a Python-based network news information collection and retrieval system. The system uses the Scrapy web crawler framework to collect online news information, and at the same time de-weights the news links and titles, and finally uses the Slor search service. The full-text search was carried out on the news data obtained by the crawler. Compared with the traditional method, the de-duplication method of the system deduplicates the title without link repeat, and introduces the Solr search service, which can help readers quickly locate the news that they want to read.
Key Words:web crawler;information retrieval; Scrapy; Solr; data deduplication
0 引言
新聞作為社會事件的記錄,是反映日常生活的常見文體之一,具有十分重要的意義。在互聯網時代,網絡新聞具有傳播速度快、內容多面化、來源多渠道等特點,但在給公眾快速提供新聞信息的同時,也因信息量過大導致信息過載,使公眾反而無法全面了解新聞事件真相。如何從海量新聞數據中獲取高質量新聞信息,幫助新聞用戶快速獲得自己感興趣的網絡新聞是本文要解決的問題。
網絡爬蟲又稱網絡蜘蛛、網絡機器人,指按照一定規則自動從網絡上抓取信息的一段程序或者腳本。使用爬蟲技術能夠獲取海量網絡數據并進行結構化存儲[1-2]。文獻[3]使用主題爬蟲的方法對新聞網進行抓取,與本文使用方法不同的是主題爬蟲通過網頁和主題相關度計算判斷網頁價值;文獻[4]根據網絡爬蟲原理和爬蟲算法,對數據存儲等基本信息進行全面、細致的介紹,但未討論爬蟲過程中可能遇到的問題;文獻[5]使用Hadoop增量式更新分布式并行科技進行視頻爬蟲,考慮鏈接指向視頻內容的情況,在層內使用合并去重的增量式方法,但該方法不適用于本文新聞門戶網站;文獻[6]使用Scrapy+MySql+Django進行網絡爬蟲、存儲和查詢,在查詢方法上與Slor檢索方法有較大差距;文獻[7]利用WebDriver和Selenium 對微博、新聞網站的健康信息進行爬蟲,并比較了不同線程下爬蟲程序抓取速度,使用該技術可以在一定程度上規避反爬,但會導致爬蟲效率低下。
網絡新聞媒體的快速發展逐漸取代了傳統新聞傳播媒介,并且降低了新聞制作和傳播成本,由此導致某一事件爆發時,網絡上容易產生各種主觀性較強的報道,使新聞喪失真實性[8-9]。針對以上問題,本文使用Scrapy爬蟲框架收集網絡新聞信息,并使用集合去重、查詢去重等去重策略,保證每條新聞信息唯一性,同時使用Solr檢索服務排序算法,實現新聞內容全文檢索。
1 網絡新聞信息采集
信息采集是收集、檢索網絡新聞的基礎,由于新聞門戶網站繁多,系統為了保證數據來源選取幾個主流新聞網站進行爬蟲研究。爬蟲程序的作用包括新聞標題、內容、時間及來源等信息獲取。新聞網頁相對于其它復雜的網站構成較為簡單,本文通過使用正則表達式與BeautifulSoup庫可基本獲取目標信息。
1.1 基于Scrapy的網絡新聞采集
Scrapy是一個健壯的網絡框架,支持從各種數據源中抓取數據。Scrapy是一種基于事件的框架,能夠將數據清洗、格式化,并進行裝飾后存儲到數據庫中。Scrapy框架包含Scrapy Engine(Scrapy引擎)、Scheduler(調度器)、Downloader(下載器)、Spiders(爬蟲)、Item Pipeline(管道),Downloader Middlewares(下載器中間件)等組件[10]。
爬蟲過程中需要對URL鏈接及頁面進行分析,以便提高爬蟲程序工作效率,例如騰訊新聞每篇文章的鏈接構成如下‘https://new.qq.com/cmsn/20190227/201902270099- 55.html,‘https://new.qq.com/表示騰訊新聞主頁面,‘cmsn表示文章歸屬板塊,‘20190227表示文章發布日期,‘2019022700995表示文章ID。文章內容包含在
標簽內,文章主題包含在
使用Scrapy限制域名的方法使爬取下來的新聞信息更加有針對性,例如騰訊新聞中視頻模塊不是目標內容,如果也對其進行爬取會導致爬蟲資源浪費,降低爬蟲程序工作效率。同時設計過濾方法,將依據提取規則提取的特殊字符串進行替換,保證爬取的新聞文本信息不包含其它特殊字符串,特殊字符串在寫入JSON文件時會引起錯誤,導致新聞不能被完整地寫入。
1.2 增量式網絡爬蟲
網絡新聞更新速度快、內容豐富,為了及時、準確地更新鏈接庫鏈接與數據庫新聞內容,需要設計一種簡單有效的去重算法[11]。常見去重算法有Hash去重、BloomFilter去重、利用集合內元素的唯一性去重。Hash去重的基本原理是利用不同的Hash函數如MD5、SHA等,生成Hash索引,通過遍歷Hash索引,去除重復數據,即通過把一個比較大的數據集映射到一個比較小的數據集中,以此加快查詢速度。隨著數據量的增大,利用Hash去重會浪費大量內存[12],因此在Hash去重的基礎上引入BloomFileter 算法,通過K個Hash函數將新加入的元素映射成一個位陣列中的K個點,當有一個新元素加入時,通過K個點的值判斷其是否存在[13-14]。
爬蟲爬取的新聞信息中有許多重復的內容,對爬蟲過程去重不能保證數據庫某一條信息唯一性。如圖1所示,由于該條新聞來自騰訊轉載自人民網,導致一條新聞對照多個鏈接。傳統去重方法只是對URL進行去重,無法處理新聞存在一個標題對照多個URL的情況。因此進行Scrapy爬蟲去重之后,在存入數據庫的過程中執行Sql查詢操作決定是否將本條信息插入到數據庫中。Sql查詢語句為:
cursor.execute(“select * from news_tb3 where news_title=%s”,item[‘title])
2 使用Solr檢索服務的新聞數據檢索
Solr是Apache基金會開源搜索引擎庫Lucene下的子項目,Lucene是一種基于Java語言的開源信息檢索庫,Solr在Lucene的基礎上進一步擴展,包含豐富的查詢語言,功能也更加完善,擅長處理以文本為中心、讀為主導、面向文檔且具有靈活模式的數據,其在數據檢索速度方面遠遠快于MySQL查詢語言,并且可以實現模糊匹配[15-16]。
2.1 Solr排序算法
2.2 Solr基本配置數據導入
在Solr中創建一個屬于新聞檢索的solrcore,配置該solrcore的Solrconfig.xml、data-config.xml文件,將數據庫內容導入Solr,Solr自動對導入的文本進行分詞、建立索引等處理,即可實現存儲數據檢索。從表1中協調因子的計算公式可看出Solr提供多條件查詢,能同時提交多個檢索詞。
Solr Schema文件設置如下,其中配置了新聞ID,還包括新聞鏈接、標題、時間、內容等信息,但配置內容和變量名稱需與dataconfig中配置的參數對應。
Solr中dataconfig文件配置如下,dataconfig文件用于與數據庫的連接,將數據庫內容導入到Solr中,其中數據庫中的“news_id”與Solr中的“id”對應,否則會引起數據導入失敗。數據完全導入Solr后的結果如圖2所示。
3 系統界面設計
系統界面采用PyQt5編寫,PyQt5具有跨平臺、代碼簡潔、開發高效等優點[19]。PyQt使用Qt Designer對界面進行排版,可節省大量開發時間[21-22]。系統界面顯示新聞時間、標題、鏈接等信息,每一頁顯示檢索前30條新聞信息,可通過點擊“下一頁”向Solr發出請求獲得其它相關新聞信息。系統響應過程為:用戶向客戶端發出檢索請求,檢索詞以鏈接形式提供給Solr,Solr將檢索結果以JSON格式返回,客戶端對數據進行處理后顯示給用戶。Solr提供類似Web Service的API接口,因此在一個局域網內均可通過鏈接或者客戶端的形式實現新聞檢索。
4 系統總體結構
系統使用模塊化的設計方法,具有易擴展、易維護等優點,主要包括數據收集模塊,即網絡爬蟲、數據預處理模塊、數據存儲模塊和數據顯示模塊。爬蟲程序定時在網絡上采集新聞信息,這些數據經數據預處理模塊處理后,被插入數據庫并定時更新到Solr服務中,當用戶向服務器發出查詢請求時,服務器會根據查詢關鍵詞,將查詢結果返回給客戶端。
5 結語
本文通過使用Scrapy爬蟲框架進行網絡新聞信息搜集,系統設計過程中,首先考慮系統需求,根據需求設計相應模塊;其次需考慮數據本身,根據數據特質設計相應方法。本文使用Slor服務對新聞信息進行索引并檢索排序,在幫助新聞閱讀用戶快速發現自己感興趣的新聞的同時,還可保證新聞質量。
參考文獻:
[1] 張樹濤,譚海波,陳良鋒,等. 一種高效的分布式爬蟲系統負載均衡策略[J/OL]. 計算機工程:1-7. [2019-03-10]. https://doi.org/10.19678/j.issn.1000-3428.0053439.
[2] 安靖. 面向網絡輿情的檢索系統設計研究[J]. 軟件導刊,2013,12(7):40-41.
[3] 呂振遼,翟瑩瑩,魏彥婧. 面向新聞網的智能抓取技術[J]. 控制工程,2013,20(4):707-710.
[4] 魏冬梅,何忠秀,唐建梅. 基于Python的Web信息獲取方法研究[J]. 軟件導刊,2018,17(1):41-43.
[5] 劉芳云,張志勇,李玉祥. 基于Hadoop的分布式并行增量爬蟲技術研究[J]. 計算機測量與控制,2018,26(10):269-275+308.
[6] 馬聯帥. 基于Scrapy的分布式網絡新聞抓取系統設計與實現[D]. 西安:西安電子科技大學,2015.
[7] 程增輝,夏林旭,劉茂福. 基于Python的健康數據爬蟲設計與實現[J]. 軟件導刊,2019,18(2):?60-63.
[8] 劉燦,任劍宇,李偉,等. 面向個性化推薦的教育新聞爬取及展示系統[J]. 軟件工程,2018,21(2):38-40+34.
[9] 姚白羽. 個性化新聞抓取與聚合系統的研究及實現[D]. 北京:中國科學院大學,2014.
[10] 范傳輝. Python爬蟲開發與項目實戰[M]. 西安:機械工業出版社,2017.
[11] 徐文杰,陳慶奎. 增量更新并行Web爬蟲系統[J]. 計算機應用, 2009,29(4):1117-1119.
[12] 陸浩,盧軍,修榕康. 密碼字典數據去重算法研究[J]. 軟件導刊,2017,16(2):57-59.
[13] 楊頌. 面向電子商務網站的增量爬蟲設計與實現[D]. 長沙:湖南大學,2010.
[14] 成功,李小正,趙全軍. 一種網絡爬蟲系統中URL去重方法的研究[J]. 中國新技術新產品,2014(12):23-23.
[15] 賈賀,艾中良,賈高峰,等. 基于Solr的司法大數據檢索模型研究與實現[J]. 計算機工程與應用,2017,53(20):249-253.
[16] GRAINGER T. Solr實戰[M]. 范煒,譯. 北京:電子工業出版社, 2017.
[17] 郝強,高占春. 基于SolrCloud的網絡百科檢索服務的實現[J]. 軟件,2015,36(12):103-107.
[18] 霍慶,劉培植. 使用Solr為大數據庫搭建搜索引擎[J]. 軟件. 2011,32(6):11-14.
[19] 蘇潭英,郭憲勇,金鑫. 一種基于Lucene的中文全文檢索系統[J]. 計算機工程,2007(23):94-96.
[20] 段國侖,謝鈞,郭蕾蕾,等. Web文檔分類中TFIDF特征選擇算法的改進[J]. 計算機技術與發展,2019(5):1-4.
[21] 張文超,胡玉蘭. 基于PyQt的全文搜索引擎平臺開發[J]. 軟件導刊,2018,17(9):132-135.
[22] SUMMERFIELD M. Rapid GUI programming with Python and Qt: the definitive guide to PyQt programming[M]. New Jersey: Prentice Hall Press,2008.
(責任編輯:江 艷)