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