一次即興的爬蟲經(jīng)歷:A站B站數(shù)據(jù)分析實戰(zhàn)
在很多領域都需要用數(shù)據(jù)來說話,整個數(shù)據(jù)的采集過程也是對思維方式的一次考驗。本篇文章作者介紹了自己的一次爬蟲經(jīng)歷,其中也講述了自己是如何通過轉換思維的方式使得整個過程更加流暢。
說明:我不是技術人員,整個過程并沒有涉及到一定需要技術的地方。
不過,非技術人員去抓取數(shù)據(jù),豈不是更有意思的一件事情?
前幾天,在看B站時,突然想,是不是可以抓取數(shù)據(jù)分析一下?
曾抓取過B站番劇的數(shù)據(jù),用于建立一個番劇排行榜,這次是投稿,難度比抓取簡單的靜態(tài)頁面要大。
一、精益思維,第二桌面
看著電腦屏幕,遇到了第一個困難:爬蟲中很多步驟很耗費資源,筆記本日常要用,我需要第二臺電腦。
靈機一動,服務器是不是可以做第二個桌面呢?剛好雙11各大云服務器商都在做活動,云服務器除了linux系統(tǒng)外,還有windows系統(tǒng)。
沒有用過windows系統(tǒng)的服務器,是否該買一個呢?
想到了精益思維,我需要逐步驗證來確定最適合的選項。
一步步的改變配置,來驗證最適合自己的配置,從CPU核心數(shù)到內(nèi)存到帶寬,云服務器商都提供了按需使用的選項,可以在測試后立刻釋放服務器。
在進行了多次測試后,我陷入了一個新的困惑之中:真的需要第二臺電腦嗎?
這真的是一個必要的選擇嗎?
甚至爬取數(shù)據(jù)進行分析真的是一個有意義的事情嗎?
我正在整理收藏,還有大量的文章沒有歸檔,因此耽誤了計劃,是否值得?
還沒有開始,就已經(jīng)引發(fā)思維碰撞了,這一定會是一次有趣的經(jīng)歷,我決定立刻行動。
此時,確認了需要第二臺電腦,我面臨兩個選擇:是選2核心4G還是選4核心8G的機子,在測試中,我使用的是2核心4G,是可以滿足運行幾個軟件的需求的,測試中使用的帶寬是3-4M,過程中并未出現(xiàn)卡頓情形,這說明3M絕對足夠;
最終選擇了4核8G2M的華為云機器,選擇時,還不知道我將面臨什么,在真正使用時,我將為這個選擇驕傲。
選擇4核8G2M的機子,在滿足了我的需求的同時,也多了一個月的使用期限,騰訊云4核心8G10M,155塊2個月,華為云4核心8G2M,155塊3個月;
選擇2M帶寬,基于對服務器基本信息的了解,服務器帶寬限制是上行,而不是下行,這跟日常使用的家庭網(wǎng)絡完全相反,個人使用則主要使用下行帶寬;
這次選擇服務器的經(jīng)歷,也讓一個基本原則得以完善:不做非必要的選擇,如果做出了選擇,則需避免過度為未知考慮造成過度冗余。
二、開始抓取,研究工具
曾用過一個簡單的抓取工具八爪魚,但只做過最基本的頁面元素抓取, B站投稿頁面并不是簡單的靜態(tài)頁面;
為了避免出現(xiàn)意外,我開始全面研究八爪魚的基本信息,尤其是跟功能限制有關的信息,準備升級為收費版,以便增加可導出的數(shù)據(jù)量,從1萬增加到10萬;
在權衡后,判斷不需要升級,要導出10萬級別的數(shù)據(jù)量,采集所需要的時間會很大,我并沒有準備花費如此長的時間;
在了解服務器端桌面與家庭桌面的區(qū)別時,發(fā)現(xiàn)A站采集兩端一致,B站采集則家庭桌面占優(yōu);我做出了發(fā)揮各自優(yōu)點的選擇:本地運行B站采集任務,服務器端運行A站采集任務;
研究工具信息后,得知可以同時運行兩個任務,但一個賬號只可以同時保持一個在線;為了在服務器端運行程序,我注冊了一個新的賬號,然后準備使用程序的任務導出導入功能連接兩個賬號;
在本地測試完畢后,導出任務,然后導入到服務器端,開始運行;
免費版只有1萬的數(shù)據(jù)導出量,這決定了這將是一次數(shù)據(jù)量嚴重不足的采集,為了緩解這個問題的影響,在生成鏈接時,我使用了隨機數(shù),生成帶有隨機數(shù)字的鏈接。生成鏈接使用的是Excel的基本的組合公式,首先生成一組隨機的數(shù)字,因為B站A站鏈接都是以數(shù)字為基礎的,比如B站的AV號、A站的AC號。
在生成后鏈接后,需要導入審查工具進行監(jiān)測。審查工具是為了檢測生成后的鏈接是否可以打開,不能打開的鏈接無法采集也會讓采集報錯。
為了加快檢測速度,需要多個審查工具并行,我找到一個多開工具,這個工具在后面發(fā)揮了更大的作用,幫助我快速審查了B站的100萬鏈接。
這時,開始進入測試,為了迎接大批鏈接的到來,我需要對采集流程做初步的優(yōu)化。
先行驗證與優(yōu)化,并不需要大量的鏈接,只需要兩個鏈接即可,這一步是為了保證采集數(shù)據(jù)的正確性,采集的慢沒有關系,數(shù)據(jù)一定是自己需要的。
在真正采集B站時遇到了困難,B站的評論并非是同步加載的,需要等待數(shù)據(jù)出現(xiàn),才可以加載出評論數(shù),這限制了采集速度。
在進行了多輪優(yōu)化后,B站的數(shù)據(jù)增加了清晰度的選擇,這可以讓我了解一下視頻平均清晰度,為了研究投稿者粉絲數(shù)對其他數(shù)據(jù)的影響,增加了投稿者粉絲數(shù)的采集。
鏈接審查完畢后,我將鏈接分為兩個任務同時進行。
又發(fā)生了意外,采集到部分數(shù)據(jù)后,會中斷,必須使用更加精準的采集方式,才能解決問題的同時保證采集速度,等待時間、判斷條件都需要重新設定。
曾注意到的一個工具使用中的問題:很難做到邊用邊研究,基本到一個使用水平段就會開始停止,在這次采集中我要避免這個問題,我要邊用刀邊磨刀。
中間有幾次實在是有些想放棄,開始認為自己不可能解決問題,但隨著去研究工具的功能及問題可能的原因,最終所有問題都得到了解決。
在這個過程中,我告誡自己:要相信邏輯帶來的精準,而不要寄望于概率的寬容;解決問題要理清邏輯對癥下藥,不能胡亂嘗試,更不能在毫無根據(jù)的抱有美好的幻想。
采集速度也隨著流程的優(yōu)化而變快,我貫徹了在實踐中變強的理念,每次錯誤都是一次再次進化的機會,最終B站的采集速度從一分鐘兩個增加到了四個,A站的采集速度從一分鐘13個增加到了20個。
邊優(yōu)化邊運行,導致一個新的情況出現(xiàn):有一個舊的任務在運行,有一個新的優(yōu)化后的任務在運行。舊流程沒問題,但是比較慢,新的流程經(jīng)過測試也沒問題,更快。
舊的任務已經(jīng)抓取了2千多個,如果停止,重新開始就要重新抓取,這變成一個數(shù)學題:A在B前2000米,A跑步的速度是2米每分,B跑步的速度是4米每分,問:B需要多久才能追上A?
答案是1000分鐘后,A又跑了2000米,B跑了4000米,假如總里程是8000米,應該立刻停止A,使用B的流程,假如總里程是3000米,就應該讓兩個任務同時進行。
不過,第一次做出的選擇通常不是最優(yōu)的選擇,最優(yōu)選擇是停止舊的任務,將已經(jīng)采集的數(shù)據(jù)導出,去除已采集的鏈接,在新的任務中只采集未采集的鏈接。
三、轉換思維,導入數(shù)據(jù)庫
將數(shù)據(jù)導出后,有了第一個真正的數(shù)據(jù)表,我該如何處理數(shù)據(jù)?是不是需要將數(shù)據(jù)可視化呢?
由于缺乏數(shù)據(jù)分析的基礎經(jīng)驗,我開始陷入迷茫。
前幾天,偶遇一個百度的可視化工具(https://sugar.baidu.com),當時試用了一下,沒有成功;再次打開,準備解決上次遇到的問題:數(shù)據(jù)庫沒有連接成功;在修改了服務器的放行端口后,問題解決。
但這個工具只可以從數(shù)據(jù)庫中獲取數(shù)據(jù),不能提交excel格式的數(shù)據(jù),我手頭是Excel。
準備棄用工具時,我轉換了思維,想到一個解決方案:把excel導入mysql不就行了。
搜索后發(fā)現(xiàn)phpmyadmin是可以導入csv格式的數(shù)據(jù)的,將excel格式另存為csv后,導入了數(shù)據(jù)庫。
這是我第一次使用phpmyadmin,第一次在數(shù)據(jù)庫內(nèi)建表,遇到了很多尷尬,按照excel中的列的順序確認了表的字段以及屬性后,提交成功了,導入數(shù)據(jù)也成功了。
然后驚喜的發(fā)現(xiàn),phpmyadmin自帶一款基本的可視化工具:
可是,有可視化工具又能如何?數(shù)據(jù)根本無法使用,這個數(shù)據(jù)就不具備任何結構和邏輯,這不是有意義的數(shù)據(jù)。
我需要的并不是工具,而是能夠使用工具的數(shù)據(jù)邏輯;首先要做的是理清數(shù)據(jù)的基本邏輯,再尋找適合的工具,工具應該是邏輯的延伸。
四、回歸數(shù)據(jù),邊等采集邊研究
話又說回來,一定要去外面找工具嗎?Excel不行嗎?
返回excel再次去看這一大堆混亂的數(shù)據(jù),該如何理清頭緒呢?
我需要一個突破口,那么什么能作為突破口呢?
我想到了用戶的分層概念,數(shù)據(jù)也可以用此概念進行分層;要分層,就需要基準維度,選哪個維度對數(shù)據(jù)進行初始化呢?
我選擇了播放量,然后根據(jù)播放量的大小對數(shù)據(jù)做了十幾個分類,數(shù)據(jù)開始清晰鮮活。
這時,我根據(jù)分類的過程總結了一句話:不做出有意義的分類,就無法做出有意義的洞察。
播放量本身屬于一個基本指標,單獨觀察并無意義,通過與其他數(shù)據(jù)指標進行組合,卻可以形成很多有意義的新的數(shù)據(jù)指標。
我對數(shù)據(jù)進行了整理,數(shù)據(jù)成為了可被使用的數(shù)據(jù):
開始統(tǒng)計,并進行計算,在此過程中,我全面使用了自動化的思維:凡是需要手動重復兩次的操作,全部尋求自動化實現(xiàn)。
自動化實現(xiàn)執(zhí)行的很順暢,直到出現(xiàn)新的情況:為了算平均數(shù),需要生成一堆公式,但是公式一旦生成,就會立刻生效,根本無法復制使用。
在各種嘗試中,不停的報錯:
這個不停彈出的報錯窗口,反而給了我啟發(fā):是否可以生成一個錯誤的公式,讓其不生效,生成后復制到相應的位置后,再批量改為正確的公式,讓其生效。
經(jīng)過測試,在所有公式前加一個字符導致其失效確實可行。
復制后得到了第一份數(shù)據(jù):
這個故事告訴了我兩個道理:
- 錯誤本身也是信息;
- 永遠不缺意外,但只要沉著應對,不輕易放棄,不局限于已有的知識經(jīng)驗,一定能找到解決方案。
為了觀察播放量與各個數(shù)據(jù)的關系,我又建立了幾個新的數(shù)據(jù)指標:播放量/彈幕、播放量/評論等,這些組合指標表明了多少分子指標對應一個分母指標;
數(shù)據(jù)顯示:平均 301次播放對應一個彈幕,136次播放對應一次贊,300次播放對應一個投幣,171次播放對應一次收藏,232次播放對應一個評論。
根據(jù)對應關系,可以判斷獲取的難度為:贊<收藏<評論<投幣<彈幕。
此時,原始數(shù)據(jù)表中還有一個分區(qū)數(shù)據(jù)沒有使用,我希望能找出其意義,以便充分使用數(shù)據(jù);
分區(qū)出現(xiàn)的頻率,可以用來判斷其熱度,做一個排行來看最熱門的B站分區(qū);我找到一個公式,對其進行了統(tǒng)計,得出了一個分區(qū)熱度統(tǒng)計:
分區(qū)排行與原數(shù)據(jù)表組合成了新的數(shù)據(jù)表:
似乎還缺了點什么?一直以來都很佩服B站用戶的參與度,如今有了機會,何不制定一個新的數(shù)據(jù)指標來進行觀察呢?
我定義了一個新的數(shù)據(jù)指標:互動指數(shù),由互動行為除以播放量得出:互動指數(shù)=(彈幕+投幣+評論+收藏+贊)/播放量。
將小數(shù)點定義為3位,得出了每千次的互動量:
最終得到的平均互動指數(shù)是0.024,也就是每千次有24次互動。
這些數(shù)據(jù)分析及結果都基于試驗用的數(shù)據(jù),精確性很有問題,但是這次試驗性的研究為大量數(shù)據(jù)的研究打下了基礎,在全部采集完畢后,全部采集數(shù)據(jù)的處理很快完成了,這是最終的數(shù)據(jù)表:
終得到的互動指數(shù)為0.044,每千次44次互動,由于采集的數(shù)據(jù)樣本仍然相對過少,所以這個數(shù)據(jù)只能參考。
一般的非社區(qū)型產(chǎn)品互動指數(shù)小于千分之一(依據(jù)我曾參與過的非社區(qū)型產(chǎn)品),每千次PV對應不足一次互動行為,B站互動指數(shù)是非社區(qū)型產(chǎn)品的50倍以上。
從上面數(shù)據(jù)中可以發(fā)現(xiàn),試驗數(shù)據(jù)與最終數(shù)據(jù)得出的結論差別很大,根據(jù)B站的數(shù)據(jù)量,至少需要分析100-1000萬數(shù)據(jù)才能得到有可信度的數(shù)據(jù);
接下來就是分析A站數(shù)據(jù),大致步驟也是一樣的,這是最后的數(shù)據(jù)表:
分析A站數(shù)據(jù)時,發(fā)現(xiàn)了一些異常數(shù)據(jù),我將其中過于異常的數(shù)據(jù)刪除了,比如100萬播放,一個評論都沒有的視頻。
從A站播放量的分布中可以看出A站跟B站的播放量分布有一定的區(qū)別:數(shù)據(jù)顯示A站播放量在1千-3千的視頻占比在60%以上,一半以上的視頻獲得了超過1000次的瀏覽。
后面還會計算A站與B站的日均新增視頻數(shù),日均新增量的明顯差別可能是原因之一。
在審查鏈接時,發(fā)現(xiàn)有一些鏈接是失效的,這個失效數(shù)據(jù)背后說明了什么?
傅盛說現(xiàn)象即規(guī)律,放在數(shù)據(jù)分析中可以說數(shù)據(jù)即意義,我需要找到數(shù)據(jù)背后的意義;失效代表了異常,包括但不限于未審核通過、UP主刪除、被刪除等等情況。
我為此定義了一個新的數(shù)據(jù)指標:異常系數(shù),用來判斷每個網(wǎng)站在前端真實的視頻比例。
準備看一下A站與B站在2018年每個月的日均新增視頻數(shù)據(jù),做一個對比,異常系數(shù)可以用于排除異常數(shù)據(jù);
根據(jù)數(shù)字(B站AV號、A站AC號)增加1即是增加一個視頻的基本原理,可以算出每個月日均新增數(shù)字,是未排除異常的數(shù)據(jù);
我使用的方法是先找出每個月特定時間點附近的數(shù)字:
相減后除以當月的天數(shù),得到了每個月未去異常的日均新增視頻數(shù)據(jù):
為了使異常系數(shù)更加精確,需要盡量多的數(shù)據(jù)參與計算,最終我選擇B站100萬數(shù)據(jù),A站45萬數(shù)據(jù),為了保證分散,B站鏈接仍然是在2018年的視頻里進行隨機生成。
多開工具立下了很大的功勞,在服務器端的桌面上,并行5個以上的審查工具,如果當初我選擇了2核心4G的服務器,最多只能并行2-3個審查工具。
全部審查完畢后,我進行了計算:異常系數(shù)=(總數(shù)據(jù)-正常數(shù)據(jù))/總數(shù)據(jù);A站總數(shù)據(jù):449228,正常數(shù)據(jù):277694,異常系數(shù):0.38。
B站總數(shù)據(jù):966753,正常數(shù)據(jù):705888,異常系數(shù):0.27。
有了各自的異常系數(shù),就可以計算A站和B站日均新增的凈值了,公式:凈值=(1-異常系數(shù))x全部數(shù)據(jù);以下是日均新增凈值:
A站在2018年前十個月內(nèi)日均凈新增1060個視頻,B站日均凈新增41312個視頻。
這時,又想到了可視化數(shù)據(jù),為了對比更為直觀,我選擇以下三個數(shù)據(jù):
1. 各類播放量視頻占比對比:
2. 互動指數(shù)對比:
3. 日均新增視頻數(shù)對比:
- 日均新增全部數(shù)據(jù)對比(含異常數(shù)據(jù)):
- 均新增凈值對比:
后記
當看到B站清晰度數(shù)據(jù)時還是驚呆了,B站2018年新增視頻平均清晰度超過了800P,如果沒有這些數(shù)據(jù)支持,我不可能想到。
抓取數(shù)據(jù)及進行基礎分析的過程到此已經(jīng)結束了,過程中用到的部分工具及知識,我分享在了這里:https://open.skyfollowsnow.pro/?thread-55.htm。
整個采集過程,我使用了很多思維,比如精益思維、逆向思維、自動化思維,但印象最深的還是靈性思維。
在使用excel時,我全面使用了自動化思維,節(jié)省了很多時間,后面開始事事都要找到自動化的實現(xiàn)方式,在某個數(shù)據(jù)生成時,使用自動化時遇到了一點困難,這個數(shù)據(jù)其實并不需要自動化執(zhí)行,使用excel自帶的填充功能也有很好的執(zhí)行效率。
當時我想起了最近一直在研究的半本能半理性的工作方式,為了讓行動充滿靈性,必須不斷思考出發(fā)的原因。
我很快醒悟了過來,自動化思維是為了快速執(zhí)行我的想法,而我的想法快速執(zhí)行卻不一定非要自動化思維,事事自動化反而讓自己受到了局限。
這次實踐,讓我對靈性有了更深的理解:帶著目的地去旅行,不僅不會迷路,還可以脫離具體路徑的限制。
大道萬千,意,當為形先!
作者:天下雪,公眾號:skyfollowsnow
本文由 @天下雪 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉載。
題圖來自 Unsplash ,基于 CC0 協(xié)議
覺得這些數(shù)據(jù)還有待挖掘,現(xiàn)在的結果沒有太多價值
很棒,要抱大神的大腿腿