Python抓取QQ音樂歌單並分析

arvinljw發表於2018-06-22

學了python也有一段時間了,對於爬蟲,後端的框架也有一些瞭解,但是都是在學習的時候跟著別人寫的,感覺都不是自己的知識一樣。我去年就給網易雲音樂提了一個建議,就是通過播放量或者一個受歡迎程度來排序,然而肯定是沒有管我的,隨著網易雲音樂的版權問題,現在又開始使用QQ音樂了,當然它依然沒有這個功能。所以就只有自己動手解決了~

目的

首先抓取這些歌單,一是為了讓自己在沒有歌聽的時候從播放量高的歌單裡選一些來聽二是自己動手抓取一下資料,並簡單的分析,熟悉技術。所以我需要知道至少需要歌單名歌單播放次數,之後再分析都是什麼型別的時候需要標籤,但是這個不一定準確,所以也就加上去僅供參考。最終需要的資料就有:

class QQMusicItem(Item):
    # 歌單名
    songSheet = Field()
    # 作者
    authorName = Field()
    # 播放次數
    playTimes = Field()
    # 建立時間
    createTime = Field()
    # 標籤
    tags = Field()
    # 介紹
    introduce = Field()
複製程式碼

爬取QQ音樂歌單

首先給出原始碼,下文中就不再貼程式碼,因為爬取資料的程式碼沒什麼複用行,而且實現方式多種多樣,主要是實現思想。下文中就以解決踩到的坑為線索來實現目的。

開啟QQ音樂網頁版的分類歌單介面,乍一看,一分析網頁原始碼,看到下圖:

playlist_item

找到這裡我以為和普通的爬取資料一樣,直接看其標籤的內容就能抓去完成了,是的不踩一下坑都不知道有多深。是的顯然失敗了,一條資料都沒有。列印一下訪問的網頁,查詢一下這個class的名字,發現居然沒有,是的我就這樣掉坑裡了。

那麼看來它就是使用動態填充的,那麼它肯定就呼叫了介面,請求資料,那麼就去找,在檢查裡的network中找啊找,最終找到了它:

playlist_api

這個介面的尋找不知道技巧,請知道的不吝賜教

到這裡得到了大部分資料,歌單名,作者名,播放次數,建立時間都有了。也就是說,只有標籤和介紹沒有,這個資料通過每一項點進詳情裡邊就能發現,這次我聰明瞭,沒有再直接寫,先去找獲取詳情的介面,畢竟qq音樂這種大廠的產品肯定是技術統一的,這裡的資料肯定也是填充的,功夫不負有心人,讓我找到了~

detailinfo

是的從這個資料裡邊就找到了標籤和介紹。

看著短短的幾句話,就找到了,其實這個過程我不知道技巧,所以還是耗費了不少時間,也是因為不熟悉吧。

然後就是分頁獲取全部歌單資料,既然每一頁它是調的介面就更容易了,我在第二頁去檢視第二頁請求資料的介面,和第一頁的比較,發現其實就是最後兩個引數(sin(開始)和ein(結束))引起的變化。在觀察這個介面的引數的過程中發現他的rnd這個引數是在變化的,所以在請求每頁的資料的時候這三個引數是需要動態改變的。

然後我就重新編碼,獲取資料,處理資料程式設計json字串格式,再轉為字典,然後遍歷獲取到需要的資料。寫完執行發現介面訪問不了,這時候想起來可能是header需要加引數,再去看那個資料,避免錯誤就把幾乎所有的引數都加上了,其中我覺得referer比較重要。對於referer每一頁的介面都是可以來自歌單首頁,但是對於詳情來源就是詳情頁,引數帶有歌單的id,這個id正好可以從每頁的每一項的資料中拿到,所以動態改變就行了,最後刪掉一些不是很重要的引數,例如這裡我只刪除了loginUin。

然後寫上程式碼,經過除錯,終於成功了。

最後我把它儲存成一個csv檔案,通過播放量排序,擷取前20,得到了下圖

rank

到這裡資料的爬取工作已經完成。

分析資料

資料拿到後,在上邊已經簡單的處理了以下資料,就是看看播放次數前20的歌單。

接著我想看看播放次數的大致分佈情況,例如播放5000萬次以上有多少,1000萬,500萬,100萬,50萬,10萬以上以及10萬以下,都有多少。然後繪製成柱狀圖,看看是什麼情況。

是的,對於這個資料的處理,就用到了numpy和pandas以及matplotlib。經過分析得出下圖結果:

播放次數分析

播放次數分析

很直觀的看到高於500萬播放次數的歌單是少數的。按比例來看的話,能明顯看到10萬以下的歌單有2300多個,還是比較多的,之後再進一步分析這2300多個歌單的建立時間的分佈,這裡就不繼續分析了。

標籤分析

對於標籤什麼的,以下我就想到了使用詞雲,就能直觀的看到哪些詞出現的次數多。歌單都主要是什麼型別的比較受歡迎。編碼後得到如下結果:

標籤分析

可能直接這樣看能大概知道哪些多,但是還是不是很能分得很細,我又排了個序,下邊列出降序排列前十的標籤~

[('流行', 1834), ('英語', 1669), ('國語', 1386), ('電子', 723), 
('日語', 552), ('民謠', 369), ('ACG', 347), ('影視', 337), 
('治癒', 337), ('韓語', 330)]
複製程式碼

先就分析這麼多,等有空再分析一下建立時間的分佈情況。

再來一次原始碼

不當之處請不吝賜教~

最後再推廣一下我的部落格,才寫不久,之前的文章大多都是從之前我的簡書上遷移過去的。之後也會不定期更新Android、Java、Python相關技術。

相關文章