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