Python抓取QQ音樂歌單並分析

學了python也有一段時間了,對於爬蟲,後端的框架也有一些瞭解,可是都是在學習的時候跟着別人寫的,感受都不是本身的知識同樣。我去年就給網易雲音樂提了一個建議,就是經過播放量或者一個受歡迎程度來排序,然而確定是沒有管個人,隨着網易雲音樂的版權問題,如今又開始使用QQ音樂了,固然它依然沒有這個功能。因此就只有本身動手解決了~html

目的

首先抓取這些歌單,一是爲了讓本身在沒有歌聽的時候從播放量高的歌單裏選一些來聽二是本身動手抓取一下數據,並簡單的分析,熟悉技術。因此我須要知道至少須要歌單名歌單播放次數,以後再分析都是什麼類型的時候須要標籤,可是這個不必定準確,因此也就加上去僅供參考。最終須要的數據就有:python

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

爬取QQ音樂歌單

首先給出源碼,下文中就再也不貼代碼,由於爬取數據的代碼沒什麼複用行,並且實現方式多種多樣,主要是實現思想。下文中就以解決踩到的坑爲線索來實現目的。git

打開QQ音樂網頁版的分類歌單界面,乍一看,一分析網頁源碼,看到下圖:github

playlist_item

找到這裏我覺得和普通的爬取數據同樣,直接看其標籤的內容就能抓去完成了,是的不踩一下坑都不知道有多深。是的顯然失敗了,一條數據都沒有。打印一下訪問的網頁,查找一下這個class的名字,發現竟然沒有,是的我就這樣掉坑裏了。編程

那麼看來它就是使用動態填充的,那麼它確定就調用了接口,請求數據,那麼就去找,在檢查裏的network中找啊找,最終找到了它:json

playlist_api

這個接口的尋找不知道技巧,請知道的不吝賜教後端

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

detailinfo

是的從這個數據裏邊就找到了標籤和介紹。bash

看着短短的幾句話,就找到了,其實這個過程我不知道技巧,因此仍是耗費了很多時間,也是由於不熟悉吧。框架

而後就是分頁獲取所有歌單數據,既然每一頁它是調的接口就更容易了,我在第二頁去查看第二頁請求數據的接口,和第一頁的比較,發現其實就是最後兩個參數(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相關技術。

相關文章
相關標籤/搜索