濮文強,曹 磊,夏 斌
(上海海事大學(xué) 信息工程學(xué)院,上海 201306)
基于Django框架的關(guān)鍵詞排名監(jiān)控系統(tǒng)設(shè)計
濮文強,曹 磊,夏 斌
(上海海事大學(xué) 信息工程學(xué)院,上海 201306)
在B2C的電商交易平臺上,商品的排名在很大程度上決定著商品的銷量,但人工查看商品排名耗費時間且效率低下。目前市場上一些第三方查詢工具不僅費用高,且查詢時間較長。為更好地監(jiān)控電商商品的排名信息,設(shè)計了一款基于Web的商品排名查詢工具,實現(xiàn)了對商品的任意關(guān)鍵詞進行快速的排名查詢,且對已查詢的關(guān)鍵詞排名進行實時監(jiān)控,定時更新其排名并提示相應(yīng)變化情況。本系統(tǒng)主要基于Python語言進行開發(fā),采用了Django框架進行Web平臺的搭建。將該系統(tǒng)部署在安全穩(wěn)定的AWS亞馬遜云平臺上進行使用,經(jīng)過上線測試該系統(tǒng)達到了預(yù)期的效果。
電商數(shù)據(jù);排名;爬蟲;Django
亞馬遜作為當(dāng)前國際的電商平臺,其擁有十多個國際站點,對于海量的商品數(shù)據(jù),亞馬遜獨有的ASIN碼,有效地管理同一商品在不同國家的商品詳情[1]。商品的銷量和其排名情況關(guān)聯(lián)度較高,排名越靠前的商品會被更早地瀏覽及購買,因此想要更高的銷量就要對自己的商品的排名進行監(jiān)控與提升。
文本旨在設(shè)計一種基于B/S結(jié)構(gòu)的商品關(guān)鍵詞排名監(jiān)控,用戶可建立自己的賬戶去添加在不同站點下想要查詢的商品名稱以及對應(yīng)關(guān)鍵詞下的排名信息,并且系統(tǒng)可自動對商品排名信息進行更新并提示排名的變化指標(biāo),整個系統(tǒng)提供批量查詢以及管理等功能。在B/S結(jié)構(gòu)下也要考慮優(yōu)化用戶的體驗,系統(tǒng)在設(shè)計時需要將效率與準(zhǔn)確性作為設(shè)計原則。
本系統(tǒng)是基于B/S(瀏覽器/服務(wù)器)結(jié)構(gòu),這種結(jié)構(gòu)將系統(tǒng)功能實現(xiàn)的核心部分集中到服務(wù)器上,用戶無需下載與更新客戶端,簡化了系統(tǒng)的開發(fā)、維護和使用??蛻魴C上一個瀏覽器即可與服務(wù)器進行數(shù)據(jù)交互[2]。
系統(tǒng)由Web框架Django搭建而成,Django是開源的Web應(yīng)用框架,由Python語言開發(fā),采用了MVC的設(shè)計模式,將業(yè)務(wù)邏輯層、前端視圖層、數(shù)據(jù)模型層以高內(nèi)聚低耦合實現(xiàn)開發(fā)。采用Django可以簡便、高效地開發(fā)基于數(shù)據(jù)庫驅(qū)動的網(wǎng)站。Django的優(yōu)點是:(1)ORM對象關(guān)系映射,便捷的數(shù)據(jù)模型設(shè)計與交互;(2)管理員的管理界面;(3)URL匹配;(4)可擴展的模板語言;(5)表單模型;(6)Cache系統(tǒng);(7)內(nèi)置國際化[3]。
前端主要采用HTML、Javascript、Query、bootstrap相結(jié)合,具有簡單明了的數(shù)據(jù)顯示以及更方便的用戶操作。
系統(tǒng)結(jié)構(gòu)及邏輯流程如圖1所示。
圖1 系統(tǒng)組成結(jié)構(gòu)及邏輯流程圖
該系統(tǒng)模塊主要分為以下七個部分。
(1)注冊登錄模塊
提供用戶注冊與登錄,每一個用戶擁有自己的商品排名信息庫,用以保留每個用戶查詢記錄以及管理商品查詢記錄,使得用戶能更高效、快捷地管理自己的所關(guān)注的商品信息排名。
(2)查詢商品名稱模塊
由于相同的商品在不同國家的站點下商品名稱不一樣,本系統(tǒng)采用亞馬遜提供的ASIN碼去查詢商品名稱。
(3)查詢排名模塊
系統(tǒng)業(yè)務(wù)的核心功能,用戶可自定義多個關(guān)鍵詞去查詢商品在不同關(guān)鍵詞下的排名情況。
(4)文件上傳模塊
用戶可通過模板文件一次多個產(chǎn)品及對應(yīng)關(guān)鍵詞,一次性查詢多個商品的排名信息,查詢結(jié)果可下載。
(5)定時更新模塊
通過定時任務(wù)對數(shù)據(jù)庫中所有用戶的商品進行關(guān)鍵詞排名的更新,并分析與之前的排名變化趨勢。
(6)分頁管理模塊
用戶可以查看到自己所有的查詢記錄以及變化趨勢,對其進行增刪改查等操作。
(7)多線程網(wǎng)絡(luò)爬蟲模塊
針對一個商品多個關(guān)鍵詞同時查詢的情況,創(chuàng)建對應(yīng)個數(shù)的線程對排名數(shù)據(jù)進行抓取,避免同步逐個關(guān)鍵詞查詢而造成等待時間過長。大幅度地提高爬蟲抓取信息的效率,提高用戶的體驗。
用戶在第一次進入系統(tǒng)時需要先注冊,這是為了能對該用戶所查詢的商品進行記錄與更新,登錄完成之后,用戶采用商品的ASIN首先查詢在對應(yīng)站點下的商品名稱,而不是用商品名稱去查詢,這是為了讓該系統(tǒng)可以服務(wù)于所有的站點。查詢到商品名稱后,即可以自定義添加多個關(guān)鍵詞去查詢在該關(guān)鍵詞下的排名情況,在短暫的查詢過程后,將結(jié)果顯示在Web前端上,并且這些商品以及對應(yīng)的關(guān)鍵詞都會被保存到數(shù)據(jù)庫中,用于定時地更新這些排名數(shù)據(jù),并在用戶下次進行查詢時直接將更新結(jié)果顯示了出來,而不需要再去等待查詢結(jié)果就可以獲取到最新的排名數(shù)據(jù)。用戶在第二次登錄之后就顯示其查詢的歷史記錄,不僅可以提高用戶的查詢效率,更減輕了服務(wù)器的實時壓力。系統(tǒng)數(shù)據(jù)處理流程圖如圖2所示。
圖2 系統(tǒng)數(shù)據(jù)處理流程圖
2.1.1數(shù)據(jù)獲取的方法
在沒有官方提供的數(shù)據(jù)以及相關(guān)API接口調(diào)用的情況下,網(wǎng)絡(luò)爬蟲是獲取網(wǎng)頁數(shù)據(jù)信息的有力方法,也是該系統(tǒng)查詢業(yè)務(wù)的核心。網(wǎng)絡(luò)爬蟲具有開發(fā)效率短、易編寫、準(zhǔn)確率高的特點。
2.1.2多線程爬蟲實現(xiàn)
多線程是指從軟件或者硬件上實現(xiàn)多個線程并發(fā)執(zhí)行的技術(shù),能夠在同一時間執(zhí)行多個任務(wù),進而提升整體處理效率。Python提供了threading對多線程的支持,同步鎖通過my_lock = threading.RLock()進行獲取,threading.join()將子查詢線程保護,以便在子查詢線程沒有結(jié)束而執(zhí)行主線程,因為主線程需要子線程所得出的數(shù)據(jù)。threading.setDaemon()將線程聲明為守護線程,必須在start() 方法調(diào)用之前設(shè)置,如果不設(shè)置為守護線程,程序會被無限掛起。threading.start()用以啟動線程。
由于多個線程之中處理的關(guān)鍵詞不同以及不同商品關(guān)鍵詞數(shù)量不同,寫入到的數(shù)據(jù)庫位置也不相同,因此系統(tǒng)還需要對不同的線程進行標(biāo)志以及與創(chuàng)建的線程數(shù)量進行對應(yīng),以保證數(shù)據(jù)寫入的準(zhǔn)確性。在遍歷關(guān)鍵詞的列表時,通過獲取關(guān)鍵詞的下標(biāo)來標(biāo)識是第幾個關(guān)鍵詞,再依次遍歷進行創(chuàng)建線程,保證線程數(shù)量的正確性。
系統(tǒng)采用基礎(chǔ)單線程爬蟲對商品的名稱進行獲取,通過用戶輸入的ASIN碼以及選擇的站點在后臺拼接成對應(yīng)的URL,對該URL進行request請求,再對返回的響應(yīng)信息采用對應(yīng)的正則表達式抓取到商品名稱。當(dāng)用戶添加多個關(guān)鍵詞以及用戶上傳文件時,由于獲取的是多個信息,此時采用多線程網(wǎng)絡(luò)爬蟲,多線程以一種并發(fā)的形式去執(zhí)行任務(wù),提高爬蟲的效率,縮短任務(wù)時間。但是多線程之間共享變量,在保存數(shù)據(jù)到數(shù)據(jù)庫進行寫入操作時,會覆蓋掉其他寫入操作,導(dǎo)致查詢結(jié)果只有一個關(guān)鍵詞排名被寫入到數(shù)據(jù)庫中。本系統(tǒng)采用多線程鎖的機制,當(dāng)每個關(guān)鍵詞排名結(jié)果信息需對數(shù)據(jù)庫進行操作時,則加上鎖,保證該時刻開始到數(shù)據(jù)寫入結(jié)束,只有該線程可以對數(shù)據(jù)庫進行操作,保證了數(shù)據(jù)庫的一致性。
2.1.3數(shù)據(jù)抓取的正則表達式
正則表達式是計算機科學(xué)的一個概念。正則表通常被用來檢索、替換那些符合某個模式(規(guī)則)的文本。對于信息的抓取,原理是對相應(yīng)的HTML源代碼采用正則表達式去檢索所需信息。例如商品對應(yīng)的商品名為The Paw for Dogs,Large。在網(wǎng)頁的源代碼中,在
2.1.4排名數(shù)據(jù)抓取的實現(xiàn)
已經(jīng)通過ASIN以及選擇站點查詢到對應(yīng)的商品名稱,這時將用戶所提交的關(guān)鍵詞以及對應(yīng)該商品的站點構(gòu)建成頁面URL,該RUL是具有page屬性的,也就是具有翻頁的功能,通過對相應(yīng)頁面的信息與商品名稱進行對比,若當(dāng)前頁沒有匹配到,則跳轉(zhuǎn)到下一頁繼續(xù)匹配,若跳轉(zhuǎn)到商品的第六頁時依然沒有匹配到,認為該商品排名比較靠后。排名的準(zhǔn)確數(shù)據(jù)是通過匹配的頁數(shù)以及在當(dāng)前頁的排名次第計算而來的。即排名=(前頁數(shù)-1)×每頁的商品數(shù)量+匹配頁名次。
系統(tǒng)設(shè)計排名數(shù)據(jù)離不開數(shù)據(jù)庫,采用MySQL數(shù)據(jù)庫用于存儲數(shù)據(jù),其體積小,速度快,總體成本低,特別是開源的特點使得MySQL作為一般網(wǎng)站首選的數(shù)據(jù)庫。
本系統(tǒng)的Django框架將把數(shù)據(jù)庫的操作封裝成ORM(對象關(guān)系映射)類對應(yīng)表,屬性對應(yīng)字段,對象對應(yīng)記錄,使開發(fā)者更注重于表的定義與操作,而不是SQL(結(jié)構(gòu)化查詢語句)[4]??稍谙到y(tǒng)的setting.py中配置數(shù)據(jù)庫參數(shù),在model.py中定義相應(yīng)的class,運行python manage.py syncdb,即可在數(shù)據(jù)庫中生成相應(yīng)的表。系統(tǒng)的表定義為Loginuser(用戶表),該表主要存儲所有用戶的信息,也是用于數(shù)據(jù)庫多表查詢時的外鍵表;Showproduct(商品顯示表)前端顯示用戶所查詢的商品以及所添加的關(guān)鍵詞;Upfile(上傳文件記錄表)用于查詢上傳文件商品排名信息,便于用戶下載;ProductRank(商品排名信息表)記錄所有用戶每一天的所有商品關(guān)鍵詞排名信息,用于展示排名數(shù)據(jù)以及定時任務(wù)。
系統(tǒng)的外鍵關(guān)聯(lián)表關(guān)系圖如圖3所示。
圖3 系統(tǒng)外鍵關(guān)聯(lián)表關(guān)系圖
2.3.1Django定時模塊的原理
Django框架的定時功能主要是利用celery模塊實現(xiàn)[5]。這個模塊實現(xiàn)方便只需要配置好定時的時間與任務(wù)即可,在setting文件中配置好定時的參數(shù)以及安裝對應(yīng)的插件,再創(chuàng)建task.py文件,將定時的任務(wù)代碼函數(shù)編寫在里面,但是需要加上裝飾器@task才能將函數(shù)從普通函數(shù)包裝成定時的函數(shù),在程序運行時會自動掃描該文件。Django框架的管理員界面可以更快地對定時任務(wù)的時間以及任務(wù)進行調(diào)整。
2.3.2系統(tǒng)定時的實現(xiàn)
本文設(shè)計的系統(tǒng)中通過檢索數(shù)據(jù)庫對所有用戶的商品排名數(shù)據(jù)進行定時的更新。首先讀取當(dāng)前日期,并對日期減去一天得到昨天的數(shù)據(jù),將昨天的數(shù)據(jù)的基本信息以今天的日期寫入到數(shù)據(jù)庫中,多線程爬蟲去獲取此刻的排名情況,并與昨天的排名進行比較,將趨勢也寫入到今日的記錄中去,實現(xiàn)排名的更新操作。
AJAX(Asynchronous Javascript And XM)是一種交互式網(wǎng)頁應(yīng)用的網(wǎng)頁開發(fā),通過少量數(shù)據(jù)即可實現(xiàn)后臺與服務(wù)器的交互,使網(wǎng)頁實現(xiàn)異步加載,簡單地說就是可以在不重新加載整個頁面即可更新頁面的數(shù)據(jù)[6]。
本系統(tǒng)在效率原則下在關(guān)鍵詞排名查詢時采用AJAX技術(shù),將商品的ID序號POST到后臺,后臺接受這個ID,對應(yīng)數(shù)據(jù)庫找到對應(yīng)商品,此時數(shù)據(jù)庫中已經(jīng)有關(guān)鍵詞,將這條數(shù)據(jù)取出,再進行關(guān)鍵詞排名抓取,將結(jié)果傳到前段進行解析。整個過程數(shù)據(jù)提供輕量級JSON格式進行傳輸,并沒有頁面刷新,減輕了服務(wù)器壓力,在多用戶訪問時不會出現(xiàn)等待情況,優(yōu)化了體驗效果。
系統(tǒng)登錄模塊可實現(xiàn)將注冊用戶信息存入數(shù)據(jù)庫中,并且驗證用戶信息是否正確。
通過ASIN碼以及站點的商品名稱查詢,驗證出查詢的準(zhǔn)確性,如圖4所示。
圖4 系統(tǒng)外鍵關(guān)聯(lián)表關(guān)系圖
系統(tǒng)定時模塊對數(shù)據(jù)排名進行對比,得出趨勢,如圖5所示。
圖5 關(guān)鍵詞排名變化趨勢圖
在沒有官方的數(shù)據(jù)獲取API的情況下,基于網(wǎng)絡(luò)爬蟲來獲取排名數(shù)據(jù),利用Web框架搭建服務(wù)器方便快速地查詢,并且定時監(jiān)控排名變化趨勢,既方便了使用者的操作,也節(jié)省了時間。系統(tǒng)的創(chuàng)新在于將傳統(tǒng)的C/S結(jié)構(gòu)轉(zhuǎn)變?yōu)锽/S結(jié)構(gòu),節(jié)省了客戶端的維護更新,優(yōu)化了用戶體驗;其次是充分利用亞馬遜平臺所提供的ASIN碼實現(xiàn)跨國家站點的數(shù)據(jù)查詢,不再是只能針對一個站點進行查詢;最后將系統(tǒng)搭建在AWS的云平臺上,可服務(wù)于所有的用戶。經(jīng)過多次實驗驗證,本系統(tǒng)基本實現(xiàn)了設(shè)計目標(biāo),在完成各項功能的同時優(yōu)化了用戶體驗,提高了效率。
[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].計算機工程與應(yīng)用,2002,38(23):138-140.
[3] 劉班.基于Django快速開發(fā)Wed應(yīng)用[J].電腦知識技術(shù),2009,5(7):1616-1618.
[4] 王冉陽.基于Django和ORM的Web開發(fā)[J].電腦編程技巧與維護, 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
濮文強,曹磊,夏斌.基于Django框架的關(guān)鍵詞排名監(jiān)控系統(tǒng)設(shè)計[J].微型機與應(yīng)用,2017,36(20):97-100.
2017-03-24)
濮文強(1994-),男,碩士研究生,主要研究方向:商務(wù)數(shù)據(jù)挖掘與處理。
曹磊(1989-),男,博士研究生,主要研究方向:腦機接口與智能信息處理。
夏斌(1975-),通信作者,男,博士,副教授,碩士生導(dǎo)師,主要研究方向:腦-機接口、云計算及人工智能。E-mail:binxia@shmtu.edu.cn。