国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Scrapy和Elasticsearch的校園網(wǎng)搜索引擎的研究與實(shí)現(xiàn)

2019-12-10 08:06莊旭菲田雪
科技資訊 2019年29期
關(guān)鍵詞:爬蟲(chóng)分詞校園網(wǎng)

莊旭菲 田雪

摘 ?要:針對(duì)通用搜索引擎無(wú)法及時(shí)收錄校園網(wǎng)內(nèi)信息和收錄時(shí)間滯后的問(wèn)題,基于Scrapy框架和Elasticsearch全文搜索引擎,提出了一個(gè)完善的校園網(wǎng)搜索引擎解決方案。該文主要分析了Scrapy的運(yùn)行流程,對(duì)Elasticsearch的搜索機(jī)制進(jìn)行了研究,在此基礎(chǔ)上設(shè)計(jì)了校園網(wǎng)搜索引擎的系統(tǒng)架構(gòu),給出了系統(tǒng)的網(wǎng)頁(yè)抓取模塊、索引檢索模塊、頁(yè)面展示模塊的關(guān)鍵實(shí)現(xiàn)技術(shù)。最后通過(guò)實(shí)驗(yàn)驗(yàn)證,相比于傳統(tǒng)的通用搜索引擎,該文設(shè)計(jì)的校園網(wǎng)搜索引擎的搜索結(jié)果相關(guān)性更好,數(shù)量更多,對(duì)于校園網(wǎng)內(nèi)新信息的收錄情況更好。

關(guān)鍵詞:校園網(wǎng)搜索引擎 ?Scrapy ?Elasticsearch ?中文分詞

中圖分類號(hào):TP391.3;TP393.18 ? 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1672-3791(2019)10(b)-0012-04

近年來(lái),隨著高校數(shù)字化校園建設(shè)的不斷加快,校園網(wǎng)絡(luò)信息呈現(xiàn)出爆炸式增長(zhǎng)。高校校園內(nèi)網(wǎng)站的網(wǎng)絡(luò)拓?fù)淝闆r復(fù)雜,分布于不同技術(shù)架構(gòu)的服務(wù)器上,如果采用傳統(tǒng)的站內(nèi)搜索算法及存儲(chǔ)結(jié)構(gòu),難于實(shí)現(xiàn)高效、精準(zhǔn)的校園網(wǎng)搜索引擎。而由于校園內(nèi)網(wǎng)站多數(shù)使用二級(jí)域名或者直接使用IP地址訪問(wèn),導(dǎo)致傳統(tǒng)的通用搜索引擎無(wú)法準(zhǔn)確、及時(shí)地收錄校園網(wǎng)內(nèi)信息[1]。

為了解決現(xiàn)階段網(wǎng)絡(luò)搜索引擎在校園網(wǎng)應(yīng)用中存在的問(wèn)題,該文對(duì)網(wǎng)絡(luò)搜索引擎的核心原理、關(guān)鍵技術(shù)和工作流程進(jìn)行了深入分析,結(jié)合URL去重策略、防止爬蟲(chóng)被禁止策略、文本分詞等多門技術(shù),提出了一個(gè)基于Scrapy爬蟲(chóng)框架和Elasticsearch全文搜索引擎的校園網(wǎng)搜索引擎設(shè)計(jì)方案,并使用Django框架實(shí)現(xiàn)了搜索引擎的用戶搜索界面。

該文最后的實(shí)驗(yàn)結(jié)果表明,相比于傳統(tǒng)的通用搜索引擎,該文設(shè)計(jì)的校園網(wǎng)搜索引擎能夠及時(shí)、準(zhǔn)確地進(jìn)行校園網(wǎng)信息搜索,搜索結(jié)果的相關(guān)性、準(zhǔn)確性及數(shù)量級(jí)要高于傳統(tǒng)的通用搜索引擎。

1 ?搜索引擎中的關(guān)鍵技術(shù)研究

1.1 Scrapy爬蟲(chóng)框架

