濮文強(qiáng),曹 磊,夏 斌
(上海海事大學(xué) 信息工程學(xué)院,上海 201306)
基于Django框架的關(guān)鍵詞排名監(jiān)控系統(tǒng)設(shè)計(jì)
濮文強(qiáng),曹 磊,夏 斌
(上海海事大學(xué) 信息工程學(xué)院,上海 201306)
在B2C的電商交易平臺(tái)上,商品的排名在很大程度上決定著商品的銷量,但人工查看商品排名耗費(fèi)時(shí)間且效率低下。目前市場(chǎng)上一些第三方查詢工具不僅費(fèi)用高,且查詢時(shí)間較長(zhǎng)。為更好地監(jiān)控電商商品的排名信息,設(shè)計(jì)了一款基于Web的商品排名查詢工具,實(shí)現(xiàn)了對(duì)商品的任意關(guān)鍵詞進(jìn)行快速的排名查詢,且對(duì)已查詢的關(guān)鍵詞排名進(jìn)行實(shí)時(shí)監(jiān)控,定時(shí)更新其排名并提示相應(yīng)變化情況。本系統(tǒng)主要基于Python語(yǔ)言進(jìn)行開發(fā),采用了Django框架進(jìn)行Web平臺(tái)的搭建。將該系統(tǒng)部署在安全穩(wěn)定的AWS亞馬遜云平臺(tái)上進(jìn)行使用,經(jīng)過(guò)上線測(cè)試該系統(tǒng)達(dá)到了預(yù)期的效果。
電商數(shù)據(jù);排名;爬蟲;Django
亞馬遜作為當(dāng)前國(guó)際的電商平臺(tái),其擁有十多個(gè)國(guó)際站點(diǎn),對(duì)于海量的商品數(shù)據(jù),亞馬遜獨(dú)有的ASIN碼,有效地管理同一商品在不同國(guó)家的商品詳情[1]。商品的銷量和其排名情況關(guān)聯(lián)度較高,排名越靠前的商品會(huì)被更早地瀏覽及購(gòu)買,因此想要更高的銷量就要對(duì)自己的商品的排名進(jìn)行監(jiān)控與提升。
文本旨在設(shè)計(jì)一種基于B/S結(jié)構(gòu)的商品關(guān)鍵詞排名監(jiān)控,用戶可建立自己的賬戶去添加在不同站點(diǎn)下想要查詢的商品名稱以及對(duì)應(yīng)關(guān)鍵詞下的排名信息,并且系統(tǒng)可自動(dòng)對(duì)商品排名信息進(jìn)行更新并提示排名的變化指標(biāo),整個(gè)系統(tǒng)提供批量查詢以及管理等功能。在B/S結(jié)構(gòu)下也要考慮優(yōu)化用戶的體驗(yàn),系統(tǒng)在設(shè)計(jì)時(shí)需要將效率與準(zhǔn)確性作為設(shè)計(jì)原則。
本系統(tǒng)是基于B/S(瀏覽器/服務(wù)器)結(jié)構(gòu),這種結(jié)構(gòu)將系統(tǒng)功能實(shí)現(xiàn)的核心部分集中到服務(wù)器上,用戶無(wú)需下載與更新客戶端,簡(jiǎn)化了系統(tǒng)的開發(fā)、維護(hù)和使用??蛻魴C(jī)上一個(gè)瀏覽器即可與服務(wù)器進(jìn)行數(shù)據(jù)交互[2]。
系統(tǒng)由Web框架Django搭建而成,Django是開源的Web應(yīng)用框架,由Python語(yǔ)言開發(fā),采用了MVC的設(shè)計(jì)模式,將業(yè)務(wù)邏輯層、前端視圖層、數(shù)據(jù)模型層以高內(nèi)聚低耦合實(shí)現(xiàn)開發(fā)。采用Django可以簡(jiǎn)便、高效地開發(fā)基于數(shù)據(jù)庫(kù)驅(qū)動(dòng)的網(wǎng)站。Django的優(yōu)點(diǎn)是:(1)ORM對(duì)象關(guān)系映射,便捷的數(shù)據(jù)模型設(shè)計(jì)與交互;(2)管理員的管理界面;(3)URL匹配;(4)可擴(kuò)展的模板語(yǔ)言;(5)表單模型;(6)Cache系統(tǒng);(7)內(nèi)置國(guó)際化[3]。
前端主要采用HTML、Javascript、Query、bootstrap相結(jié)合,具有簡(jiǎn)單明了的數(shù)據(jù)顯示以及更方便的用戶操作。
系統(tǒng)結(jié)構(gòu)及邏輯流程如圖1所示。
圖1 系統(tǒng)組成結(jié)構(gòu)及邏輯流程圖
該系統(tǒng)模塊主要分為以下七個(gè)部分。
(1)注冊(cè)登錄模塊
提供用戶注冊(cè)與登錄,每一個(gè)用戶擁有自己的商品排名信息庫(kù),用以保留每個(gè)用戶查詢記錄以及管理商品查詢記錄,使得用戶能更高效、快捷地管理自己的所關(guān)注的商品信息排名。
(2)查詢商品名稱模塊
由于相同的商品在不同國(guó)家的站點(diǎn)下商品名稱不一樣,本系統(tǒng)采用亞馬遜提供的ASIN碼去查詢商品名稱。
(3)查詢排名模塊
系統(tǒng)業(yè)務(wù)的核心功能,用戶可自定義多個(gè)關(guān)鍵詞去查詢商品在不同關(guān)鍵詞下的排名情況。
(4)文件上傳模塊
用戶可通過(guò)模板文件一次多個(gè)產(chǎn)品及對(duì)應(yīng)關(guān)鍵詞,一次性查詢多個(gè)商品的排名信息,查詢結(jié)果可下載。
(5)定時(shí)更新模塊
通過(guò)定時(shí)任務(wù)對(duì)數(shù)據(jù)庫(kù)中所有用戶的商品進(jìn)行關(guān)鍵詞排名的更新,并分析與之前的排名變化趨勢(shì)。
(6)分頁(yè)管理模塊
用戶可以查看到自己所有的查詢記錄以及變化趨勢(shì),對(duì)其進(jìn)行增刪改查等操作。
(7)多線程網(wǎng)絡(luò)爬蟲模塊
針對(duì)一個(gè)商品多個(gè)關(guān)鍵詞同時(shí)查詢的情況,創(chuàng)建對(duì)應(yīng)個(gè)數(shù)的線程對(duì)排名數(shù)據(jù)進(jìn)行抓取,避免同步逐個(gè)關(guān)鍵詞查詢而造成等待時(shí)間過(guò)長(zhǎng)。大幅度地提高爬蟲抓取信息的效率,提高用戶的體驗(yàn)。
用戶在第一次進(jìn)入系統(tǒng)時(shí)需要先注冊(cè),這是為了能對(duì)該用戶所查詢的商品進(jìn)行記錄與更新,登錄完成之后,用戶采用商品的ASIN首先查詢?cè)趯?duì)應(yīng)站點(diǎn)下的商品名稱,而不是用商品名稱去查詢,這是為了讓該系統(tǒng)可以服務(wù)于所有的站點(diǎn)。查詢到商品名稱后,即可以自定義添加多個(gè)關(guān)鍵詞去查詢?cè)谠撽P(guān)鍵詞下的排名情況,在短暫的查詢過(guò)程后,將結(jié)果顯示在Web前端上,并且這些商品以及對(duì)應(yīng)的關(guān)鍵詞都會(huì)被保存到數(shù)據(jù)庫(kù)中,用于定時(shí)地更新這些排名數(shù)據(jù),并在用戶下次進(jìn)行查詢時(shí)直接將更新結(jié)果顯示了出來(lái),而不需要再去等待查詢結(jié)果就可以獲取到最新的排名數(shù)據(jù)。用戶在第二次登錄之后就顯示其查詢的歷史記錄,不僅可以提高用戶的查詢效率,更減輕了服務(wù)器的實(shí)時(shí)壓力。系統(tǒng)數(shù)據(jù)處理流程圖如圖2所示。
圖2 系統(tǒng)數(shù)據(jù)處理流程圖
2.1.1數(shù)據(jù)獲取的方法
在沒(méi)有官方提供的數(shù)據(jù)以及相關(guān)API接口調(diào)用的情況下,網(wǎng)絡(luò)爬蟲是獲取網(wǎng)頁(yè)數(shù)據(jù)信息的有力方法,也是該系統(tǒng)查詢業(yè)務(wù)的核心。網(wǎng)絡(luò)爬蟲具有開發(fā)效率短、易編寫、準(zhǔn)確率高的特點(diǎn)。
2.1.2多線程爬蟲實(shí)現(xiàn)
多線程是指從軟件或者硬件上實(shí)現(xiàn)多個(gè)線程并發(fā)執(zhí)行的技術(shù),能夠在同一時(shí)間執(zhí)行多個(gè)任務(wù),進(jìn)而提升整體處理效率。Python提供了threading對(duì)多線程的支持,同步鎖通過(guò)my_lock = threading.RLock()進(jìn)行獲取,threading.join()將子查詢線程保護(hù),以便在子查詢線程沒(méi)有結(jié)束而執(zhí)行主線程,因?yàn)橹骶€程需要子線程所得出的數(shù)據(jù)。threading.setDaemon()將線程聲明為守護(hù)線程,必須在start() 方法調(diào)用之前設(shè)置,如果不設(shè)置為守護(hù)線程,程序會(huì)被無(wú)限掛起。threading.start()用以啟動(dòng)線程。
由于多個(gè)線程之中處理的關(guān)鍵詞不同以及不同商品關(guān)鍵詞數(shù)量不同,寫入到的數(shù)據(jù)庫(kù)位置也不相同,因此系統(tǒng)還需要對(duì)不同的線程進(jìn)行標(biāo)志以及與創(chuàng)建的線程數(shù)量進(jìn)行對(duì)應(yīng),以保證數(shù)據(jù)寫入的準(zhǔn)確性。在遍歷關(guān)鍵詞的列表時(shí),通過(guò)獲取關(guān)鍵詞的下標(biāo)來(lái)標(biāo)識(shí)是第幾個(gè)關(guān)鍵詞,再依次遍歷進(jìn)行創(chuàng)建線程,保證線程數(shù)量的正確性。
系統(tǒng)采用基礎(chǔ)單線程爬蟲對(duì)商品的名稱進(jìn)行獲取,通過(guò)用戶輸入的ASIN碼以及選擇的站點(diǎn)在后臺(tái)拼接成對(duì)應(yīng)的URL,對(duì)該URL進(jìn)行request請(qǐng)求,再對(duì)返回的響應(yīng)信息采用對(duì)應(yīng)的正則表達(dá)式抓取到商品名稱。當(dāng)用戶添加多個(gè)關(guān)鍵詞以及用戶上傳文件時(shí),由于獲取的是多個(gè)信息,此時(shí)采用多線程網(wǎng)絡(luò)爬蟲,多線程以一種并發(fā)的形式去執(zhí)行任務(wù),提高爬蟲的效率,縮短任務(wù)時(shí)間。但是多線程之間共享變量,在保存數(shù)據(jù)到數(shù)據(jù)庫(kù)進(jìn)行寫入操作時(shí),會(huì)覆蓋掉其他寫入操作,導(dǎo)致查詢結(jié)果只有一個(gè)關(guān)鍵詞排名被寫入到數(shù)據(jù)庫(kù)中。本系統(tǒng)采用多線程鎖的機(jī)制,當(dāng)每個(gè)關(guān)鍵詞排名結(jié)果信息需對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作時(shí),則加上鎖,保證該時(shí)刻開始到數(shù)據(jù)寫入結(jié)束,只有該線程可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,保證了數(shù)據(jù)庫(kù)的一致性。
2.1.3數(shù)據(jù)抓取的正則表達(dá)式
正則表達(dá)式是計(jì)算機(jī)科學(xué)的一個(gè)概念。正則表通常被用來(lái)檢索、替換那些符合某個(gè)模式(規(guī)則)的文本。對(duì)于信息的抓取,原理是對(duì)相應(yīng)的HTML源代碼采用正則表達(dá)式去檢索所需信息。例如商品對(duì)應(yīng)的商品名為The Paw for Dogs,Large。在網(wǎng)頁(yè)的源代碼中,在
2.1.4排名數(shù)據(jù)抓取的實(shí)現(xiàn)
已經(jīng)通過(guò)ASIN以及選擇站點(diǎn)查詢到對(duì)應(yīng)的商品名稱,這時(shí)將用戶所提交的關(guān)鍵詞以及對(duì)應(yīng)該商品的站點(diǎn)構(gòu)建成頁(yè)面URL,該RUL是具有page屬性的,也就是具有翻頁(yè)的功能,通過(guò)對(duì)相應(yīng)頁(yè)面的信息與商品名稱進(jìn)行對(duì)比,若當(dāng)前頁(yè)沒(méi)有匹配到,則跳轉(zhuǎn)到下一頁(yè)繼續(xù)匹配,若跳轉(zhuǎn)到商品的第六頁(yè)時(shí)依然沒(méi)有匹配到,認(rèn)為該商品排名比較靠后。排名的準(zhǔn)確數(shù)據(jù)是通過(guò)匹配的頁(yè)數(shù)以及在當(dāng)前頁(yè)的排名次第計(jì)算而來(lái)的。即排名=(前頁(yè)數(shù)-1)×每頁(yè)的商品數(shù)量+匹配頁(yè)名次。
系統(tǒng)設(shè)計(jì)排名數(shù)據(jù)離不開數(shù)據(jù)庫(kù),采用MySQL數(shù)據(jù)庫(kù)用于存儲(chǔ)數(shù)據(jù),其體積小,速度快,總體成本低,特別是開源的特點(diǎn)使得MySQL作為一般網(wǎng)站首選的數(shù)據(jù)庫(kù)。
本系統(tǒng)的Django框架將把數(shù)據(jù)庫(kù)的操作封裝成ORM(對(duì)象關(guān)系映射)類對(duì)應(yīng)表,屬性對(duì)應(yīng)字段,對(duì)象對(duì)應(yīng)記錄,使開發(fā)者更注重于表的定義與操作,而不是SQL(結(jié)構(gòu)化查詢語(yǔ)句)[4]??稍谙到y(tǒng)的setting.py中配置數(shù)據(jù)庫(kù)參數(shù),在model.py中定義相應(yīng)的class,運(yùn)行python manage.py syncdb,即可在數(shù)據(jù)庫(kù)中生成相應(yīng)的表。系統(tǒng)的表定義為L(zhǎng)oginuser(用戶表),該表主要存儲(chǔ)所有用戶的信息,也是用于數(shù)據(jù)庫(kù)多表查詢時(shí)的外鍵表;Showproduct(商品顯示表)前端顯示用戶所查詢的商品以及所添加的關(guān)鍵詞;Upfile(上傳文件記錄表)用于查詢上傳文件商品排名信息,便于用戶下載;ProductRank(商品排名信息表)記錄所有用戶每一天的所有商品關(guān)鍵詞排名信息,用于展示排名數(shù)據(jù)以及定時(shí)任務(wù)。
系統(tǒng)的外鍵關(guān)聯(lián)表關(guān)系圖如圖3所示。
圖3 系統(tǒng)外鍵關(guān)聯(lián)表關(guān)系圖
2.3.1Django定時(shí)模塊的原理
Django框架的定時(shí)功能主要是利用celery模塊實(shí)現(xiàn)[5]。這個(gè)模塊實(shí)現(xiàn)方便只需要配置好定時(shí)的時(shí)間與任務(wù)即可,在setting文件中配置好定時(shí)的參數(shù)以及安裝對(duì)應(yīng)的插件,再創(chuàng)建task.py文件,將定時(shí)的任務(wù)代碼函數(shù)編寫在里面,但是需要加上裝飾器@task才能將函數(shù)從普通函數(shù)包裝成定時(shí)的函數(shù),在程序運(yùn)行時(shí)會(huì)自動(dòng)掃描該文件。Django框架的管理員界面可以更快地對(duì)定時(shí)任務(wù)的時(shí)間以及任務(wù)進(jìn)行調(diào)整。
2.3.2系統(tǒng)定時(shí)的實(shí)現(xiàn)
本文設(shè)計(jì)的系統(tǒng)中通過(guò)檢索數(shù)據(jù)庫(kù)對(duì)所有用戶的商品排名數(shù)據(jù)進(jìn)行定時(shí)的更新。首先讀取當(dāng)前日期,并對(duì)日期減去一天得到昨天的數(shù)據(jù),將昨天的數(shù)據(jù)的基本信息以今天的日期寫入到數(shù)據(jù)庫(kù)中,多線程爬蟲去獲取此刻的排名情況,并與昨天的排名進(jìn)行比較,將趨勢(shì)也寫入到今日的記錄中去,實(shí)現(xiàn)排名的更新操作。
AJAX(Asynchronous Javascript And XM)是一種交互式網(wǎng)頁(yè)應(yīng)用的網(wǎng)頁(yè)開發(fā),通過(guò)少量數(shù)據(jù)即可實(shí)現(xiàn)后臺(tái)與服務(wù)器的交互,使網(wǎng)頁(yè)實(shí)現(xiàn)異步加載,簡(jiǎn)單地說(shuō)就是可以在不重新加載整個(gè)頁(yè)面即可更新頁(yè)面的數(shù)據(jù)[6]。
本系統(tǒng)在效率原則下在關(guān)鍵詞排名查詢時(shí)采用AJAX技術(shù),將商品的ID序號(hào)POST到后臺(tái),后臺(tái)接受這個(gè)ID,對(duì)應(yīng)數(shù)據(jù)庫(kù)找到對(duì)應(yīng)商品,此時(shí)數(shù)據(jù)庫(kù)中已經(jīng)有關(guān)鍵詞,將這條數(shù)據(jù)取出,再進(jìn)行關(guān)鍵詞排名抓取,將結(jié)果傳到前段進(jìn)行解析。整個(gè)過(guò)程數(shù)據(jù)提供輕量級(jí)JSON格式進(jìn)行傳輸,并沒(méi)有頁(yè)面刷新,減輕了服務(wù)器壓力,在多用戶訪問(wèn)時(shí)不會(huì)出現(xiàn)等待情況,優(yōu)化了體驗(yàn)效果。
系統(tǒng)登錄模塊可實(shí)現(xiàn)將注冊(cè)用戶信息存入數(shù)據(jù)庫(kù)中,并且驗(yàn)證用戶信息是否正確。
通過(guò)ASIN碼以及站點(diǎn)的商品名稱查詢,驗(yàn)證出查詢的準(zhǔn)確性,如圖4所示。
圖4 系統(tǒng)外鍵關(guān)聯(lián)表關(guān)系圖
系統(tǒng)定時(shí)模塊對(duì)數(shù)據(jù)排名進(jìn)行對(duì)比,得出趨勢(shì),如圖5所示。
圖5 關(guān)鍵詞排名變化趨勢(shì)圖
在沒(méi)有官方的數(shù)據(jù)獲取API的情況下,基于網(wǎng)絡(luò)爬蟲來(lái)獲取排名數(shù)據(jù),利用Web框架搭建服務(wù)器方便快速地查詢,并且定時(shí)監(jiān)控排名變化趨勢(shì),既方便了使用者的操作,也節(jié)省了時(shí)間。系統(tǒng)的創(chuàng)新在于將傳統(tǒng)的C/S結(jié)構(gòu)轉(zhuǎn)變?yōu)锽/S結(jié)構(gòu),節(jié)省了客戶端的維護(hù)更新,優(yōu)化了用戶體驗(yàn);其次是充分利用亞馬遜平臺(tái)所提供的ASIN碼實(shí)現(xiàn)跨國(guó)家站點(diǎn)的數(shù)據(jù)查詢,不再是只能針對(duì)一個(gè)站點(diǎn)進(jìn)行查詢;最后將系統(tǒng)搭建在AWS的云平臺(tái)上,可服務(wù)于所有的用戶。經(jīng)過(guò)多次實(shí)驗(yàn)驗(yàn)證,本系統(tǒng)基本實(shí)現(xiàn)了設(shè)計(jì)目標(biāo),在完成各項(xiàng)功能的同時(shí)優(yōu)化了用戶體驗(yàn),提高了效率。
[1] GOPALPUR C C, HALE C C. Online marketplace management system with automated pricing tool[P]. US: US7774238,2010-08-10.
[2] 張友生,陳松喬.ClS與BlS混合軟件體系結(jié)構(gòu)模型[J].計(jì)算機(jī)工程與應(yīng)用,2002,38(23):138-140.
[3] 劉班.基于Django快速開發(fā)Wed應(yīng)用[J].電腦知識(shí)技術(shù),2009,5(7):1616-1618.
[4] 王冉陽(yáng).基于Django和ORM的Web開發(fā)[J].電腦編程技巧與維護(hù), 2009, 5(2):56-58.
[5] SINGHAL N, DIXIT A, SHARMA A K. Design of a priority based frequency regulated incremental crawler[M]. LAP LAMBERT Academic Publishing, 2014.
[6] CRANE D, PASCARELLO E, JAMES D. Ajax in Action[M]. Manning Publications Co., 2005.
Design of keyword ranking monitor system based on Django framework
Pu Wenqiang, Cao Lei, Xia Bin
(College of Information Engineering, Shanghai Maritime University, Shanghai 201306, China)
On electronic business trading platform of B2C, the ranking of goods determines the sales of goods to a large extent, but viewing the product ranking artificially is time-consuming and inefficient. At present some third-party query tools in the market are expensive, and the query time is long. In order to monitor the ranking information of electronic business goods better, this paper designs a Web-based goods ranking query tool, to achieve a quick ranking query using any keyword of the goods, monitor the keyword ranking queried in real time, update the ranking regularly and prompt the corresponding changes. The system is developed based on Python language, using Django framework for Web platform structure. The system is deployed on AWS Amazon Cloud platform which is secure and stable, and achieves the desired results after online test.
electronic business data; ranking; the crawler; Django
TQ35
A
10.19358/j.issn.1674- 7720.2017.20.027
濮文強(qiáng),曹磊,夏斌.基于Django框架的關(guān)鍵詞排名監(jiān)控系統(tǒng)設(shè)計(jì)[J].微型機(jī)與應(yīng)用,2017,36(20):97-100.
2017-03-24)
濮文強(qiáng)(1994-),男,碩士研究生,主要研究方向:商務(wù)數(shù)據(jù)挖掘與處理。
曹磊(1989-),男,博士研究生,主要研究方向:腦機(jī)接口與智能信息處理。
夏斌(1975-),通信作者,男,博士,副教授,碩士生導(dǎo)師,主要研究方向:腦-機(jī)接口、云計(jì)算及人工智能。E-mail:binxia@shmtu.edu.cn。
網(wǎng)絡(luò)安全與數(shù)據(jù)管理2017年20期