魏海昱,林偉鴻,賀超波
(仲愷農(nóng)業(yè)工程學院信息科學與技術(shù)學院,廣州 510225)
俗話說“民以食為天”,食品安全關(guān)系到民眾的身體健康,是不能被忽略的重大問題。即使我國對食品的質(zhì)量檢驗、安全檢查等方面要求嚴格,但食品安全事件依然頻頻發(fā)生。當下互聯(lián)網(wǎng)高度普及,網(wǎng)絡已經(jīng)成為信息傳播的主要載體,社交平臺通過分享、轉(zhuǎn)發(fā)等功能將內(nèi)容廣泛傳播,尤其是各類視頻網(wǎng)站為網(wǎng)絡輿情的形成帶來了便利性和復雜性。例如,嗶哩嗶哩是我國最具影響力的視頻網(wǎng)站之一,目前其食品安全主題下發(fā)布的視頻數(shù)正在高速增長。很多食品安全事件通過視頻的形式進行傳播,曝光了當前社會存在的食品衛(wèi)生與安全問題,給網(wǎng)民帶來視覺沖擊力的同時也激發(fā)他們對此類事件討論的積極性,進而產(chǎn)生食品安全輿情事件。越來越多網(wǎng)民的觀看、轉(zhuǎn)發(fā)與評論會加速網(wǎng)絡輿情的擴散,不但會降低群眾對食品的消費信心和滿意度,還會影響社會穩(wěn)定。
Ajax(asynchronous JavaScript and XML),中文名為異步JavaScript和XML技術(shù),它結(jié)合了包括異步JavaScript、XML、JSON、DOM、CSS、HTML以及XMLHttpRequest等多項技術(shù)。異步指在請求更新局部內(nèi)容的時候允許Web瀏覽器端在其他地方進行操作,同步則是指請求數(shù)據(jù)時整個頁面都需要更新。在瀏覽器和服務器之間設立了一個Ajax引擎,能實現(xiàn)兩者之間通信的異步化。網(wǎng)站的開發(fā)者將更新頻繁的數(shù)據(jù)或者需要驗證的信息放置在數(shù)據(jù)庫中,當數(shù)據(jù)庫接收到瀏覽器端的Ajax引擎通過JavaScript發(fā)送的請求后,再根據(jù)請求內(nèi)容將需要的數(shù)據(jù)傳送給瀏覽器端。相比傳統(tǒng)的Web應用要把所有用戶請求都交給服務器的交互方式而言,Ajax減少了數(shù)據(jù)的傳輸量,加快了響應速度。Ajax Web的應用模型如圖1所示。
圖1 Ajax Web應用模型
Ajax的使用方法有兩種:①使用XMLHttpRequest對象(XHR)與Web服務器進行異步。在XHR上集成HTTP方法、URL以及JavaScript函數(shù),當瀏覽器端觸發(fā)了Ajax請求,就通過XHR向服務器端發(fā)送請求,將接收的數(shù)據(jù)經(jīng)過DOM重構(gòu)更新到瀏覽器端,然后更新局部數(shù)據(jù)。②使用JQuery進行異步。JQuery是一個快速、簡潔的JavaScript庫,通過JQuery Ajax方法,用HTTP方法從遠程服務器上請求HTML、XML或Json格式的文本,并將數(shù)據(jù)載入到網(wǎng)頁的CSS框架。Ajax接收返回String類型的參數(shù),具體支持的數(shù)據(jù)類型如表1所示。
表1 Ajax數(shù)據(jù)類型
面對多變的Web環(huán)境,爬蟲程序不僅需要優(yōu)秀的爬取策略對目標數(shù)據(jù)進行獲取,還需要高效的架構(gòu)去支撐爬蟲系統(tǒng)的運行,并能夠快速調(diào)整以適應不同環(huán)境的Web服務器。Scrapy是基于Twisted異步處理框架實現(xiàn)的,具有架構(gòu)清晰、模塊間耦合度低、拓展性強等特點。Scrapy框架由Engine(框架的核心,用于整個系統(tǒng)的數(shù)據(jù)流處理,事務觸發(fā))、Item(爬取的數(shù)據(jù)經(jīng)格式化成規(guī)范的對象存儲)、Schedule(處理請求與隊列)、Downloader(下載網(wǎng)頁的內(nèi)容)、Spiders(負責爬取邏輯和網(wǎng)頁解析規(guī)則,處理提取結(jié)果、處理請求)、Item Pipeline(清洗、驗證、存儲數(shù)據(jù))、Downloader Middlewares(處理Enginer和Downloader之間的請求和響應)和Spider Middlewares(處理Spider和Engine的請求和響應)組成。
Scrapy框架首先需要創(chuàng)建項目,生成描述框架各項功能的文件,再將爬蟲需要實現(xiàn)的功能嵌入需要響應的文件中。在使用Scrapy框架后,可拓展性提高,例如在分布式爬蟲的應用上,使用Scrapy框架擴展Scheduler,Downloader等組件,實現(xiàn)同步爬取隊列,結(jié)合Scrapy-Redis庫能夠?qū)崿F(xiàn)Scrapy分布式任務、調(diào)度、去重等功能,使用Scrapyd工具提供的HTTP接口,能夠?qū)崿F(xiàn)部署、啟動、停止、刪除等對爬蟲的操作。
據(jù)統(tǒng)計,互聯(lián)網(wǎng)上的動態(tài)網(wǎng)頁占比在32%左右,并且增速高于靜態(tài)網(wǎng)頁。動態(tài)網(wǎng)頁可以根據(jù)用戶需求加載網(wǎng)頁的局部內(nèi)容,智能地請求數(shù)據(jù),而不是讓瀏覽器重新加載整個頁面。動態(tài)網(wǎng)頁每次更新都會下載少量需要加載的數(shù)據(jù),所需要的帶寬更小,這使得頁面的更新速度更快,節(jié)約了互聯(lián)網(wǎng)資源。目前,對動態(tài)網(wǎng)頁的爬取有逆向分析與Selenium自動化爬取兩種方式。
1.3.1 逆向分析法
動態(tài)網(wǎng)頁使用Ajax技術(shù)后,網(wǎng)頁的數(shù)據(jù)內(nèi)容在Web瀏覽器使用Ajax引擎發(fā)送HTTP請求,通過數(shù)據(jù)庫異步更新至Web瀏覽器端進行渲染顯示。逆向分析法是通過溯源,反向追蹤的方式,找到隱藏在Web服務器前端與數(shù)據(jù)庫后端的交互的Ajax請求以及數(shù)據(jù)存放的位置。在動態(tài)網(wǎng)頁中,向Web服務器發(fā)送每一個帶參數(shù)Ajax請求都能夠返回帶有數(shù)據(jù)信息的數(shù)據(jù)文件,因此可以利用這種特性,分析Ajax請求將靜態(tài)網(wǎng)頁的爬取方法應用到動態(tài)網(wǎng)頁中。
1.效益倒逼建產(chǎn)模式。油田公司首先組織開展難采儲量區(qū)塊分類產(chǎn)能和效益評價,優(yōu)選出效益指標較高的區(qū)塊。然后,以油價50 美元/桶為基準,按照累計產(chǎn)量和內(nèi)部收益率達標(8%)倒算單井在全生命周期(15 年)內(nèi)需要的累計投入。再以操作成本比相鄰單元單井下降25%為依據(jù),測算單井鉆井投資控制目標。以此為據(jù),油田公司每年拿出一定比例工作量與油服企業(yè)協(xié)商談判,雙方達成一致后,油服企業(yè)組織施工建設。效益倒逼合作建產(chǎn)實現(xiàn)了雙方合作共贏,油田公司實現(xiàn)了部分難采儲量開發(fā)動用,盤活了資源,增加了生產(chǎn)能力;油服企業(yè)通過控投降本,盤活了閑置資產(chǎn),增加了收入。
首先通過瀏覽器內(nèi)置的Web開發(fā)者工具追蹤到目標數(shù)據(jù)文件地址,再利用Network工具捕獲Web瀏覽器端發(fā)送的HTTP請求和服務器端的響應找到目標數(shù)據(jù)鏈接,在請求頭部分能獲取到目標數(shù)據(jù)文件的URL地址以及請求所需要的參數(shù)。然后根據(jù)該數(shù)據(jù)URL請求的格式來構(gòu)造目標URL,模擬Web瀏覽器端向目標文件數(shù)據(jù)庫端發(fā)送Ajax請求,最后提取返回的數(shù)據(jù)內(nèi)容。
1.3.2 Selenium自動化獲取
Selenium是Thoughtworks公司開發(fā)的專用于Web自動化測試的工具,支持多種平臺的瀏覽器,如Chrome、Firefox及Android等。Selenium可用于自動化Web應用程序,模擬用戶使用Web瀏覽器的真實行為,例如點擊、滑動、選擇、輸入等操作,引導數(shù)據(jù)庫端更新數(shù)據(jù),捕捉瀏覽器渲染JavaScript后的數(shù)據(jù),做到“所見即可爬”,能夠很好地適應動態(tài)網(wǎng)頁的特性,有效地爬取動態(tài)網(wǎng)頁的數(shù)據(jù)。Selennium自動化爬取方式能避開分析API和JS等交互請求,可以直接爬取絕大多數(shù)的網(wǎng)站。
以上兩種數(shù)據(jù)爬取方法能適用于絕大多數(shù)的動態(tài)網(wǎng)頁,兩者各有優(yōu)劣。逆向分析法具有爬取速度快、消耗資源少等優(yōu)點,但在復雜的互聯(lián)網(wǎng)環(huán)境里適應能力較弱,原因在于其主要應用于Ajax頁面的數(shù)據(jù)爬取,然而Ajax只是其中一種JavaScript動態(tài)渲染頁面的方法,有些網(wǎng)站的部分內(nèi)容是由JavaScript生成,并不包含Ajax請求,也有些網(wǎng)站的Ajax接口包含加密參數(shù),需通過解密參數(shù)才能利用Ajax抓取數(shù)據(jù)。相比而言,Selenium自動化測試爬取動態(tài)網(wǎng)頁的方法適應力強,可以通過模擬用戶使用Web瀏覽器的方式來直接獲取渲染后的網(wǎng)頁源代碼,但這種方法爬取速度慢、占用資源多,對設備和網(wǎng)絡的性能要求高。
在爬取動態(tài)網(wǎng)頁的過程中,可以通過詳細分析要獲取內(nèi)容的存放地點、獲取的難度等多種因素選擇合適的爬取方式。
以嗶哩嗶哩視頻網(wǎng)站的食品安全輿情數(shù)據(jù)爬取為目標,其食品安全熱門視頻往往有很多用戶在評論區(qū)留言,可以爬取這部分輿情數(shù)據(jù)進行分析。以2021年6月的“你點的‘外賣’成本只要幾塊?30秒就出鍋?警惕黑心料理包產(chǎn)業(yè)”視頻為例,視頻截止目前有五百多萬播放量,一萬七千多條評論,在當時引發(fā)過一場關(guān)于外賣食品安全的輿情事件。
打開需要分析的嗶哩嗶哩視頻網(wǎng)頁,使用瀏覽器內(nèi)置的Web開發(fā)調(diào)試工具有利于分析動態(tài)網(wǎng)頁的數(shù)據(jù)傳輸過程。例如在Chrome瀏覽器中,按下F12打開Chrome開發(fā)者工具,需要使用Web開發(fā)者頁面頂部一欄的元素(Elements)、源代碼(Sources)、網(wǎng)絡(Network)等面板工具對動態(tài)網(wǎng)頁數(shù)據(jù)進行抓取。它們的具體功能如表2所示。
表2 Web開發(fā)調(diào)試工具表
使用逆向分析法獲取評論數(shù)據(jù),需要對網(wǎng)頁的網(wǎng)絡請求與響應進行分析,看到返回的評論內(nèi)容是Ajax調(diào)用api.reply這個URL,并返回Jsonp類型的數(shù)據(jù)。在Network選項中,通過對關(guān)鍵詞的查詢,定位至相關(guān)評論的JavaScript請求,在過濾的鏈接里點擊Preview,可以查看從數(shù)據(jù)庫服務器響應的數(shù)據(jù),如圖2所示。
圖2 確定評論位置
接著對請求的URL鏈接進行分析,構(gòu)建爬取相應數(shù)據(jù)的請求URL,獲取該視頻下的所有評論內(nèi)容。點擊該請求后,在Headers一欄能看到相對應的請求頭,從中了解到該方法是從https://api.bilibili.com/x/v2/reply..使用GET方法發(fā)起請求,服務器端響應Json數(shù)據(jù)。在Payload一欄可以查看請求頭提交的Ajax請求參數(shù),如圖3所示。
圖3 Ajax請求參數(shù)
Jquery參數(shù)包含Ajax在請求數(shù)據(jù)時提交的信息,Web瀏覽器端使用HTTP GET從遠程服務器請求到Json格式的文本,再將這些外部數(shù)據(jù)直接載入到網(wǎng)頁的DOM結(jié)構(gòu),渲染顯示在Web瀏覽器上。在嗶哩嗶哩視頻評論內(nèi)容的獲取過程中,需要根據(jù)請求頭構(gòu)建的請求URL鏈接為:https://api.bilibili.com/x/v2/reply?&jsonp=jsonp&pn={}&type={}&oid={}。這里的pn{}表示頁碼,type{}是指響應對象的值,oid{}定位視頻的編號。
逆向分析法爬取的流程圖如圖4所示,分析嗶哩嗶哩視頻評論內(nèi)容的Ajax請求,模擬Ajax請求從數(shù)據(jù)庫中獲取數(shù)據(jù)。在爬取完初始頁面,后續(xù)的頁面更新是通過改變頁碼值pn{}實現(xiàn)的,可以使用循環(huán)的方式對所有頁碼的數(shù)據(jù)進行獲取。判斷爬蟲結(jié)束的條件是頁碼是否循環(huán)完畢,最終爬取該視頻下的所有評論內(nèi)容。
圖4 逆向分析法爬取數(shù)據(jù)的流程圖
基于Selenium爬取評論的流程圖如圖5所示,初始URL為該網(wǎng)頁的URL,本文爬取的評論數(shù)據(jù)來自于網(wǎng)頁https://www.bilibili.com/video/BV1c54y1G7NQ,爬取過程等待渲染的時間與機器性能和網(wǎng)絡狀況相關(guān),在渲染完成之后,需要對數(shù)據(jù)進行定位,再進行數(shù)據(jù)爬取。
圖5 基于Selenium自動化爬取數(shù)據(jù)的流程圖
通過Web開發(fā)調(diào)試工具,找到嗶哩嗶哩視頻評論數(shù)據(jù)在p.text位置上,如圖6所示,通過網(wǎng)頁中的p.text標簽可以獲取評論文本。由于網(wǎng)頁的評論數(shù)據(jù)是以動態(tài)的方式進行更新,加載新的評論數(shù)據(jù)需要往下滑動直至底部才加載完所有的數(shù)據(jù),因此爬蟲的結(jié)束條件是判斷滑動是否觸及網(wǎng)頁的底部,如已經(jīng)觸及底部,不再加載新的數(shù)據(jù),此時就能獲得視頻的所有評論內(nèi)容。
圖6 定位評論數(shù)據(jù)
通過以上實際的數(shù)據(jù)爬取可知,逆向分析法與Selenium自動化爬取的過程略有不同,獲取數(shù)據(jù)的方式也有差別,逆向分析法是通過解析Json頁面來獲取字典的值,而Selenium爬取是通過解析HTML頁面來獲取標簽的值。需要注意的是,無論使用哪種方法都需要注意設置暫停時間,否則短時間對頁面的頻繁操作會觸發(fā)嗶哩嗶哩的反爬取機制。圖7所示為爬取的部分數(shù)據(jù)。
圖7 爬取的數(shù)據(jù)
以“黑心料理包”視頻評論產(chǎn)生的輿情事件為例,該視頻在2021年6月8日發(fā)布,12月對其中的相關(guān)評論進行爬取。通過對評論發(fā)表日期進行數(shù)據(jù)分析,發(fā)現(xiàn)輿情產(chǎn)生的速度、消逝的速度都非常的快。在有效的9000多條評論里,幾乎95%的輿情評論是在視頻發(fā)布當月產(chǎn)生,后續(xù)幾個月輿情評論數(shù)量占比很小,如圖8所示。
圖8 輿情產(chǎn)生時間分布情況
具體查看當月每一天的輿情產(chǎn)生數(shù)據(jù)量,如圖9所示。不難看出在視頻發(fā)布的最初幾天輿情評論快速累積,原因是視頻在第二天上了嗶哩嗶哩熱門視頻排行榜,大量用戶觀看了該黑心料理包視頻后進行激烈的討論,留下不少評論與回復。后續(xù)幾天評論斷崖式減少,在第五天后評論數(shù)趨于穩(wěn)定。因此在食品安全輿情事件的監(jiān)測過程中,應該重點關(guān)注事件發(fā)生后的最初幾天這個時間段,對這段時間的話題變化情況進行分析,并根據(jù)話題的變化趨勢預測并指引輿情的走向。
圖9 當月輿情評論變化曲線
將爬取的評論內(nèi)容數(shù)據(jù)進行去除停用詞處理后,使用jieba中文分詞中的lcut函數(shù)將輿情內(nèi)容分詞,得到文本分詞信息。為了進一步了解食品安全輿情評論的主要關(guān)注內(nèi)容,統(tǒng)計了分詞后出現(xiàn)的排名前20的高頻關(guān)鍵詞,結(jié)果如表3所示。
表3 輿情評論高頻詞匯Top20
在這個“黑心料理包”的輿情事件里,“外在這個“黑心料理包”的輿情事件里,“外賣”“料理”是最高頻出現(xiàn)的兩個詞,反映了本次食品安全事件的突出矛盾是外賣商家使用黑心料理包,嗶哩嗶哩用戶對外賣料理包的情況發(fā)表各自的評論與看法。觀察看出評論出現(xiàn)較多的詞語主要還有“美團”“做飯”“便宜”“味道”“衛(wèi)生”以及“成本”等,充分體現(xiàn)網(wǎng)友們對視頻平臺食品安全視頻發(fā)布后的高度關(guān)注,并對此現(xiàn)象產(chǎn)生的原因進行探討,輿情趨于理性化,沒有往負面的方向發(fā)展。
將分詞后的評論文本進行詞云展示,實現(xiàn)數(shù)據(jù)可視化,繪制的食品安全輿情話題熱點詞云如圖10所示。
圖10 食品安全輿情話題熱點詞云
食品安全牽動著社會民眾的利益與健康,受到廣泛關(guān)注。國內(nèi)食品安全網(wǎng)絡輿情頻發(fā),有效監(jiān)測、跟蹤以及引導輿情的發(fā)展是一個極其重要的問題。本文以嗶哩嗶哩視頻網(wǎng)站關(guān)于“黑心料理包”視頻引起的食品安全輿情為例,利用Scrapy爬蟲框架技術(shù)對視頻評論區(qū)進行爬取,對評論時間及內(nèi)容信息進行統(tǒng)計分析,有效展示了食品安全輿情的發(fā)展狀態(tài)。下一階段將重點對評論文本進行情感分析,識別互聯(lián)網(wǎng)用戶的情緒和態(tài)度,將更有利于食品安全的網(wǎng)絡輿情分析與引導。