學了python也有一段時間了,對於爬蟲,後端的框架也有一些瞭解,但是都是在學習的時候跟著別人寫的,感覺都不是自己的知識一樣。我去年就給網易雲音樂提了一個建議,就是通過播放量或者一個受歡迎程度來排序,然而肯定是沒有管我的,隨著網易雲音樂的版權問題,現在又開始使用QQ音樂了,當然它依然沒有這個功能。所以就只有自己動手解決了~
目的
首先抓取這些歌單,一是為了讓自己在沒有歌聽的時候從播放量高的歌單裡選一些來聽,二是自己動手抓取一下資料,並簡單的分析,熟悉技術。所以我需要知道至少需要歌單名,歌單播放次數,之後再分析都是什麼型別的時候需要標籤,但是這個不一定準確,所以也就加上去僅供參考。最終需要的資料就有:
class QQMusicItem(Item):
# 歌單名
songSheet = Field()
# 作者
authorName = Field()
# 播放次數
playTimes = Field()
# 建立時間
createTime = Field()
# 標籤
tags = Field()
# 介紹
introduce = Field()
複製程式碼
爬取QQ音樂歌單
首先給出原始碼,下文中就不再貼程式碼,因為爬取資料的程式碼沒什麼複用行,而且實現方式多種多樣,主要是實現思想。下文中就以解決踩到的坑為線索來實現目的。
開啟QQ音樂網頁版的分類歌單介面,乍一看,一分析網頁原始碼,看到下圖:
找到這裡我以為和普通的爬取資料一樣,直接看其標籤的內容就能抓去完成了,是的不踩一下坑都不知道有多深。是的顯然失敗了,一條資料都沒有。列印一下訪問的網頁,查詢一下這個class的名字,發現居然沒有,是的我就這樣掉坑裡了。
那麼看來它就是使用動態填充的,那麼它肯定就呼叫了介面,請求資料,那麼就去找,在檢查裡的network中找啊找,最終找到了它:
這個介面的尋找不知道技巧,請知道的不吝賜教
到這裡得到了大部分資料,歌單名,作者名,播放次數,建立時間都有了。也就是說,只有標籤和介紹沒有,這個資料通過每一項點進詳情裡邊就能發現,這次我聰明瞭,沒有再直接寫,先去找獲取詳情的介面,畢竟qq音樂這種大廠的產品肯定是技術統一的,這裡的資料肯定也是填充的,功夫不負有心人,讓我找到了~
是的從這個資料裡邊就找到了標籤和介紹。
看著短短的幾句話,就找到了,其實這個過程我不知道技巧,所以還是耗費了不少時間,也是因為不熟悉吧。
然後就是分頁獲取全部歌單資料,既然每一頁它是調的介面就更容易了,我在第二頁去檢視第二頁請求資料的介面,和第一頁的比較,發現其實就是最後兩個引數(sin(開始)和ein(結束))引起的變化。在觀察這個介面的引數的過程中發現他的rnd這個引數是在變化的,所以在請求每頁的資料的時候這三個引數是需要動態改變的。
然後我就重新編碼,獲取資料,處理資料程式設計json字串格式,再轉為字典,然後遍歷獲取到需要的資料。寫完執行發現介面訪問不了,這時候想起來可能是header需要加引數,再去看那個資料,避免錯誤就把幾乎所有的引數都加上了,其中我覺得referer比較重要。對於referer每一頁的介面都是可以來自歌單首頁,但是對於詳情來源就是詳情頁,引數帶有歌單的id,這個id正好可以從每頁的每一項的資料中拿到,所以動態改變就行了,最後刪掉一些不是很重要的引數,例如這裡我只刪除了loginUin。
然後寫上程式碼,經過除錯,終於成功了。
最後我把它儲存成一個csv檔案,通過播放量排序,擷取前20,得到了下圖
到這裡資料的爬取工作已經完成。
分析資料
資料拿到後,在上邊已經簡單的處理了以下資料,就是看看播放次數前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相關技術。