張荑陽,毛紅霞
(四川大學錦城學院,四川成都,611731)
網絡爬蟲,又被稱為網頁蜘蛛或者網絡機器人,是指按照某種規則從網絡上自動爬取用戶所需內容的腳本程序。[1]本文借助爬蟲技術探究目前國內影視業存在的一種“爛片高票房”的現象,以《小時代系列》電影為例,旨在了解這部電影有哪些元素吸引了觀眾,以及觀眾對這部電影的評論看法,進而分析大眾對此類影片的態度。
實現電影短評數據采集后進行數據清洗和預處理,可視化部分運用WordCloud詞云庫結合matplotlib庫繪制詞云圖、餅圖和條形圖。利用餅圖來分析評分等級,繁冗的文字數據就被圖形替代,能更直觀看到大眾對電影的評分等級分布[1]。使用詞云圖分析,能在頻數統計的基礎上,更加美觀地展示數據,對于重點詞語有更重點的突出展示。
(1)Xpath庫,本文解析網頁的主要辦法,通過request庫獲取網頁數據后,利用Xpath解析四部電影的節點和劇名。它提供了十分簡潔明了的路徑選擇表達式,基本所有定位的節點可用通過Xpath來選擇。
(2)selenium庫,Selenium WebDriver是開源API的集合,可以用于自動測試Web應用程序,并可以在大多數Web瀏覽器上運行,在爬蟲中也有著很好的應用[2]。本文通過selenium自動化模擬登陸操作,與豆瓣網站建立聯系。
(3)multiprocessing.dummy庫,導入Pool模塊,以相同API實現多線程爬取四部電影的熱門短評,借助Pool.map()實現線程順序執行,提高了算法的運行效率。
(4)wordcloud庫,一款展示詞云圖的第三方庫,以詞語為基本單位,當某一個詞語的詞頻越高時,展示在詞云圖中的該詞語顯示越大。
(5)jieba庫,一款用來實現分詞的第三方庫,其語料基于人民日報,冗余度較低,返回中文文本分詞后的列表變量,支持三種分詞模式:精確模式,全模式,搜索引擎模式。本文主要使用lcut()精確分詞模式并導入自定義文檔來對短評內容做中文文本分析。
(6)matplotlib.pyplot庫,pyplot 子模塊提供 bar()函數和pie()函數分別繪制條形圖和餅圖,還提供show()函數顯示正在處理的當前圖形。
(1)使用代理IP,豆瓣網站在爬蟲程序頻繁發起請求后會采取封號策略,除了更換WiFi網絡,還可以使用代理IP,給request.get()方法內添加proxies參數。
(2)selenium模擬登陸,完成登陸操作后借助request.Session()記錄登陸狀態。
(3)使用time庫中的sleep函數,進行強制休眠,在selenium登入時模擬用戶的點擊延時行為。經多次測試,該方法可以有效地應對豆瓣網站的反爬蟲策略。
(4)偽裝User-Agent,User agent是HTTP協議的中的一個字段,其作用是描述發出HTTP請求的終端的一些信息,通過編寫請求頭headers,寫入瀏覽器UA,設置操作系統為“Windows NT 6.1;Win64;x64”,向豆瓣網站發送帶headers參數的GET請求。
依托于聚焦網絡爬蟲技術,對網頁的數據內容進行抓取與分析,可以快速過濾掉與主題無關的URL地址[3]。利用聚焦網絡爬蟲技術,通過獲取初始URL,依據搜索策略來確定下一步爬取所需的URL,過濾與爬取目標無關的鏈接,需要將已爬取的URL地址存入到一個URL列表中,用以判定爬取的進程和避免重復爬取。具體實現通過按鍵f12打開Chrome開發者工具審查元素,找到需要定位的元素,右鍵復制xpath路徑。登陸界面網址的獲取則需要通過網絡面板(Network)記錄的操作信息進行提取。
在已安裝Chromedriver.exe的前提下使用Selenium庫完全模擬瀏覽器的操作,模擬用戶登陸、點擊、下拉、切換窗口等一系列操作,此處導入time包采用休眠的方式強制等待,首先獲取登入界面的url“https://accounts.douban.com/passport/login”通過Xpath方式定位賬號密碼方式登陸選項,使用click()方法點擊選擇,再進行對賬號框和密碼框以及提交信息按鈕的元素定位,使用send_keys()方法傳入賬號和密碼,點擊觸發登陸成功事件。在未登錄豆瓣賬號的情況下,翻頁行為上限為10次,每頁20條評論,爬取結果限制在200條,而登陸狀態下翻頁則不受到限制。
通過分析電影短評界面的URL變化,掌握翻頁規律,在進行翻頁操作時,網頁URL更改的部分是從“?”到“#”之間的參數部分,參數間以“&”作為分隔符,為爬取影評所需的搜索部分、查詢部分。
短評第一頁URL參數部分:start=20&limit=20&statu s=P&sort=new_score
短評第二頁URL參數部分:start=40&limit=20&statu s=P&sort=new_score
每一次翻頁操作后,start增加20,每頁僅顯示20條短評,在代碼中以format格式化函數實現:'start={}&limi t=20&status=P&sort=new_score'.format(page*20)
使用xpath中的@href和text()表達式分別定位四部電影節點下的對應鏈接和電影劇名,存為字典類型,創建4個線程順序爬取4步電影的短評內容。
篩選電影短評中的“熱門”標簽,以分析URL變化規律的方式順序采集數據,爬取到的目標短評數據一共2000行,4列,列名分別為code、host、grade、content。第一列“code”是對每一行數據進行編號,為int類型,第二列“host”是短評人的用戶名,第三列“grade”是電影的評分等級,其評分等級只有六種數據:很差、較差、還行、推薦、力薦和NULL,第四列“content”是短評內容,為文本數據。
數據清洗,從概念上講是基于目標數據,通過采用不同的數據檢測、審查、處理、校驗方法,實現數據糾錯,清除原數據中“臟”的信息,如一些統計調查中的無效值、缺失值、重復數據、異常數據等。[4]其中評分等級和短評內容是本文可視化分析的基本數據,需要進行文本數據清洗,去除空值等無效評論。使用codecs模塊指定以utf-8編碼方式打開短評文件,使用codecs.open()方法讀取文件內容時候,會自動轉換為內部的unicode,一般情況下不會出現編碼轉換失敗讀取錯誤的問題[2]。
為了更精準地展示詞云圖和直方圖,另創自定義文檔,內容是電影特定名詞例如“郭敬明、楊冪、陳學冬”等電影人物名字,使用jieba.load_userdict()加載自定義文檔,利用jieba庫lcut()來實現對句子的最高精度劃分,從分詞結果中剔除例如“我們”,“你們”,“因為”,“所以”,“這個”,“那個”等代詞、冠詞、連詞這類語法型詞匯,再借助collections模塊Counter()方法實現詞頻及常用詞頻度統計,詞頻統計結果存為txt文檔,便于可視化模塊使用。
使用wordcloud庫和imageio融合圖形圖片繪制詞頻統計詞云圖,以劇中四位主角剪影做為背景圖形繪制詞云圖,來展示觀影者對四部電影的評價,首先導入詞云背景圖,設置詞云圖能顯示的最大顯示單詞數為1000,指定顯示字體,設置畫布大小,關閉橫縱坐標顯示,保存為PNG格式的圖片文件。詞云圖繪制結果如圖1所示。

