「全民k歌」有什么秘密?網(wǎng)站數(shù)據(jù)分析之?dāng)?shù)據(jù)獲取
最近看到身邊好幾個(gè)朋友都在用“全民K歌”這款軟件在手機(jī)上K歌,使用頻率還是很高,于是就想來(lái)看看全民K歌平臺(tái)的用戶究竟是一群什么樣的用戶?他們有什么樣的特征。然后進(jìn)行數(shù)據(jù)分析,強(qiáng)化自己的分析思維與實(shí)戰(zhàn)能力。這一個(gè)過(guò)程我將會(huì)分為四個(gè)部分來(lái)寫(xiě):數(shù)據(jù)獲取,數(shù)據(jù)清洗,數(shù)據(jù)的呈現(xiàn),分析報(bào)告的撰寫(xiě)。本文是第一部分。
python爬蟲(chóng)獲取用戶數(shù)據(jù)
進(jìn)入用戶的個(gè)人中心,下面的圖中畫(huà)方框的地方就是我們需要獲取的數(shù)據(jù):
接下來(lái)我們看一下這些數(shù)據(jù)的存儲(chǔ)方式,打開(kāi)nt之后我們可以看見(jiàn)這些數(shù)據(jù)都存儲(chǔ)在網(wǎng)頁(yè)中,這樣就非常容易獲取了,這里需要注意的有兩點(diǎn):一個(gè)是年齡和地址,這兩者需要在獲取之后分開(kāi)進(jìn)行存儲(chǔ),便于后面分析(粉絲數(shù),關(guān)注數(shù)也是同理);另外一點(diǎn)就是性別問(wèn)題,在網(wǎng)頁(yè)中我們沒(méi)有發(fā)現(xiàn)直接指示性別的關(guān)鍵詞,其實(shí)這里的性別是存放在畫(huà)紅色圈中的class的名字里面的“icon icon_boy”如果是女孩則是“icon icon_girl”,這里獲取之后我們用split去掉無(wú)關(guān)字符,只取boy和girl關(guān)鍵詞。
我們直接用BeautifulSoup來(lái)獲取這些數(shù)據(jù):
這些數(shù)據(jù)也就是我們最終需要的數(shù)據(jù),我們將他們存放在Mongodb數(shù)據(jù)庫(kù)中,以便于后面的分析與導(dǎo)出:
通過(guò)分析我們發(fā)現(xiàn)每一個(gè)用戶的個(gè)人主頁(yè)鏈接都僅僅只是ID不同,我們將這些ID也存放起來(lái),方便后面獲取這些用戶所唱的歌曲,這個(gè)后面獲取到id之后直接傳回來(lái)就可以獲得這個(gè)用戶的個(gè)人信息了。
獲取多個(gè)用戶的數(shù)據(jù)
為了獲得更多用戶的數(shù)據(jù),我們需要從用戶A進(jìn)入它的粉絲頁(yè)面,獲取粉絲的ID,然后再進(jìn)入粉絲B的個(gè)人主頁(yè)獲取用戶的信息,再?gòu)倪@些粉絲的主頁(yè)獲取他們的粉絲。類(lèi)似一個(gè)遞歸的形式,思路是這樣,但在后面實(shí)際運(yùn)行的時(shí)候,python老師出錯(cuò),個(gè)人感覺(jué)應(yīng)該是堆棧溢出了,目前還是沒(méi)有搞定,但是可以獲取粉絲的二級(jí)列表,對(duì)于目前的分析來(lái)說(shuō),已經(jīng)足夠了。
在用戶的粉絲頁(yè)面我們看到用戶的粉絲列表是逐步加載的,也就是異步加載的形式,我們就只能來(lái)抓包了。
我們可以看見(jiàn)用戶的粉絲數(shù)據(jù)是用json形式存儲(chǔ)的,在每一次加載,一共加載20名粉絲的信息,這里我們只獲取uid標(biāo)簽的值。接下來(lái)問(wèn)題來(lái)了,我們獲取的只是用戶的前20名粉絲,如何獲取其他的粉絲呢?方法肯定就是替換鏈接了,經(jīng)過(guò)反復(fù)的查找,發(fā)現(xiàn)在已有的鏈接中每次加載變化的起作用的字段就是這個(gè)紅色圈內(nèi)的字段:
但是這樣的一個(gè)數(shù)據(jù)是從哪里來(lái)的呢?如果是隨機(jī)生成的就沒(méi)有辦法了獲取下一級(jí)列表了。經(jīng)過(guò)查找,我們發(fā)現(xiàn)這個(gè)last_tm的值在上一級(jí)的數(shù)據(jù)中存放著。這一下就好辦了,只需要在第一次獲取用戶id的同時(shí),將last_tm的值也同時(shí)獲取下來(lái),下一次加載時(shí),直接掉用即可。
我們知道了如何分頁(yè),如何獲取存儲(chǔ)的數(shù)據(jù),那么到底該循環(huán)多少次才能把所有的用戶都獲取下來(lái)呢?在最開(kāi)始,我們已經(jīng)知道了用戶粉絲有多少,那么分多少也不就簡(jiǎn)單了。用粉絲數(shù)除以每頁(yè)粉絲數(shù)20然后取整就是我們的循環(huán)次數(shù)了。
下面是獲取用戶粉絲的代碼:
最后一共只爬取了8671條用戶數(shù)據(jù),數(shù)據(jù)量還是比較少,但做分析之用,基本夠了。
python爬蟲(chóng)獲取歌曲數(shù)據(jù)
在上面我們已經(jīng)獲得了8千多位用戶,那么這些用戶平時(shí)都喜歡唱什么歌,他們的活躍頻率如何,這些都可以從用戶發(fā)布的歌曲中獲得一些信息。
這里是歌曲頁(yè)的數(shù)據(jù)獲取情況,其中最為重要的就是畫(huà)紅色圈的部分了,因?yàn)檫@一部分?jǐn)?shù)據(jù)顯示了用戶的活躍時(shí)間,已經(jīng)所使用的手機(jī)型號(hào),這個(gè)手機(jī)型號(hào)在一定程度上就代表了這個(gè)用戶的特征,所以這個(gè)數(shù)據(jù)是極為重要的。
同樣的,這些歌曲的列表是用異步加載的形式顯示的,我們直接來(lái) 抓包:跟上面一樣是用json來(lái)存儲(chǔ)信息的,我們直接解析獲取,對(duì)于手機(jī)型號(hào)這一部分沒(méi)有的,待會(huì)兒?jiǎn)为?dú)獲取。
下面就是翻頁(yè)的問(wèn)題了,我們打開(kāi)heahers查看鏈接比較之后發(fā)現(xiàn)每翻一頁(yè),連接中start便加1,而每一頁(yè)有8條數(shù)據(jù),這樣一來(lái)每一個(gè)用戶的作品我們需要翻的頁(yè)數(shù)就是作品數(shù)除以8取整即可。
最后我們單獨(dú)用一個(gè)函數(shù)來(lái)獲取時(shí)間信息:
最后將所獲得的數(shù)據(jù)存放起來(lái)即可。
這里再次注明一點(diǎn),這里用的用戶都是之前已經(jīng)獲取的用戶他們所唱的歌曲,我將他們從CSV文件中讀取了用戶的id和作品數(shù),傳給這個(gè)程序使用。
最后獲取到了84萬(wàn)條數(shù)據(jù),數(shù)據(jù)的樣式如下:
總結(jié)
這次數(shù)據(jù)的抓取遇到最大的一個(gè)坎就是在做用戶的粉絲翻頁(yè)的時(shí)候,一直沒(méi)有找到last_tm這個(gè) 數(shù)據(jù),導(dǎo)致翻頁(yè)做不成,搞了好長(zhǎng)時(shí)間。當(dāng)時(shí)都已經(jīng)放棄了,隔了一天之后再去看,突然在前一頁(yè)中發(fā)現(xiàn)了第二頁(yè)的last_tm,那一刻真的是挺開(kāi)心的。
另外在數(shù)據(jù)的抓取過(guò)程中,最好的就是在最初數(shù)據(jù)存儲(chǔ)的時(shí)候就經(jīng)歷將數(shù)據(jù)清洗好,比如那些不該有的字段都提前去掉在存儲(chǔ),多個(gè)數(shù)據(jù)在一起的也盡量拆開(kāi)再存儲(chǔ),以便于后面的數(shù)據(jù)分析。