聲明:本文只作學(xué)習(xí)研究,禁止用于非法用途,否則后果自負,如有侵權(quán),請告知刪除,謝謝!
1、前言
今天逆向的這個網(wǎng)站 某易云音樂 歌曲的評論列表
而要拿到評論列表爬蟲發(fā)送的表單需要兩個參數(shù) params 和 encSecKey。這兩個玩意是加密的,所以重點就是怎么搞定這兩個參數(shù)。
2、行動
話不多說,直接分析。
首先我們進入到網(wǎng)易云,隨便進入某一首歌詳情頁。通過抓包分析,很輕松的找到了每一首音樂的評論的位置,現(xiàn)在只需要訪問 https://music.163.com/weapi/comment/resource/comments/get?csrf_token= 就可以了。
可以看到這是一個post請求,而且攜帶的這兩個參數(shù)這么大一坨,不用多想,絕對是個加密參數(shù)。但是大家不要慌,讓我們?nèi)炙阉饕幌拢ǜ鷹R部梢裕矣X得這里直接搜索要快一點),仔細分析一波。
通過搜索任意一個參數(shù)可以快速找到加密的位置,可以看到
接下來就是打斷點分析。
首先可以確定的是 params= bVe7X.encText,
encSecKey=bVe7X.encSecKey
而 bVe7X 又等于 window.asrsea 這個函數(shù),觀察可知這個函數(shù)是需要四個參數(shù)的,
在控制臺中打印一下四個參數(shù),分別是:
經(jīng)過多次測試,發(fā)現(xiàn)后面三個參數(shù)是不變的(如下圖),而第一個參數(shù)也只有 rid、threadId、cursor 會變,rid 和 threadId 還是一樣的,而且是 R_SO_4_
加上歌曲的 id
,cursor 是毫秒的時間戳,那這就簡單了。
好了,四個參數(shù)已經(jīng)搞定,接下來就是關(guān)鍵了,進入 window.asrsea 函數(shù)
可以看到,d 就是 window.asrsea 這個函數(shù)。要傳入的四個參數(shù)我們已經(jīng)知道了。
不管那么多,直接復(fù)制到 js 文件里看看結(jié)果。
為了避免與后面其他的參數(shù)起沖突,這里我就改了下名字,然后運行。
意料之中,報錯了。
說簡單也簡單,報錯了之后,接下來就是缺什么補什么,這里就大家去 js 頁面找自己慢慢去補了哈。
另外,當(dāng)補到b函數(shù)的時候,會說 CryptoJS is not defined,仔細一看原來 b 函數(shù)里面有個 AES 加密,能調(diào)庫就調(diào)庫,這里就npm install crypto-js,然后導(dǎo)入就可以了
后面的就沒有什么大問題了。補完函數(shù)后(大概有34個函數(shù)左右,400行左右的 js 代碼),我們也是順利的拿到了想要的東西。
雖然過程艱辛,很累的,一味以為拿錯了,但結(jié)果是好的。接下來就是寫代碼拿評論了,這里我用的是 execjs 庫來執(zhí)行 js 代碼,完整 Python 代碼如下:
import json
import time
import execjs
import requests
from fake_useragent import UserAgent
def get_argument(music_id, page):
with open('./comments.js', 'r', encoding='utf-8') as f:
time_now = int(round(time.time() * 1000))
# 第一個 {} 符號被誤識別為占位符,導(dǎo)致后面的鍵值對無法正確替換,可以使用雙大括號 {{}} 來表示字面意義上的大括號
aa = '{{"rid":"R_SO_4_{}","threadId":"R_SO_4_{}","pageNo":"{}","pageSize":"20","cursor":"{}","offset":"0","orderType":"1","csrf_token":""}}'.format(
music_id, music_id, page, time_now)
bb = '010001'
cc = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7'
dd = '0CoJUm6Qyw8W8jud'
argument_data = execjs.compile(f.read()).call('d', aa, bb, cc, dd)
params = argument_data['encText']
encSecKey = argument_data['encSecKey']
return params, encSecKey
def get_comment(params, encSecKey):
url = 'https://music.163.com/weapi/comment/resource/comments/get?csrf_token='
header = {
"Origin": "https://music.163.com",
"Pragma": "no-cache",
"Referer": "https://music.163.com/song?id=65766",
"Sec-Ch-Ua": "\"Not/A)Brand\";v=\"99\", \"Google Chrome\";v=\"115\", \"Chromium\";v=\"115\"",
"Sec-Ch-Ua-Mobile": "?0",
"Sec-Ch-Ua-Platform": "\"Windows\"",
"Sec-Fetch-Dest": "empty",
"Sec-Fetch-Mode": "cors",
"Sec-Fetch-Site": "same-origin",
"User-Agent": UserAgent().random
}
data = {
"params": f"{params}",
"encSecKey": f"{encSecKey}"
}
response = requests.post(url=url, headers=header, data=data)
data = response.text
return data
def parse_data(data):
json_data = json.loads(data)
comments = json_data['data']['comments']
print('采集評論數(shù)據(jù)如下:')
for i in comments:
comment = i['content']
print(comment)
if __name__ == '__main__':
while True:
music_id = input('請輸入歌曲id:')
page = input('請輸入要采集第幾頁評論:')
params, encSecKey = get_argument(music_id, page)
response_data = get_comment(params, encSecKey)
parse_data(response_data)
is_continue = input('是否繼續(xù)采集(y/n):')
if is_continue == 'n':
break
我這里是封裝成一次采集一頁評論,如果需要采集全部評論的需求,自己修改一下就可以了
3、源碼
Github:網(wǎng)易云音樂PC端逆向
CSDN:網(wǎng)易云音樂PC端 js 逆向資源文章來源:http://www.zghlxwxcb.cn/news/detail-620158.html
4、號外
如果我的博客對你有幫助、如果你喜歡我的博客內(nèi)容,請 “??點贊” “??評論” “??收藏” 一鍵三連哦!
【????????????關(guān)注我| 獲取更多源碼 | 定制源碼】大學(xué)生畢設(shè)模板、期末大作業(yè)模板 、Echarts大數(shù)據(jù)可視化、爬蟲逆向等! 「一起探討 ,互相學(xué)習(xí)」!(vx:python812146)
以上內(nèi)容技術(shù)相關(guān)問題??歡迎一起交流學(xué)習(xí)??????????????文章來源地址http://www.zghlxwxcb.cn/news/detail-620158.html
到了這里,關(guān)于【爬蟲逆向案例】某易云音樂(評論)js逆向—— params、encSecKey解密的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!