文/李依潼 王驥 任肖麗
(廣東海洋大學電子與信息工程學院 廣東省湛江市 524088)
電子商務的興起促進了商業模式變革,物聯網、云計算的出現推動信息爆發式增長,這是電商時代,亦是大數據時代,如何利用海量信息產生更多效益,成為商業競爭的核心[1][2]。獲取有效數據是大數據研究的重點,網絡爬蟲技術是獲取互聯網海量數據的關鍵手段之一。
網絡爬蟲是對不同網頁進行下載和分析,經過存儲、相關度計算、排序,再將關鍵詞展現到用戶面前[1]。本文以爬取京東購物網站網頁數據為例,設計一個基于Scrapy框架的數據分析系統。在Python 3.7編程語言的Scrapy框架下搭建Web爬蟲,爬取京東網站搜索結果前兩頁商品信息、總體評價和每件商品前20頁評論,然后采用MongoDB實現持久化數據存儲,再利用Python生態的Numpy、Pandas數據處理工具包對數據進行清洗、轉換、分組、計算,最終基于Matplotlib實現分析結果可視化。通過反饋回的商品信息與解析結果,為商家制定個性化的營銷策略提供依據。
爬蟲也稱網絡信息爬取技術,通過網頁鏈接地址URL向服務器發送請求獲取網頁信息內容。Web 爬蟲
是一個自動訪問的互聯網程序,用來檢索Web頁面、提取必要信息、存入本地數據庫[3]。
網絡爬蟲基本工作流程如下[4]:
(1)選取精心挑選的種子URL;
(2)將種子URL放入待抓取URL隊列;
(3)從待抓取URL隊列取出待抓取URL,DNS解析后得到目標主機Ip;
(4)下載URL對應的網頁并存儲進已下載的網頁庫中。同時,將這些URL放進已抓取URL隊列;
(5)分析已抓取URL隊列中的URL,獲取必要的數據存入數據庫;
(6)分析其他URL,將URL放入待抓取URL隊列,進入下一個循環。
Scrapy框架是使用Python開發的一種快速、開源的爬蟲程序,可在運行在Windows、Linux等多種主流操作平臺,采用基于Twisted的下載器,提供了豐富的中間接口及較強的目錄約束,編寫代碼清晰、可擴展性好、可移植性強、可維護性高,用戶只需在Scrapy 框架基礎上定制開發模塊即可實現高效的爬蟲應用[5][6]。Scrapy框架由調度器(Scheduler)、下載器(Downloader)、爬蟲(Spider)、實體管道(Item Pipeline)、Scrapy引擎(Scrapy Engine)五大組件構成。爬蟲執行流程如下[7][8]:

表1:工程目錄下文件和文件夾作用