Scrapy框架是基于異步I/O的twisted框架,所以Scrapy應(yīng)用在網(wǎng)絡(luò)爬蟲(chóng)時(shí)性能非常高。Scrapy方便擴(kuò)展,提供了很多內(nèi)置功能,這些功能可以加快開(kāi)發(fā)速度。Scrapy主要包含引擎(Scrapy Engine)、調(diào)度器(Scheduler)、下載器(Downloader)、爬蟲(chóng)(Spiders)、項(xiàng)目管道(Item Pipeline)、下載器中間件(Downloader Middlewares)、爬蟲(chóng)中間件(Spider Middlewares)等組件[2]。

Scrapy的運(yùn)行流程可以簡(jiǎn)單理解為:引擎若獲取到應(yīng)答包則發(fā)送給爬蟲(chóng),若獲取到實(shí)體則發(fā)送給實(shí)體管道,若獲取到請(qǐng)求則發(fā)送給調(diào)度器。引擎不停地從調(diào)度器中取出鏈接,封裝成requests發(fā)送給下載器,這個(gè)過(guò)程不斷往復(fù)循環(huán)就是Scrapy的數(shù)據(jù)流向。

1.2 Elasticsearch全文搜索引擎

Elasticsearch是基于Lucene的開(kāi)源搜索服務(wù)器,它在Lucene的基礎(chǔ)上做了改進(jìn),提供了多種語(yǔ)言接口,使搜索變的更加簡(jiǎn)單[3]。近年來(lái)隨著實(shí)時(shí)日志分析平臺(tái)(ELK)的廣泛使用,Elasticsearch也變得越來(lái)越流行。

Elasticsearch既有數(shù)據(jù)的存儲(chǔ),又有數(shù)據(jù)的分析,是當(dāng)前流行的企業(yè)級(jí)搜索引擎。當(dāng)前使用Elasticsearch作為搜索引擎的公司有聯(lián)想微軟、Facebook、GitHub和Adobe等。

Elasticsearch的核心功能是搜索,如圖1所示,描述了將文檔索引到Elasticsearch并從Elasticsearch中搜索到該文檔的全過(guò)程。圖1將坐標(biāo)系分為4個(gè)象限,第一到第四象限分別代表了用戶、原始文檔、Elasticsearch和搜索結(jié)果。

索引過(guò)程:存在如第二象限所示的原始文檔,它包括title與content兩個(gè)字段。在將文檔寫(xiě)入到Elasticsearch中時(shí),Elasticsearch默認(rèn)會(huì)保存兩份內(nèi)容,一份是該文檔的原始內(nèi)容,即_source中的內(nèi)容;另一份是索引時(shí)經(jīng)分詞、過(guò)濾等一系列過(guò)程生成的倒排索引文件。

搜索過(guò)程:第一象限的用戶輸入關(guān)鍵詞python對(duì)文檔進(jìn)行搜索,Elasticsearch接收到查詢關(guān)鍵詞python后到倒排索引表中查詢,通過(guò)倒排記錄表找到關(guān)鍵詞對(duì)應(yīng)的文檔集合,然后對(duì)文檔集合進(jìn)行評(píng)分、排序、高亮處理,最后將搜索結(jié)果返回給用戶。

2 ?校園網(wǎng)搜索引擎的設(shè)計(jì)與實(shí)現(xiàn)

校園網(wǎng)搜索引擎分為三大模塊[4,5],分別為網(wǎng)頁(yè)抓取模塊:通過(guò)采取一定的策略從互聯(lián)網(wǎng)上抓取網(wǎng)頁(yè)信息;索引檢索模塊:對(duì)獲取到的網(wǎng)頁(yè)信息建立快速高效的索引,便于檢索;頁(yè)面展示模塊:將搜索結(jié)果按評(píng)分高低進(jìn)行排序,展現(xiàn)給用戶。

2.1 網(wǎng)頁(yè)抓取模塊

在進(jìn)行網(wǎng)頁(yè)抓取之前,首先需要分析待爬取網(wǎng)站的URL結(jié)構(gòu),選取適合的網(wǎng)頁(yè)搜索策略進(jìn)行數(shù)據(jù)爬取,例如深度優(yōu)先策略、廣度優(yōu)先策略、非完全PageRank策略等。獲取到返回的網(wǎng)頁(yè)信息后,進(jìn)入解析函數(shù)進(jìn)行具體字段的提取,提取的字段信息需要在items.py數(shù)據(jù)容器文件中定義。

2.1.1 URL去重策略

