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