圖1:系統整體架構
(1)Spiders將待爬取網頁URL經Scrapy Engine交給Scheduler;
(2)Scheduler處理后經Scrapy Engine和Downloader Middleware交給Downloader;
(3)Downloader向Internet發送請求,接收Response,將Response經Scrapy Engine和Scrapy Middelwares交給Spiders;
(4)Spiders處理提取Response后經Scrapy Engine交給Pipeline保存;
(5)提取URL重復上述步驟,直到無URL請求或達到停止條件。
數據清洗和處理采用Numpy和Pandas兩個庫,NumPy是Python科學計算的基礎包,作為算法和庫之間傳遞數據的容器,它提供了快速數組處理能力;Pandas能夠進行復雜精細索引,它提供了大量處理結構化數據的函數,更加便捷地完成重塑、切塊、聚合、選取數據子集等操作[9][10]。
數據可視化使用Matplotlib圖形庫,它是用Python 語言編寫的二維圖形庫,充分利用了Python簡潔優美和面向對象的特點,便于繪出直方圖、功率譜、條形圖、散點圖等,Matplotlib提供的相關API,使得圖表可以嵌入Tkinter畫布中。Matplotlib繪制的圖形使用Python標準Tk GUI工具包接口分析數據,再利用Tkinter庫編寫程序的GUI,即可實現數據的可視化呈現。
爬蟲獲取的數據不包含復雜關系,且數據模型經常變動,因此相較于傳統的關系型數據庫,本文選取非關聯數據庫MongoDB。MongoDB是由C++編寫的基于分布式文件存儲的數據庫,支持數據結構松散,查詢語言功能強大,可以存儲復雜的數據類型。同時,MongoDB使用集合的概念存儲數據,不會過多檢測約束關系及數據合法性,存取效率高,對于Web中IO密集型的數據源優勢巨大。
系統主要包括數據來源的爬蟲模塊及數據處理與可視化模塊。首先啟動Scrapy爬蟲對目標網站進行爬取,Piplines接收數據并存儲在MongoDB數據庫中。啟動數據處理和可視化GUI程序,啟動后彈出窗口包含三個頁面,分別是商品總體數據、用戶數據和商品列表頁。商品總體數據展示品牌占比、不同價位的評論分布情況、同類型商品描述詞頻;用戶數據展示用戶身份、用戶下單設備等;列表頁展示爬取到的商品分析數據,雙擊會彈出好評、中評、差評占比,不同時間段的評論分布,用戶情感詞云,評論詞頻。系統總體架構如圖1所示。
3.2.1 項目初始化
選取京東網站作為爬取目標,用scrapy startproject
JD_Spider生成爬蟲項目,項目根目錄為JD_Spider。在根目錄下創建表1所示的文件或文件夾。
3.2.2 數據實體模型
Scrapy需建立實體模型來描述爬取數據[11]。設計的實體模型包括商品信息模型、店鋪信息模型及評論信息模型。其中商品信息模型描述商品名稱、品牌、價格; 店鋪信息模型描述店鋪名、店鋪ID; 評論信息模型描述評論內容、評論時間。MongoDB允許不同集合間出現關聯關系,使得數據庫存儲結構清晰,模型關系如圖2所示。
3.2.3 爬取策略制定
京東評論數量和商品數量巨大,本文只爬取部分數據,爬取最大頁數通過settings.py設置,每次爬取完一個頁面page+1。爬取商品搜索結果時,提取訪問詳情頁URL,使用Ajax技術加載商品評論及整體評價,讓爬蟲向對方服務器發送請求,得到數據反饋后再提取數據。
3.2.4 反爬蟲處理機制
提高爬取成功率需讓爬蟲模擬瀏覽器行為。瀏覽器每次向服務器發送請求時會攜帶User-Agent頭部信息,在middlewares.py文件的中間件內部定義一個包含常用瀏覽器信息的數組:


圖2:爬蟲數據模型關系

圖3:爬蟲執行流程

隨后在中間件鉤子函數process_request中,使用隨機取值方法取出一個列表項,通過request對象設置請求頭,最后在settings.py設置啟用該中間件,即可使爬蟲模擬瀏覽器。當訪問商品詳情頁時,服務器會檢測Referrer請求頭,該請求頭值為跳轉詳情頁之前的上一頁面。當請求詳情URL時,在Scrapy的Request中設置Referer為當前URL,即可以獲取商品詳情頁的數據。
為防止爬取某頁面時突然中止,將每個商品id保存到數組中,當頁面爬取完成時調用對應URL,并將id作為參數向服務器發送請求加載剩下的數據進行解析,再翻頁處理、爬取下一頁。爬蟲執行流程如圖3所示。

表2:目錄下文件和文件夾作用

圖4:界面架構