在進(jìn)行數(shù)據(jù)抓取時(shí),若不進(jìn)行URL去重,不僅會(huì)降低爬蟲(chóng)的效率,還會(huì)造成硬件資源的浪費(fèi)。Scrapy框架默認(rèn)的URL去重方法由dupefilters去重器里的RFPDupeFilter類實(shí)現(xiàn),RFPDupeFilter類會(huì)對(duì)每一個(gè)傳遞過(guò)來(lái)的request請(qǐng)求生成信息指紋fp。這種URL去重方法唯一確定了一個(gè)request所指向的資源,但是這種去重方法比較耗費(fèi)內(nèi)存,采用布隆過(guò)濾器則可以改進(jìn)內(nèi)存耗費(fèi)大的問(wèn)題,但布隆過(guò)濾器有時(shí)會(huì)存在“積極的”誤判[6]。相比于互聯(lián)網(wǎng)資源,校園網(wǎng)內(nèi)的信息量較少,采用Scrapy框架默認(rèn)的URL去重方法已經(jīng)足夠。

2.1.2 防止爬蟲(chóng)被禁止策略

爬蟲(chóng)與反爬蟲(chóng)的對(duì)抗機(jī)制長(zhǎng)期存在,為了防止爬蟲(chóng)被禁止,需要采取相應(yīng)的策略[7]。(1)隨機(jī)更換user-agent。該文采用fake-useragent開(kāi)源庫(kù),利用其內(nèi)部維護(hù)的user-agent列表,實(shí)現(xiàn)隨機(jī)更換user-agent。(2)啟用自動(dòng)限速(Auto Throttle)擴(kuò)展。通過(guò)設(shè)置setting.py文件中的“AUTOTHROTTLE_ENABLED=True”即可啟用自動(dòng)限速擴(kuò)展,通過(guò)啟用自動(dòng)限速擴(kuò)展以及對(duì)相應(yīng)參數(shù)的設(shè)置,可以有效地限制爬蟲(chóng)的爬取速度。

2.2 索引檢索模塊

在網(wǎng)頁(yè)抓取模塊中,已經(jīng)從頁(yè)面解析函數(shù)中獲取到了返回的item對(duì)象,此時(shí)需要在pipeline中使用Elasticsearch-dsl將爬蟲(chóng)爬取到的數(shù)據(jù)保存到Elasticsearch中。Elasticsearch的兩大主要任務(wù)是:索引文檔與搜索文檔。索引文檔是將爬蟲(chóng)爬取到的數(shù)據(jù)分詞并構(gòu)建倒排索引,搜索文檔是將用戶輸入的關(guān)鍵詞分詞,匹配出倒排索引中的文檔。

分詞技術(shù)是搜索引擎開(kāi)發(fā)中的重要組成部分,它可以提高搜索結(jié)果的匹配度。Elasticsearch本身的分詞功能是針對(duì)英文的,對(duì)于中文分詞的支持不是很友好。該文使用插件ik提供的ik_max_word分詞器,可以對(duì)文本進(jìn)行最大數(shù)量的分詞,即將文本做最細(xì)粒度的拆分。

2.3 頁(yè)面展示模塊

該文利用Elasticsearch提供的Completion Suggester接口完成搜索建議功能。核心思想是:在index.html里編寫(xiě)一個(gè)函數(shù)用于綁定輸入框的input事件,當(dāng)input發(fā)生變化時(shí),調(diào)用get方法獲取到用戶輸入的查詢關(guān)鍵詞,并向后臺(tái)處理搜索建議的URL發(fā)起請(qǐng)求。

當(dāng)用戶在搜索引擎界面輸入查詢關(guān)鍵詞,點(diǎn)擊搜索按鈕進(jìn)行查詢時(shí),搜索結(jié)果頁(yè)面會(huì)顯示查詢到的搜索結(jié)果、用戶的搜索記錄、搜索熱詞、爬取到的網(wǎng)站的數(shù)據(jù)量和當(dāng)前系統(tǒng)的訪問(wèn)量。處理用戶搜索的核心思想是:當(dāng)用戶點(diǎn)擊搜索按鈕時(shí),調(diào)用add_search方法,獲取用戶輸入的查詢關(guān)鍵詞,并向后臺(tái)處理用戶搜索的URL發(fā)起請(qǐng)求。如果查詢關(guān)鍵詞的長(zhǎng)度大于1,則在搜索記錄數(shù)組中去重并顯示。處理用戶搜索的關(guān)鍵代碼流程如圖2所示。

