歡迎光臨
每天分享高質量文章

Python3爬蟲抓取網易雲音樂熱評實戰

前一段時間剛剛入門python爬蟲,有大概半個月時間沒有寫python了,都快遺忘了。於是準備寫個簡單的爬蟲練練手,我覺得網易雲音樂最優特色的就是其精準的歌曲推薦和獨具特色的用戶評論,於是寫了這個抓取網易雲音樂熱歌榜里的熱評的爬蟲。我也是剛剛入門爬蟲,有什麼意見和問題歡迎提出,大家一起共同進步。 

廢話就不多說了~

我們的標的是爬取網易雲中的熱歌排行榜中所有歌曲的熱門評論。 

這樣既可以減少我們需要爬取的工作量,又可以儲存到高質量的評論。

首先,我們打開網易雲網頁版,如圖: 

點擊排行榜,然後點擊左側雲音樂熱歌榜,如圖:

我們先隨便打開一個歌曲,找到如何抓取指定的歌曲的熱門歌評的方法,如圖,我選了一個最近我比較喜歡的歌曲為例:

進去後我們會看到歌評就在這個頁面的下麵,接下來我們就要想辦法獲取這些評論。

接下來打開web控制台(chrom的話打開開發者工具,如果是其他瀏覽器應該也是類似),chrom下按F12,如圖:

選則Network,然後我們按F5掃清一下,掃清之後得到的資料如下圖所示:

可以看到瀏覽器發送了非常多的信息,那麼哪一個才是我們想要的呢?這裡我們可以通過狀態碼做一個初步的判斷,status code(狀態碼)標誌了服務器請求的狀態,這裡狀態碼為200即表示請求正常,而304則表示不正常(狀態碼種類非常多,如果要想詳細瞭解可以自行搜索,這裡不說304具體的含義了)。所以我們一般只用看狀態碼為200的請求就可以了,還有就是,我們可以通過右邊欄的預覽來粗略觀察服務器傳回了什麼信息(或者查看響應)。通過這兩種方法結合一般我們就可以快速找到我們想要分析的請求。通過反覆的查找,終於找到了含有歌評的請求,如圖:

可能截圖在CSDN上不是很清楚,我們在一個Name為R_SO_4_489998494?csrf_token=的POST請求中找到了包含這首歌的歌評。我們把這個分塊截圖發出來,這樣可以看的清楚一些:

請求基本信息: 

請求頭部: 

 
請求中的表單資料: 

我們可以看到,包含這首歌歌評的請求url為http://music.163.com/weapi/v1/resource/comments/R_SO_4_489998494?csrf_token= ,我們換了幾首歌后發現,這個請求的前部分都是一樣的,只是R_SO_4_後面緊跟的一串數字不一樣。我們可以推測出,每一首歌都有一個指定的id,R_SO_4_後面緊跟的就是這首歌的id。

我們再看一下提交的表單資料,我們會發現表單中需要填兩個資料,名稱為params和encSecKey。後面緊跟的是一大串字符,換幾首歌會發現,每首歌的params和encSecKey都是不一樣的,因此,這兩個資料可能經過一個特定的演算法進行加密過的。

服務器傳回的和評論相關的資料為json格式的,裡面含有非常豐富的信息(比如有關評論者的信息,評論日期,點贊數,評論內容等等),其中hotComments就是我們要找的熱門評論,總共15條,如圖所示:

至此,我們已經確定了方向了,即只需要確定params和encSecKey這兩個引數值即可。但是這兩個引數是經過特定的演算法進行加密的,怎麼辦呢?我發現了一個規律,http://music.163.com/weapi/v1/resource/comments/R_SO_4_489998494?csrf_token= 中 R_SO_4_後面的數字就是這首歌的id值,而對於不同的歌曲的param和encSecKey值,如果把一首歌比如A的這兩個引數值傳給B這首歌,那麼對於相同的頁數,這種引數是通用的,即A的第一頁的兩個引數值傳給其他任何一首歌的兩個引數,都可以獲得相應歌曲的第一頁的評論,對於第二頁,第三頁等也是類似。 

而我們其實只需要獲取第一頁的15條熱門評論,所以我們只需要隨便找一首歌,將這首歌第一頁中的該請求中的params和encSecKey這兩個引數值複製下來,就可以使用了。 

關於這兩個引數如何解密,強大的知乎上其實已經有答案的了,感興趣的朋友可以進去看一下(https://www.zhihu.com/question/36081767),我們在這裡就只需要用我們這種偷懶的辦法就可以完成需求了,xixi。

到此為止,我們如何抓取網易雲音樂的熱門評論已經分析完了,我們再分析一下如何獲取雲音樂熱歌榜中所有歌曲的信息。

我們需要獲取雲音樂熱歌榜中的所有歌曲的歌曲名和對應的id值。 

跟上面的分析步驟類似,我們先進入熱歌榜的網址,如圖:

按F12,進入WEB工作台,如圖:

我們在一個名為toplist?id=3778678的GET請求中,找到了該榜單的所有歌曲信息。

請求對應的信息如圖:

我們預覽一下該請求傳回的結果,如圖:

我們在代碼的第524行我們找到了包含歌曲信息的代碼,如圖:

因此,我們只需要將該請求的代碼中,將包含信息的代碼篩選出來。 

我們在這裡使用正則運算式進行資料篩選。 

通過觀察特點,我們可以通過兩次正則運算式的篩選,將我們需要的歌曲信息提取出來。 

第一次正則運算式我們將該請求傳回的所有代碼中,提取出第525行代碼。 

第一次正則運算式如下:

第二次正則運算式我們將該第524行中我們需要的歌曲信息提取出來,我們需要歌曲的歌名和id,對應的正則運算式如下: 

獲取歌名:

  • (.*?)
  •  

    獲取歌曲的id:

  • .*?
  • 到此,我們整個過程已經分析完了,上代碼看具體細節~~ 

    代碼如下:

    代碼運行結果如下:

    對比一下網頁上《如果我愛你》這首歌的歌評和我們儲存下的歌評:

    信息無誤~

    作者:阿阿阿阿阿阿鑫

    來源:http://blog.csdn.net/fengxinlinux/article/details/77950209

    《Linux雲計算及運維架構師高薪實戰班》2018年09月17日即將開課中,120天衝擊Linux運維年薪30萬,改變速約~~~~

      *宣告:推送內容及圖片來源於網絡,部分內容會有所改動,版權歸原作者所有,如來源信息有誤或侵犯權益,請聯繫我們刪除或授權事宜。

      – END –


      更多Linux好文請點擊【閱讀原文】

      ↓↓↓

      赞(0)

      分享創造快樂