圖5:數據處理及可視化模塊運行流程
3.3.1 項目初始化
創建名為Analysis目錄文件夾,在該目錄下新建如表2所示的文件或文件夾。
3.3.2 界面設計
使用Tkinter開發界面,界面窗口包括商品整體數據、用戶數據、商品列表三部分,默認頁是商品數據頁,通過UI頂部按鈕切換。在UI主類Application中定義了一個屬性frames,數據結構為字典,然后將三個頁面存儲進字典中并讓其重疊,僅最上面可見,通過改變各頁面的z軸順序切換頁面。圖表的顯示由Tkinter畫布和Matplotlib相結合繪制。界面架構如圖4所示。
3.3.3 商品整體數據
(1)廠商占比。讀取數據庫中Products集合,由Pandas將其轉換為DataFrame,調用grouby函數按brand分組,然后對commentCount列調用sum函數求和,統計出各品牌評論總數,再處理DataFrame提取品牌(brand)和評論數(commentCount)并作為元組返回,最后通過Matplotlib在Tkinter中繪制。
(2)商品描述詞頻。統計前十的描述詞,Pandas讀取商品信息后獲取description信息并轉換為列表數據,然后使用Jieba中文分詞工具對商品描述進行精確分詞,再用Pandas將其轉換為DataFrame,調用agg并結合Numpy的size統計相關詞頻并排序,取前10結果轉換為字典返回,通過Matplotlib在Tkinter中繪制。
(3)商品評價數量隨價格變動。Pandas讀取商品數據,將price字段換為數值類型,分別統計0-1000、1000-2000、2000-3000、3000-5000、5000-6000、6000以上的評論數并返回數據,在通過Matplotlib在Tkinter中繪制。
3.3.4 用戶數據
(1)用戶身份。Pandas讀取所有評論,groupby函數按userLevelName字段分組,調用size求和統計并返回數據,通過Matplotlib在Tkinter中繪制。
(2)下單設備構成。Pandas讀取評論后按userClient
Show字段分組,占比小于1%的字段相加,歸為Others并返回數據,通過Matplotlib在Tkinter中繪制。
3.3.5 商品列表
(1)商品列表顯示。Tkinter的treeview組件從數據庫讀取商品數據顯示在列表中,列表添加雙擊事件,事件觸發時顯示對該商品的數據可視化。
(2)好、中、差評占比。從數據庫中讀取數據并返回,通過Matplotlib在Tkinter中繪制。
(3)評論數量隨時間變動。Pandas讀取數據后轉換為datetime對象,再轉化成year-month形式,按時間分組排序返回數據,通過Matplotlib在Tkinter中繪制。
(4)評論詞頻和詞云。Pandas讀取評論內容后轉化為list,Jieba對評論精確分詞,排除停用詞并統計詞頻返回,在main.py文件中調用函數得到詞頻,選出排名前十的詞繪制詞頻統計表。詞云使用WordCloud讀取詞頻,將詞云顯示出來。
數據處理和可視化模塊工作流程如圖5所示。
settings.py設置關鍵詞為“手機”,最大商品頁數為2,最大評論頁數為20。排除預約階段的產品,啟動爬蟲等待一段時間,爬蟲運行完畢打開MongoDB可視化工具,連接數據庫找到爬蟲保存的數據。抓取到的商品數量為46個,評論數量為9800條,店鋪數量為18家。該結果對于設置最大頁數2頁、最大評論頁數20頁、排除部分預約商品而言完全符合預期。
4.2.1 商品整體數據分析
爬蟲執行完成后,數據庫已存在必要數據,設置好待連接的數據庫,啟動程序顯示商品數據的可視化分析。圖6分別為前兩頁廠商評論數占比和商品描述詞頻。分析可見,Apple、華為、小米占據了銷售前三甲,手機網絡、機身、拍照功能、內存和配置是廠商宣傳的賣點。

圖6:廠商評論占比及商品描述詞頻
4.2.2 用戶數據分析
抓取的9800條評論中,數量最大的是PLUS會員。PLUS會員是京東推出的會員服務,這類用戶注重購物體驗,常購物且更樂于發表評論。評論用戶身份組成如圖7所示。
4.2.3 單一商品數據分析
切換到商品列表頁,買家評論和評論趨勢是評論數據中的重要信息。以華為P30為例,雙擊該記錄,彈出該商品的數據可視化圖表如圖8所示。分析可見,用戶非常認可這款產品,好評率達98.1%,差評1.2%;評論數在2019年8-10月最高,一定程度反映商品發布幾個月后打折促銷,銷量較高。
商品詞頻和詞云反映用戶體驗,如圖9所示。分析可見,用戶體驗主要體現在系統流暢度、外觀、信號方面。

圖7:評論用戶身份組成

圖8:評論占比及高品評論變化趨勢

圖9:評論詞頻和用戶印象詞云
數據是企業無形的競爭力,大數據處理已彰顯不可估量的價值。本文基于爬蟲技術,以京東網站的手機數據作為數據源,采用Python語言下Scrapy框架開發爬蟲程序,爬取數據存入非關聯數據庫MongoDB,通過實例演示數據挖掘并將數據以直觀、易讀的方式可視化呈現。一方面可以讓消費者直觀享受消費過程,另一方面幫助銷售商提煉用戶信息、把控用戶喜好、培養用戶習慣,實現精準營銷。