該文使用Django框架實(shí)現(xiàn)搜索引擎的用戶界面,首先在項(xiàng)目目錄下新建static文件夾,用于存放靜態(tài)文件,接著在urls.py文件中進(jìn)行配置,使得訪問(wèn)http://127.0.0.1:8000/時(shí),顯示為自己定義的搜索引擎用戶界面。配置完成后,用戶搜索界面展示如圖3所示。

搜索建議界面展示如圖4所示。

搜索結(jié)果界面展示如圖5所示。

查詢時(shí),Elasticsearch會(huì)對(duì)每個(gè)符合查詢條件的文檔按照查詢關(guān)鍵詞與文檔的相關(guān)度進(jìn)行評(píng)分,搜索結(jié)果默認(rèn)按評(píng)分降序排序返回給用戶。Elasticsearch5.4之后對(duì)于text類型的字段,默認(rèn)采用BM25評(píng)分模型。

BM25模型是目前比較成功的概率檢索模型。BM25模型在二值獨(dú)立模型的基礎(chǔ)上做了改進(jìn),將文檔長(zhǎng)度、文檔詞頻、idf因子等因素考慮進(jìn)去,BM25模型的評(píng)分公式如下。

對(duì)查詢Q進(jìn)行分詞,并且依次計(jì)算文檔D中的每個(gè)單詞的分?jǐn)?shù),累加后即為文檔D的分?jǐn)?shù)。BM25模型的評(píng)分公式主要由3個(gè)部分組成:第一部分為從二值獨(dú)立模型中推導(dǎo)出來(lái)的相關(guān)性計(jì)算公式;第二部分為查詢關(guān)鍵詞在文檔D中的權(quán)值,其中fi代表詞項(xiàng)在文檔中的詞頻,k1、b是經(jīng)驗(yàn)參數(shù),K是對(duì)文檔長(zhǎng)度的考慮。當(dāng)k1取0時(shí),公式的第二部分為1,此時(shí)不考慮詞項(xiàng)在文檔中的詞頻;當(dāng)b取0時(shí),表示不考慮文檔長(zhǎng)度的因素。第三部分是查詢關(guān)鍵詞自身的權(quán)值,tfta是詞項(xiàng)t在查詢Q中的詞頻,k2是一個(gè)取正的調(diào)優(yōu)參數(shù),用于對(duì)Q中的詞項(xiàng)頻率進(jìn)行縮放,當(dāng)取0時(shí),表示不考慮詞項(xiàng)在Q中的權(quán)值。在沒(méi)有根據(jù)開(kāi)發(fā)測(cè)試集進(jìn)行優(yōu)化的前提下,實(shí)驗(yàn)結(jié)果表明參數(shù)的合理取值應(yīng)為:k1在區(qū)間(1.2,2)中,b取0.75,k2在區(qū)間(0,1000)中。

3 ?實(shí)驗(yàn)結(jié)果分析

為了驗(yàn)證該文所實(shí)現(xiàn)的校園網(wǎng)搜索引擎的可靠性,分別選取了百度站內(nèi)搜索、搜狗站內(nèi)搜索與該文設(shè)計(jì)的校園網(wǎng)搜索引擎進(jìn)行對(duì)比測(cè)試,測(cè)試的對(duì)象為內(nèi)蒙古工業(yè)大學(xué)校園網(wǎng)站,測(cè)試的指標(biāo)為,前20個(gè)搜索結(jié)果的相關(guān)度,測(cè)試的關(guān)鍵詞為“材料科學(xué)與工程學(xué)院舉辦“教授助你成才”系列講座第四期”。對(duì)比結(jié)果如表1所示。

接下來(lái)測(cè)試各搜索引擎對(duì)于校園內(nèi)新發(fā)布信息的收錄情況,測(cè)試對(duì)象與上例相同,測(cè)試的指標(biāo)為,所查詢信息是否被搜索引擎收錄,測(cè)試的關(guān)鍵詞為,內(nèi)蒙古工業(yè)大學(xué)在2019年1月10日發(fā)布的新聞信息“圖書(shū)館黨總支舉辦“中央紅軍長(zhǎng)征與長(zhǎng)征精神”主題黨課”。對(duì)比結(jié)果如表2所示。

