網易雲音樂歌曲評論爬蟲
來自專欄 Python程序員1 人贊了文章
本文我將為大家講解如何用Python爬取網易雲音樂歌曲全部評論,希望能幫助到那些想爬取網易雲音樂歌曲評論的朋友.網易雲音樂歌曲評論的URL:url = https://music.163.com/weapi/v1/resource/comments/R_SO_4_ + 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加密:
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
五,參考文章
- 網易雲音樂評論爬蟲(三):爬取歌曲的全部評論
推薦閱讀: