基于Python Selenium對阿b短評區(qū)數(shù)據(jù)的統(tǒng)計(jì)總結(jié)
聲明:本專欄所含內(nèi)容系應(yīng)用技術(shù)對公開數(shù)據(jù)的統(tǒng)計(jì)分析,完全符合《用戶規(guī)范》中的規(guī)定
工具:Python Selenium庫,Chrome瀏覽器及Selenium驅(qū)動,F(xiàn)12網(wǎng)頁控制臺
?
本專欄筆者技術(shù)有限,對且此部分內(nèi)容知之不詳,且本專欄技術(shù)難度不高且并不專業(yè),如有知識性錯(cuò)誤或優(yōu)化方案請多包涵。而且筆者的文章能力較弱,可能會有解釋不清的地方,仍請包涵。
?
(如果想要跳過論證過程而直接看到結(jié)論,那么請拉到最后,沒錯(cuò)我就是為了這點(diǎn)醋包的餃子lol)
眾所周知,F(xiàn)12在網(wǎng)頁調(diào)試中是一個(gè)有利工具,你可以在F12中查看網(wǎng)頁源html文件中的元素信息,我們以https://www.bilibili.com/bangumi/media/md4315402#short這部動畫的短評區(qū)為例:

從此可以看到網(wǎng)頁源代碼。那怎么確定某一文本在網(wǎng)頁源代碼中的位置呢?F12大法也為我們提供一個(gè)方便的按鍵,它就在我們偉大F12的最左上角:? ? ? ? ? ? ? ??

單擊后鼠標(biāo)移動到對應(yīng)區(qū)域便可以看到源代碼也隨之移動,單擊顯示具體位置。
那么這跟我們本文的主題有何關(guān)系呢?Python Selenium 是一個(gè)用于網(wǎng)頁自動化測試的第三方庫,而它又被常常用做爬蟲。之所以不選用簡單的BeautifulSoup而選用Selenium,則主要由于這個(gè)原因:

當(dāng)我們下滑鼠標(biāo)時(shí)出現(xiàn)新短評信息,說明這是由動態(tài)html渲染出來的,真正的數(shù)據(jù)不直接在網(wǎng)頁源代碼,而是保存在數(shù)據(jù)庫中,用戶訪問則調(diào)用返回。(事實(shí)上這在此類網(wǎng)頁是非常常用的)
如果我們要使用Selenium獲取網(wǎng)頁某部分信息,那么我們必定要獲取這部分信息所在的位置。那么我們找到了位置怎么傳給代碼呢?偉大的F12門再次為我們提供了方法:

如圖所示,右鍵元素可以復(fù)制元素的selector,js路徑,xpath,這都是非常常用的定位方法。而Selenium使用的是xpath定位,復(fù)制xpath粘貼入對應(yīng)函數(shù)就解決了!
/html/body/div[2]/div[2]/div[2]/div/div[1]/div/div/div[4]/div/div/ul/li[1]這是第一個(gè)評論的完整xpath路徑。
觀察路徑我們可以發(fā)現(xiàn),我們想要的只有l(wèi)i[]中的數(shù)字改變了,改變這個(gè)數(shù)字就可以得到其他評論的路徑,而從路徑中可以提取class為review-stars的元素,其中包含了網(wǎng)頁顯示的“星星“,觀察到星星的class名為icon-star,如果亮,則又為icon-star-light。我們利用find_elements函數(shù)尋找這兩個(gè)class對應(yīng)的所有元素,返回一個(gè)python的list,使用len()就可以得到元素?cái)?shù)目了。累加入全局變量做統(tǒng)計(jì)。

現(xiàn)在只剩下最難解決的一個(gè)問題了:如何不重不漏的在動態(tài)html環(huán)境下統(tǒng)計(jì)數(shù)據(jù)。如果我們直接find_elements,會得到約20個(gè)短評數(shù)據(jù),因?yàn)橐韵碌牟糠诌€沒有被網(wǎng)頁請求獲取??梢园l(fā)現(xiàn)網(wǎng)頁處理獲取新數(shù)據(jù)的方法是滾輪向下至一定位置后加載新的約20條數(shù)據(jù)。此時(shí)若我們?nèi)詅ind_elements會重復(fù)之前的數(shù)據(jù)。因此我們利用xpath語法,對于上一次讀到的最后一個(gè)數(shù)據(jù)所在位置pos,我們選擇position>pos的元素。而pos是個(gè)每次讀取都會增加的變量,我們可以用%d(類似C語法)的方法傳入pos值(這里不能直接寫>pos,因?yàn)閜ython為了防止內(nèi)存泄漏不允許這么做)。

然后對于每次新讀取,我們使用JavaScript的函數(shù)scrollIntoView(),將鼠標(biāo)滾輪移動到pos元素的相應(yīng)位置,使得瀏覽器能加載出來下面的數(shù)據(jù)。該函數(shù)使用Selenium的execute_script()函數(shù)實(shí)現(xiàn),同樣需要用%來傳入pos參數(shù)。

然后小小的sleep零點(diǎn)幾秒,便大功告成了!
雖然如此,但是我實(shí)測會在一千多條數(shù)據(jù)的時(shí)候停下,且與sleep時(shí)間長度無關(guān),推測是雖然滾輪移動至pos位置但是下面仍然沒有加載出來,這可能與具體機(jī)器有關(guān)。因此我設(shè)置重復(fù)嘗試讀取,并且每次嘗試讀取將鼠標(biāo)滾輪向下150個(gè)像素(大約是一個(gè)短評框的長度),最后成功讀到了幾乎所有的數(shù)據(jù)。但是與顯示的13195條不同,少了十幾條為13178條,原因不明(不知道是網(wǎng)站的問題還是代碼的問題),但不足以影響數(shù)據(jù)。
?
說了這么多我們來看數(shù)據(jù)吧:
最終的星星數(shù)empty_stars=65980,full_stars=44934,比率ratio=0.6810。但我沒有獲取長評區(qū)的數(shù)據(jù),由最終分8.2可以估算出長評區(qū)的ratio為約為1.03。由此可推斷出結(jié)論,有能力寫長評的人果然都有著優(yōu)秀的文學(xué)素養(yǎng)與鑒賞能力,其平均分為五又二十分之三星,恭喜。
?
那么本文作為一個(gè)技術(shù)性專欄就到此結(jié)束了。依照類似的方法我們也可以去獲取長評區(qū)數(shù)據(jù)信息。把url換成別的動畫也可以成立。
感謝各位閱讀。
?代碼鏈接:https://www.aliyundrive.com/s/yUPdzvgVzUc 提取碼:8e7r