圖1 電影短評詞云圖
餅圖的繪制主要使用到了matplotlib中的基礎繪圖pie()方法,按照列表名索引方式提取短評數據中的評分等級列,使用列表生成式對評分等級列中非空值的出現次數進行計數統計:list=[grade.value_counts()[i] for i in range(5)]并存為列表變量。傳入統計數據值和統計數據標簽,pie()方法中傳入參數autopct="%1.2f%%"自動計算百分比,設置shadow=True陰影顯示和explode突出顯示比重最大的評分等級來實現圖像優化,添加標簽值,保存餅圖為PNG格式的圖片文件。餅圖繪制結果如圖2所示。

圖2 電影評分等級餅圖
根據詞頻統計結果以繪制條形圖的模式[3],得到更清晰、明了的詞頻統計結果。使用matplotlib的子模塊pyplot中的bar()方法繪制條形圖,首先設置圖標跨行跨列,以split()方法以空格作為分隔符切割詞語與頻數,分別存入已定義的列表中。再以切片的方式提取詞頻統計結果前20項詞語,顯示透明度設置為0.8,設置標題和坐標軸名稱字體大小,同樣保存為PNG格式的圖片文件。詞頻條形圖繪制結果如圖3所示。

圖3 詞頻條形圖
系列電影《小時代》是由郭敬明執導,楊冪、柯震東、郭采潔、郭碧婷等領銜主演的青春時尚都市電影。同時該電影也是導演郭敬明同名小說的改編作品,小說讀者基數大,有部分小說閱讀者同時也是電影觀影者。前20項高頻詞語中,郭敬明、顧里、楊冪和四娘這類人名詞語出現次數較多。觀影評分很差和較差比重最大,其次是推薦和力薦。
根據餅圖展示結果,大部分觀影者對于該系列電影的評價偏向負面,近半觀影者給出最低評價“很差”,電影整體評分較低。由詞云圖結果和條形圖結果顯示,電影的明星效應和改編自知名小說這兩個特性對大眾有一定吸引力,觀影者對于電影選角、演員演技和電影劇情有偏好和選擇,系列電影《小時代》的劇情不能滿足部分觀影者的需求。
本文基于豆瓣網站《小時代系列》電影短評,利用python中的selenium庫實現了模擬登陸、Xpath模塊解析網頁、request庫構造請求、jieba庫分詞等爬蟲技術。介紹了算法的具體設計流程,詳細描述了數據可視化部分,并展示結果。使用了多線程對爬取需要翻頁的短評內容進行運行速度的提升。本次對豆瓣網站系列電影《小時代》的爬取實現,證明了網絡規則越來越規范,便利了爬蟲獲取數據,爬蟲可以簡單快速地實現多種任務,它擁有更加廣闊的應用前景[4]。若目標是更全面地分析大眾對該類影片的看法,可根據本文使用的爬蟲方法擴大爬取廣度,采集同類標簽影片的評論數據和評分數據,以及加深爬取深度,分析受眾人群特征,實現更全面的分析。