許多人都喜歡網抑雲,其一有歌曲,還有就是它的評論,上面的評論有些是雞湯,有些直擊心靈,反正許多給個人是一種喪的感受,廢話很少說,先來分析一波。python
在這裏我搜索的歌是天下,這仍是那些老操做,就很少說了,在這裏咱們能夠看到它的url,在它的headers中web
https://music.163.com/weapi/c...
同時你也會發現你不斷刷新,它的Form Data中的encSecKey與json
params是在不斷變化,而且是被加密過的,那咱們就要找到它的加密過程了api
在這裏咱們複製一下encSeckey,固然也能夠選擇params,但會發現encSeckey是更簡單的。瀏覽器
咱們點擊Sources,右擊top進行全局搜索就行了。不要複製我這裏的,複製瀏覽器裏的。cookie
咱們點92那個就行了,你也能夠點90那個,其實都同樣,不過不要點vip......那個文件裏的,dom
能夠看到inittiator中文件都是core.......,因此咱們這裏點core.....文件中的,而後咱們會看到這樣的界面函數
咱們點一下那個紅色裏面的括號,而後會看到下面的圖,而後咱們就crtl+f一下,再把encSecKey複製就會自動搜索咱們想要的字符post
咱們能夠看到有3個該字符,那個2 of 3中3表明有幾個,2表明是第二個,在這裏咱們能夠看到params與enseckey兩個參數。ui
var bZj7c = window.asrsea(JSON.stringify(i0x), bkk9b(["流淚", "強"]), bkk9b(YR6L.md), bkk9b(["愛心", "女孩", "驚恐", "大笑"])); e0x.data = j0x.cr1x({ params: bZj7c.encText, encSecKey: bZj7c.encSecKey })
}
咱們能夠看到它是由下面代碼傳入參數,加密出來的,咱們繼續找。
var bZj7c = window.asrsea(JSON.stringify(i0x), bkk9b(["流淚", "強"]), bkk9b(YR6L.md), bkk9b(["愛心", "女孩", "驚恐", "大笑"]));
這裏咱們能夠找window.asrsea這個參數,而後用上面那個crtl+f查找。
會發現 window.asrsea = d
那個function d裏面有4個參數,window.asrsea也有4個參數,這是對應的,咱們能夠看到裏面有a(16),b(h.encText, i),b(d,g),c(i,e,f),這裏b函數用了2次
咱們再找一下這些函數,咱們往上一拉,能夠看到a,b,c3個函數,它們的參數數量是對應的。
咱們能夠看出a函數是隨機獲取16位的值,而且在b,c函數中會用到,b函數是用AES中的CBC加密的,d位偏移量,e與c分別對應明文與祕鑰了,下面會詳講。
對應c函數實際上是RSA加密,相對好分析,代碼裏詳細講解
(JSON.stringify(i0x), bkk9b(["流淚", "強"]), bkk9b(YR6L.md)
, bkk9b(["愛心", "女孩", "驚恐", "大笑"]))
咱們看一下d函數中四個參數會發現後面3個參數是固定的
紅圈中的就是下面的東東
`
YR6L.emj = {
"色": "00e0b", "流感": "509f6", "這邊": "259df", "弱": "8642d", "嘴脣": "bc356", "親": "62901", "開心": "477df", "呲牙": "22677", "憨笑": "ec152", "貓": "b5ff6", "皺眉": "8ace6", "幽靈": "15bb7", "蛋糕": "b7251", "發怒": "52b3a", "大哭": "b17a8", "兔子": "76aea", "星星": "8a5aa", "鍾情": "76d2e", "牽手": "41762", "公雞": "9ec4e", "愛意": "e341f", "禁止": "56135", "狗": "fccf6", "親親": "95280", "叉": "104e0", "禮物": "312ec", "暈": "bda92", "呆": "557c9", "生病": "38701", "鑽石": "14af6", "拜": "c9d05", "怒": "c4f7f", "示愛": "0c368", "汗": "5b7a4", "小雞": "6bee2", "痛苦": "55932", "撇嘴": "575cc", "惶恐": "e10b4", "口罩": "24d81", "吐舌": "3cfe4", "心碎": "875d3", "生氣": "e8204", "可愛": "7b97d", "鬼臉": "def52", "跳舞": "741d5", "男孩": "46b8e", "奸笑": "289dc", "豬": "6935b", "圈": "3ece0", "便便": "462db", "外星": "0a22b", "聖誕": "8e7", "流淚": "01000", "強": "1", "愛心": "0CoJU", "女孩": "m6Qyw", "驚恐": "8W8ju", "大笑": "d" }; YR6L.md = ["色", "流感", "這邊", "弱", "嘴脣", "親", "開心", "呲牙", "憨笑", "貓", "皺眉", "幽靈", "蛋糕", "發怒", "大哭", "兔子", "星星", "鍾情", "牽手", "公雞", "愛意", "禁止", "狗", "親親", "叉", "禮物", "暈", "呆", "生病", "鑽石", "拜", "怒", "示愛", "汗", "小雞", "痛苦", "撇嘴", "惶恐", "口罩", "吐舌", "心碎", "生氣", "可愛", "鬼臉", "跳舞", "男孩", "奸笑", "豬", "圈", "便便", "外星", "聖誕"]
}`
咱們發現後面3個參數都用到bkk9b這個函數,我發現了這個函數
var bkk9b = function(cJj7c) {
var m0x = []; j0x.bf0x(cJj7c, function(cJi7b) { m0x.push(YR6L.emj[cJi7b]) }); return m0x.join("") };
其實就是遍歷而後,把它們疊合在一塊兒。很容易實現
代碼實現:
這裏我是僅僅分析a,b,c,d函數,裏面用到的一些其餘自定義函數看所有代碼
在這裏咱們要用到pycryptodomex庫,用一下下面指令就好
pip install pycryptodomex
首先是a函數,這個根據js文件中還原就好,沒有什麼難度
`
def a(slef, n=16):
b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" c = "" for i in range(n): e = random.random() * len(b) e = math.floor(e) c += b[e] return c
對於b函數,這裏的明文要轉換爲16字節,而且那個祕鑰(key)與偏移量(iv)要變成16位數的,想知道更具體能夠百度
def AES_encrypt(self, text, key, iv):
# 須要將data轉換爲byte再來作填充,不然中文特殊字符等會報錯 pad = lambda data: data + (16 - len(data.encode('utf-8')) % 16) * chr(16 - len(data.encode('utf-8')) % 16) data = pad(text) encryptor = AES.new(key=self.to_16(key), mode=AES.MODE_CBC, iv=self.to_16(iv)) encrypt_aes = encryptor.encrypt(data.encode('utf-8')) encrypt_text = base64.encodebytes(encrypt_aes) enctext = encrypt_text.decode('utf-8') return enctext
對於c函數,沒有什麼好說的,百度一下就知道了,用的是RSA加密。
def RSA_encrypt(self, text, pubKey, modulus):
text = text[::-1] rs = int(codecs.encode(text.encode('utf-8'), 'hex_codec'), 16) ** int(pubKey, 16) % int(modulus, 16) return format(rs, 'x').zfill(256)
對於c函數
def d(self):
data = {} iv = "0102030405060708" # 偏移量 g = self.fixed_parameter(["愛心", "女孩", "驚恐", "大笑"]) # key i = self.a() #h獲取params encText = str(self.dict) encText = self.AES_encrypt(encText, g, iv) params = self.AES_encrypt(encText, i, iv) data['params'] = params #獲取encSecKey b = self.fixed_parameter(["流淚", "強"]) c = self.fixed_parameter( ["色", "流感", "這邊", "弱", "嘴脣", "親", "開心", "呲牙", "憨笑", "貓", "皺眉", "幽靈", "蛋糕", "發怒", "大哭", "兔子", "星星", "鍾情", "牽手", "公雞", "愛意", "禁止", "狗", "親親", "叉", "禮物", "暈", "呆", "生病", "鑽石", "拜", "怒", "示愛", "汗", "小雞", "痛苦", "撇嘴", "惶恐", "口罩", "吐舌", "心碎", "生氣", "可愛", "鬼臉", "跳舞", "男孩", "奸笑", "豬", "圈", "便便", "外星", "聖誕"]) encSecKey = self.RSA_encrypt(i, b, c) data['encSecKey'] = encSecKey return data`
這個就是encSecKey與params的加密。這裏的encSecKey其實一直是256位,而params位數會由於請求的東西不一樣而位數不一樣。咱們能夠用咱們解析出來的python函數進行模擬加密對比,看輸出的看位數以及形式,我感受是頗有效的。我用的是pycharm,可能輸出的位數多4到8,那是由於換行符佔位。
你會發現我d函數中有這樣一個代碼
encText = str(self.dict)
這個self.dict是什麼呢,其實這個咱們能夠打斷點調試出來,下面是我作的1視頻,能夠看一下怎麼搞,由於電腦無錄屏軟件,我就用手機錄的視頻。
csrf_token: ""
hlposttag: "</span>"
hlpretag: "<span class="s-fc7">"
limit: "30"
offset: "0"
s: "天下"
total: "true"
type: "1
通過屢次尋找,dict就是它了,這裏我說一下,在尋找評論,歌詞時的dict也是這樣找的,慢慢調試,它們能夠調試出來的。可是對於評論爬取多頁時會發現找到了dict,可是一直print重複的,那是由於offset這個也存在變化,這個咱們能夠用Fiddler進行輸出,會用到瀏覽器中的console,這個我暫時沒空搞,想知道的能夠百度。
所有代碼:
`
import base64
import codecs
import math
import time
import wordcloud
import random
from Cryptodome.Cipher import AES
import requests
class GetArgs():
def __init__(self, dict): self.dict = dict def fixed_parameter(self, list): dic = { "色": "00e0b", "流感": "509f6", "這邊": "259df", "弱": "8642d", "嘴脣": "bc356", "親": "62901", "開心": "477df", "呲牙": "22677", "憨笑": "ec152", "貓": "b5ff6", "皺眉": "8ace6", "幽靈": "15bb7", "蛋糕": "b7251", "發怒": "52b3a", "大哭": "b17a8", "兔子": "76aea", "星星": "8a5aa", "鍾情": "76d2e", "牽手": "41762", "公雞": "9ec4e", "愛意": "e341f", "禁止": "56135", "狗": "fccf6", "親親": "95280", "叉": "104e0", "禮物": "312ec", "暈": "bda92", "呆": "557c9", "生病": "38701", "鑽石": "14af6", "拜": "c9d05", "怒": "c4f7f", "示愛": "0c368", "汗": "5b7a4", "小雞": "6bee2", "痛苦": "55932", "撇嘴": "575cc", "惶恐": "e10b4", "口罩": "24d81", "吐舌": "3cfe4", "心碎": "875d3", "生氣": "e8204", "可愛": "7b97d", "鬼臉": "def52", "跳舞": "741d5", "男孩": "46b8e", "奸笑": "289dc", "豬": "6935b", "圈": "3ece0", "便便": "462db", "外星": "0a22b", "聖誕": "8e7", "流淚": "01000", "強": "1", "愛心": "0CoJU", "女孩": "m6Qyw", "驚恐": "8W8ju", "大笑": "d" } c = "" for key in list: c = c + dic[key] return c # 轉成16位數 def to_16(self, key): while len(key) % 16 != 0: key += '\0' return key.encode('utf-8') # 對應a函數 def a(slef, n=16): b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" c = "" for i in range(n): e = random.random() * len(b) e = math.floor(e) c += b[e] return c # 對應js函數的b函數 def AES_encrypt(self, text, key, iv): # 須要將data轉換爲byte再來作填充,不然中文特殊字符等會報錯 pad = lambda data: data + (16 - len(data.encode('utf-8')) % 16) * chr(16 - len(data.encode('utf-8')) % 16) data = pad(text) encryptor = AES.new(key=self.to_16(key), mode=AES.MODE_CBC, iv=self.to_16(iv)) encrypt_aes = encryptor.encrypt(data.encode('utf-8')) encrypt_text = base64.encodebytes(encrypt_aes) enctext = encrypt_text.decode('utf-8') return enctext # 對應js函數中的c函數 def RSA_encrypt(self, text, pubKey, modulus): text = text[::-1] rs = int(codecs.encode(text.encode('utf-8'), 'hex_codec'), 16) ** int(pubKey, 16) % int(modulus, 16) return format(rs, 'x').zfill(256) #d函數 def d(self): data = {} iv = "0102030405060708" # 偏移量 g = self.fixed_parameter(["愛心", "女孩", "驚恐", "大笑"]) # key i = self.a() encText = str(self.dict) encText = self.AES_encrypt(encText, g, iv) params = self.AES_encrypt(encText, i, iv) data['params'] = params b = self.fixed_parameter(["流淚", "強"]) c = self.fixed_parameter( ["色", "流感", "這邊", "弱", "嘴脣", "親", "開心", "呲牙", "憨笑", "貓", "皺眉", "幽靈", "蛋糕", "發怒", "大哭", "兔子", "星星", "鍾情", "牽手", "公雞", "愛意", "禁止", "狗", "親親", "叉", "禮物", "暈", "呆", "生病", "鑽石", "拜", "怒", "示愛", "汗", "小雞", "痛苦", "撇嘴", "惶恐", "口罩", "吐舌", "心碎", "生氣", "可愛", "鬼臉", "跳舞", "男孩", "奸笑", "豬", "圈", "便便", "外星", "聖誕"]) encSecKey = self.RSA_encrypt(i, b, c) data['encSecKey'] = encSecKey return data
class Music():
def __init__(self): self.url = 'https://music.163.com/weapi/cloudsearch/get/web?csrf_token=' self.headers = { 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36', 'Accept': '*/*', 'Referer': 'https://music.163.com/search/', 'Connection': 'keep-alive', 'cookie': '_iuqxldmzr_=32; _ntes_nnid=2c2050b762a20bec42d44b4ec9570db2,1596545803404; _ntes_nuid=2c2050b762a20bec42d44b4ec9570db2; WM_TID=P%2B9S%2BGxp32pBVAVRRQZqCt7Cgd%2BGver%2B; NMTID=00OeaJw_6w3Xsbamkk4mtz6A4aQ648AAAF0w8UCbA; WM_NI=uJgfo1tpOzmOzCi1zZbOYbXBDNPDlNewZXU3yQ3iumqfEggri%2BRhKdTEiIHOU2SXI3IuFjOG%2FKSi%2FAeBDlsY02AdcF3eDGC7oT5jbtTM7WD72FNddwZuZ8YelJFmI76NRXY%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6eeb6f0659a86fca5cc6093928fa6d14e968e9eaeb547898f8190d24686b7a0a7cb2af0fea7c3b92ab796a987ee3bb8b0819bf045ba9da7d2f952a2919783db4a8892a0a5ef46a7a996b9d839bb8ffd8af867b3ba8b88e67aabf59e89ca70989ba7aacb4597ee9db9cc398bab8a8bce4ded959d8aae4ba79e8c8df253f4ee8f85e24ef1bb8ca8c23dad8cfb8be1809893f9b8c73df29a8285e77d9aab96d9dc6fb0968a8ecc3df6929eb9dc37e2a3; JSESSIONID-WYYY=C1rSDXpSvPOpS%2FNHFyKe%5Cw3yY4%2F5bq5ntcfQ2QEqxSCJxkrD1%5CYeJdAGWIQmJpUIY5%5CtjA3S%2FrCedOHlKjFkPy5X4Eje7wt%2BHzgrcVRV%2BmXMRO8G%5CsxeUd9MBwwvqzIuEbuJkpv9mv6bCvQBzI9bI1qQl8WnFzFvy5Z0SqVeIAGYexqB%3A1601034012504' } def search(self): song_name = input("請輸入歌曲名:") song_dict = {'csrf_token': "", 'hlposttag': '<span class="s-fc7">', 'limit': '30', 'offset': '0', 's': '{}'.format(song_name), 'total': 'true', 'type': '1'} d = GetArgs(song_dict) data = d.d() reponse = requests.post(url=self.url, headers=self.headers, data=data) dict = reponse.json() music_list = dict['result']['songs'] self.select(music_list,song_name) def select(self, music_list,song_name): i = 0 for music in music_list: print(i, music['name'], music['ar'][0]['name'], end='\n') i += 1 num = int(input('請輸入序號:')) id = music_list[num]['id'] ids = music_list[num]['privilege']['id'] singer_name = music_list[num]['ar'][0]['name'] self.get_lyric(id,singer_name,song_name) print('正在爬取評論') self.get_comments(id,singer_name,song_name) print('評論爬取成功') print('正在下載歌曲') self.download_song(ids,singer_name,song_name) print('所有完成') def download_song(self,ids,singer_name,song_name): url='https://music.163.com/weapi/song/enhance/player/url/v1?csrf_token=' dict = {'csrf_token': "", 'encodeType': "aac", 'ids': "[{}]".format(ids), 'level': "standard"} d = GetArgs(dict) data = d.d() headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36', 'origin': 'https://music.163.com', 'referer':'https://music.163.com/', } download_headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36',
}
#獲取下載連接 response = requests.post(url=url,headers=headers,data=data) json = response.json() download_url = json['data'][0]['url'] #下載歌曲 download_response = requests.get(url=download_url,headers=download_headers) content = download_response.content name = song_name+'+'+singer_name+'.m4a' with open(name, 'wb') as f: f.write(content) print("歌曲下載成功!") def get_comments(self, id,singer_name,song_name): def save_png(): name = song_name + ' ' + singer_name path = name+'.text' with open(path,'r',encoding='UTF-8') as f: c=f.read() w = wordcloud.WordCloud(width=1000,height=700,background_color='white',font_path='msyh.ttc') png_path = name+'.png' w.generate(c) w.to_file(png_path) def save_text(c): name = song_name + ' ' + singer_name text_path = name+'.text' with open(text_path,mode='a', encoding='UTF-8') as f: f.write(c) url = 'https://music.163.com/weapi/comment/resource/comments/get?csrf_token=' headers = { 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36', 'Accept': '*/*', 'Referer': 'https://music.163.com/song?id={}'.format(id), 'Connection': 'keep-alive', 'cookie': '_iuqxldmzr_=32; _ntes_nnid=2c2050b762a20bec42d44b4ec9570db2,1596545803404; _ntes_nuid=2c2050b762a20bec42d44b4ec9570db2; WM_TID=P%2B9S%2BGxp32pBVAVRRQZqCt7Cgd%2BGver%2B; NMTID=00OeaJw_6w3Xsbamkk4mtz6A4aQ648AAAF0w8UCbA; WM_NI=uJgfo1tpOzmOzCi1zZbOYbXBDNPDlNewZXU3yQ3iumqfEggri%2BRhKdTEiIHOU2SXI3IuFjOG%2FKSi%2FAeBDlsY02AdcF3eDGC7oT5jbtTM7WD72FNddwZuZ8YelJFmI76NRXY%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6eeb6f0659a86fca5cc6093928fa6d14e968e9eaeb547898f8190d24686b7a0a7cb2af0fea7c3b92ab796a987ee3bb8b0819bf045ba9da7d2f952a2919783db4a8892a0a5ef46a7a996b9d839bb8ffd8af867b3ba8b88e67aabf59e89ca70989ba7aacb4597ee9db9cc398bab8a8bce4ded959d8aae4ba79e8c8df253f4ee8f85e24ef1bb8ca8c23dad8cfb8be1809893f9b8c73df29a8285e77d9aab96d9dc6fb0968a8ecc3df6929eb9dc37e2a3; JSESSIONID-WYYY=C1rSDXpSvPOpS%2FNHFyKe%5Cw3yY4%2F5bq5ntcfQ2QEqxSCJxkrD1%5CYeJdAGWIQmJpUIY5%5CtjA3S%2FrCedOHlKjFkPy5X4Eje7wt%2BHzgrcVRV%2BmXMRO8G%5CsxeUd9MBwwvqzIuEbuJkpv9mv6bCvQBzI9bI1qQl8WnFzFvy5Z0SqVeIAGYexqB%3A1601034012504' } dict = {'csrf_token': "", 'cursor': "-1", 'offset': "0", 'orderType': "1", 'pageNo': "1", 'pageSize': "20", 'rid': "R_SO_4_{}".format(id), 'threadId': "R_SO_4_{}".format(id)} for page in range(1, 9): d = GetArgs(dict) data = d.d() c='' if page != 1: cursor = self.timestamp_13() #13位時間戳 dict['cursor'] = cursor dict['offset'] = str((page - 1) * 20) dict['pageNo'] = str(page) response = requests.post(url=url, headers=headers, data=data) json = response.json() if page == 1: print('正在爬取第{}頁評論'.format(page)) try: comments_list = json['data']['hotComments'] # print(comments_list) for i in comments_list: c=i['content'] save_text(c) print(i['content']) except: print('無評論!!!!!!!') else: print('正在爬取第{}頁評論'.format(page)) try: comments_list = json['data']['comments'] # print(comments_list) for i in comments_list: c=i['content'] save_text(c) print(i['content']) except: print('無評論') save_png() def get_lyric(self, id,song_name,singer_name): def save_text(c): name = song_name + ' ' + singer_name text_path = name+'lyric.text' with open(text_path,mode='a', encoding='UTF-8') as f: f.write(c) url = 'https://music.163.com/weapi/song/lyric?csrf_token=' headers = { 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36', 'Accept': '*/*', 'Referer': 'https://music.163.com/song?id={}'.format(id), 'origin': 'https://music.163.com', 'Connection': 'keep-alive', 'cookie': '_iuqxldmzr_=32; _ntes_nnid=2c2050b762a20bec42d44b4ec9570db2,1596545803404; _ntes_nuid=2c2050b762a20bec42d44b4ec9570db2; WM_TID=P%2B9S%2BGxp32pBVAVRRQZqCt7Cgd%2BGver%2B; NMTID=00OeaJw_6w3Xsbamkk4mtz6A4aQ648AAAF0w8UCbA; WM_NI=uJgfo1tpOzmOzCi1zZbOYbXBDNPDlNewZXU3yQ3iumqfEggri%2BRhKdTEiIHOU2SXI3IuFjOG%2FKSi%2FAeBDlsY02AdcF3eDGC7oT5jbtTM7WD72FNddwZuZ8YelJFmI76NRXY%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6eeb6f0659a86fca5cc6093928fa6d14e968e9eaeb547898f8190d24686b7a0a7cb2af0fea7c3b92ab796a987ee3bb8b0819bf045ba9da7d2f952a2919783db4a8892a0a5ef46a7a996b9d839bb8ffd8af867b3ba8b88e67aabf59e89ca70989ba7aacb4597ee9db9cc398bab8a8bce4ded959d8aae4ba79e8c8df253f4ee8f85e24ef1bb8ca8c23dad8cfb8be1809893f9b8c73df29a8285e77d9aab96d9dc6fb0968a8ecc3df6929eb9dc37e2a3; JSESSIONID-WYYY=C1rSDXpSvPOpS%2FNHFyKe%5Cw3yY4%2F5bq5ntcfQ2QEqxSCJxkrD1%5CYeJdAGWIQmJpUIY5%5CtjA3S%2FrCedOHlKjFkPy5X4Eje7wt%2BHzgrcVRV%2BmXMRO8G%5CsxeUd9MBwwvqzIuEbuJkpv9mv6bCvQBzI9bI1qQl8WnFzFvy5Z0SqVeIAGYexqB%3A1601034012504' } dict = {"id": "{}".format(id), "lv": -1, "tv": -1, "csrf_token": ""} d = GetArgs(dict) data = d.d() response = requests.post(url=url, headers=headers, data=data) json = response.json() try: lrc = json['lrc'] lyric = lrc['lyric'] save_text(lyric) print(lyric) except: print('該歌曲爲純音樂!') def timestamp_13(self): timestamp_13 = round(time.time() * 1000) return str(timestamp_13)
music = Music()
music.search()`
我展現一下我爬取的一個歌曲-------綠色:
詞雲圖:
部分評論:
歌詞:這裏我說一下,這個括號的是歌詞對應時間,我優酷想搞個播放器,讓對時間顯示對應歌詞。
文章來源:Biaofun標梵互動(https://www.biaofun.com/)