網易云音樂評論爬蟲(2):歌曲的全部評論

用過網易云音樂聽歌的朋友都知道,網易云音樂每首歌曲后面都有很多評論,熱門歌曲的評論更是接近百萬或者是超過百萬條.現在我就來分享一下如何爬取網易云音樂歌曲的全部評論,由于網易云音樂的評論都做了混淆加密處理,因此我們需要深入了解它的加密過程之后才能爬取到網易云音樂歌曲的全部評論.

一,首先分析數據的請求方式

網易云音樂歌曲頁面的URL形式為https://music.163.com/#/song?id=歌曲id號,這里我用Delacey的Dream it possible為例進行講解,它的URL為https://music.163.com/#/song?id=38592976.接下來開始分析數據的請求方式.

由于網易云音樂的評論是通過Ajax傳輸,我們打開瀏覽器的開發者工具(檢查元素),選中控制面板中的Network,再點擊XHR(捕獲ajax數據),然后點擊左上角的重新加載,會看到下面圖片中的數據請求列表

點擊R_SO_4_38592976?csrf_token=cdee144903c5a32e6752f50180329fc9這一行,再點擊Preview

發現我們所需要的數據就在這json格式的數據中,其中comments中是第一頁的全部評論,一共20條,hotcomments是精彩評論一共有15條,每首歌曲只有第一頁評論才有精彩評論.接著看一下它的請求頭,點擊Headers

我們發現的它是個post請求,向下滑你會發現這個post請求還帶有數據

這些數據都是經過加密處理的,因此我們需要分析它的加密過程來生成相應的參數,然后把加密后的參數加到post請求中才能獲取到我們需要的評論數據.

二,分析加密過程

通過斷點調試發現params和encSecKey是由js腳本中的window.asrsea()函數生成的.

我們發現window.asrsea()函數有4個參數,在瀏覽器的js控制臺分別對這四個參數進行調試:

后面三個參數是定值,只有第一個參數是控制評論頁面偏移量的參數,它是一個變量.筆者經過分析發現第一個參數的形式是:

下面我來詳細講解這個變量的發現過程:

首先找到core_dfe56728795d119e4d476fd09ea2dc51.js這個js腳本,然后將斷點打在第12973行,點擊第一頁評論,頁面加載到斷點處便停止了

然后按下電腦的Esc鍵打開js控制臺,輸入i1x,查看第一個變量:

這是第一頁的i1x的值,接下來看第二頁的(需要點擊第2頁,然后輸入i1x的值):

再看第3頁:

再看第4頁:

通過這幾頁的分析,我們可以得到i1x值的變化規律,且可以得到它的一般形式:

offset和limit是必選參數,其他參數是可選的,其他參數不影響data數據的生成,offset (頁面偏移量) = (頁數-1) * 20, 注意limit最大值為100,當設為100時,獲取第二頁時,默認前一頁是20個評論,也就是說第二頁最新評論有80個,有20個是第一頁顯示的.因此我們可以構造第一個參數為:

接下來,我們來看一下window.asrsea()函數的整個加密過程:

window.asrsea()函數就是上面的d函數,現在我們來看函數d:

參數h.encText是經過兩次AES加密得到的,h.encSecKey是經過一次RSA加密得到的,其中i是隨機生成的長度為16的隨機字符串.

三,生成加密參數

首先我們需要生成長度為16的隨機字符串,這里我們仿照上面的javascript的實現,用Python生成16位長的隨機字符串:

接著用Python實現AES加密,這里要用到pycrypto庫,先安裝好這個庫:

然后導入加密模塊:

由于AES加密的明文長度必須是16的倍數,因此我們需要對明文進行必要的填充,以滿足它的長度是16的倍數:

AES加密的模式是AES.MODE_CBC,初始化向量iv=’0102030405060708′,具體的AES加密:

然后是RSA加密.首先我簡單介紹一下RSA的加密過程.在RSA中,明文,密鑰和密文都是數字.RSA的加密過程可以用下列的公式來表達,這個公式非常的重要,你只有理解了這個公式,才能用Python實現RSA加密.

RSA的密文是對代表明文的數字的E次方求mod N 的結果, 通俗的講就是將明文和自己做E次乘法,然后將其結果除以N 求余數,這個余數就是密文。

下面來看具體的RSA加密代碼實現:

RSA加密后得到的字符串長為256,這里不夠長我們用x字符填充.

最后就是獲取那兩個加密參數:

四,獲取全部評論

上面我們獲取到了兩個參數encText和encSecKey,利用這兩個參數來構造post表單數據(Form Data),即data的值:

歌曲評論的URL為:

然后把data加到post的參數中去就能獲取到json格式的評論數據.

至此,獲取網易云音樂全部評論的Python爬蟲實現原理分析全部完成!

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 2018年6月18日 星期一 晴 帶著一家人回姥姥家過節,一路上孩子們都好開心。姥姥早早就起來,給我們準備...
    典雅_4294閱讀 152評論 0 0
  • 跟西米聊天,從深夜到凌晨。 從制作手工開始,到溝通能力,到情緒管理,到伙伴關系,再到深層的自我覺察。 突然發現,這...
    山間竹音閱讀 186評論 0 0
  • 2016年4月5日晚上8點,一位名叫@彎彎_2016的姑娘發微博稱自己于4月3日在北京市朝陽區酒仙橋北路望京798...
    humansz閱讀 245評論 1 0
  • 人生就是跑圈圈 晨跑,已經成為了生命的一部分,時鐘到了5點,我就會自動醒來,靜靜地躺在床上,等待我的鬧鐘響起,然后...
    許敏雅蘭閱讀 451評論 0 0