網易雲音樂歌曲評論爬蟲

網易雲音樂歌曲評論爬蟲

來自專欄 Python程序員1 人贊了文章

本文我將為大家講解如何用Python爬取網易雲音樂歌曲全部評論,希望能幫助到那些想爬取網易雲音樂歌曲評論的朋友.網易雲音樂歌曲評論的URL:url = music.163.com/weapi/v1/ + str(songid) + ?csrf_token=,songid是歌曲的id號,如何獲取網易雲歌曲id號,請參考:爬取全部熱門歌曲及其對應的id號.由於網易雲歌曲評論做了混淆加密處理,因此直接用requests獲取的方法是行不通的.獲取歌曲全部評論的辦法只有分析網易雲的加密過程,通過構造加密參數來獲取歌曲的全部評論.下面我來介紹下如何用Python實現加密參數的構造,並獲取歌曲的全部評論.

一,了解加密過程

首先看一下它的post的表單數據的生成過程:

接著看一下它的加密函數:

最後可知encText是經過兩次AES加密得到,encSecKey是經過一次RSA加密得到的.

二,分析加密函數

window.asrsea()函數有四個參數,後面三個參數都是定值,只有第一個是變數

這是後面三個參數的值,現在控制台斷點調試第一個參數,第一頁評論:

第二頁:

第三頁:

第四頁:

因此可以發現i1x的規律:

{"rid":"R_SO_4_1302938992","offset":"0","total":"True","limit":"100","csrf_token":""}

JSON.stringify()函數是將字典轉化成字元串形式,這樣得到第一個參數的規律為:

{"rid":"R_SO_4_1302938992","offset":"0","total":"True","limit":"100","csrf_token":""}

offset和limit是必選參數,其他參數是可選的,其他參數不影響data數據的生成.

三,用Python實現相同的加密演算法

Python中有個AES加密庫pycrypto,至於RSA加密,我這裡講一下,RSA加密的明文,密鑰,密文都是數字,用下面的公式來表示RSA加密:

密文  =  明文^{E} mod N

python實現RSA加密:

# RSA加密

def RSAencrypt(randomstrs, key, f):

# 隨機字元串逆序排列

string = randomstrs[::-1]

# 將隨機字元串轉換成byte類型數據

text = bytes(string, utf-8)

seckey = int(codecs.encode(text, encoding=hex), 16)**int(key, 16) % int(f, 16)

return format(seckey, x).zfill(256)

AES加密:

# AES加密

def AESencrypt(msg, key):

# 如果不是16的倍數則進行填充(paddiing)

padding = 16 - len(msg) % 16

# 這裡使用padding對應的單字元進行填充

msg = msg + padding * chr(padding)

# 用來加密或者解密的初始向量(必須是16位)

iv = 0102030405060708

cipher = AES.new(key, AES.MODE_CBC, iv)

# 加密後得到的是bytes類型的數據

encryptedbytes = cipher.encrypt(msg)

# 使用Base64進行編碼,返回byte字元串

encodestrs = base64.b64encode(encryptedbytes)

# 對byte字元串按utf-8進行解碼

enctext = encodestrs.decode(utf-8)

return enctext

由於AES加密要求明文的長度為16的倍數,因此我們需要對明文長度進行填充.

四,參數的獲取

兩次AES加密,一次RSA加密,這裡我直接寫代碼:

# 獲取參數

def get_params(page):

# msg也可以寫成msg = {"offset":"頁面偏移量=(頁數-1) * 20", "limit":"20"},offset和limit這兩個參數必須有(js)

# limit最大值為100,當設為100時,獲取第二頁時,默認前一頁是20個評論,也就是說第二頁最新評論有80個,有20個是第一頁顯示的

# msg = {"rid":"R_SO_4_1302938992","offset":"0","total":"True","limit":"100","csrf_token":""}

# 偏移量

offset = (page-1) * 20

# offset和limit是必選參數,其他參數是可選的,其他參數不影響data數據的生成

msg = {"offset": + str(offset) + ,"total":"True","limit":"20","csrf_token":""}

key = 0CoJUm6Qyw8W8jud

f = 00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7

e = 010001

enctext = AESencrypt(msg, key)

# 生成長度為16的隨機字元串

i = generate_random_strs(16)

# 兩次AES加密之後得到params的值

encText = AESencrypt(enctext, i)

# RSA加密之後得到encSecKey的值

encSecKey = RSAencrypt(i, e, f)

return encText, encSecKey

將加密後參數加到post的表單數據去,然後用requests.post()方法就能獲取到含有歌曲評論的json格式的數據.獲取完整代碼:我的Github

五,參考文章

  1. 網易雲音樂評論爬蟲(三):爬取歌曲的全部評論

推薦閱讀:

TAG:網易雲音樂 | python爬蟲 |