測(cè)試結(jié)果證明了對(duì)于給定的查詢關(guān)鍵詞,該文設(shè)計(jì)的校園網(wǎng)搜索引擎的搜索結(jié)果數(shù)量更多,相關(guān)性更好,并且可以有效地解決校園內(nèi)新信息收錄不及時(shí)的問(wèn)題。

4 ?結(jié)語(yǔ)

基于Scrapy框架和Elasticsearch的校園網(wǎng)搜索引擎,成功解決了校園網(wǎng)內(nèi)信息不易被通用搜索引擎收錄與收錄不及時(shí)的問(wèn)題,滿足了校園內(nèi)師生的信息檢索需求。該文的下一步工作是在搜素引擎的基礎(chǔ)上,使用Scrapy-Redis進(jìn)行分布式爬取,提高數(shù)據(jù)爬取效率,并考慮使用布隆過(guò)濾器,降低內(nèi)存使用,進(jìn)一步提升校園內(nèi)師生的搜索體驗(yàn)。

參考文獻(xiàn)

[1] 左衛(wèi)剛.基于Python的校園網(wǎng)搜索引擎研究[J].電子技術(shù)與軟件工程,2018,144(22):40-42.

[2] 云洋.基于Scrapy的網(wǎng)絡(luò)爬蟲(chóng)設(shè)計(jì)與實(shí)現(xiàn)[J].電腦編程技巧與維護(hù),2018(9):19-21,58.

[3] 欽蔣承,沈宏良.基于Elasticsearch的校內(nèi)全文搜索平臺(tái)的研究與實(shí)現(xiàn)[J].現(xiàn)代計(jì)算機(jī):專業(yè)版,2018,634(34):98-102.

[4] Gormley C,Tong Z.Elasticsearchthedefinitiveguide:adistributedreal-timesearchandanalyticsengine[M].Sebastopol,CA:O'Reilly,2015.

[5] 王偉,魏樂(lè),劉文清,等.基于ElasticSearch的分布式全文搜索系統(tǒng)[J].電子科技,2018,31(347):60-63,69.

[6] 焦萍萍.基于python技術(shù)面向校園網(wǎng)原型搜索引擎設(shè)計(jì)[J].電腦知識(shí)與技術(shù),2017(9):20-21,28.

[7] 韓貝,馬明棟,王得玉,等.基于Scrapy框架的爬蟲(chóng)和反爬蟲(chóng)研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2019,29(2):145-148.

猜你喜歡
爬蟲(chóng)分詞校園網(wǎng)
基于Python的網(wǎng)絡(luò)爬蟲(chóng)和反爬蟲(chóng)技術(shù)研究
分詞在英語(yǔ)教學(xué)中的妙用
Python反爬蟲(chóng)設(shè)計(jì)
中職學(xué)校校園網(wǎng)教育功能應(yīng)用現(xiàn)狀及對(duì)策的研究
結(jié)巴分詞在詞云中的應(yīng)用
結(jié)巴分詞在詞云中的應(yīng)用
基于Scrapy框架的分布式網(wǎng)絡(luò)爬蟲(chóng)的研究與實(shí)現(xiàn)
誰(shuí)搶走了低價(jià)機(jī)票
高職院校校園網(wǎng)應(yīng)用存在的問(wèn)題與對(duì)策
網(wǎng)絡(luò)安全技術(shù)在校園網(wǎng)中的應(yīng)用
建宁县| 康乐县| 界首市| 招远市| 泰州市| 延边| 靖西县| 洞头县| 尼勒克县| 南靖县| 临猗县| 博罗县| 阿合奇县| 定陶县| 洪泽县| 莱州市| 灌阳县| 那坡县| 北碚区| 武穴市| 天峻县| 大姚县| 左贡县| 广水市| 邹平县| 巴彦县| 海淀区| 辛集市| 寻甸| 丹江口市| 青州市| 邯郸市| 麻城市| 高安市| 昭觉县| 察哈| 青州市| 绥江县| 英吉沙县| 满城县| 屯门区|