随着技术的不断发展,越来越多的开发者开始探索如何利用 Python、JavaScript 和爬虫技术获取互联网上的有价值数据。今天,我将带你走进一个有趣的技术领域——通过逆向网易云音乐的 JS 接口,快速获取歌曲数据。这不仅有助于加深你对爬虫技术的理解,还能帮助你更好地掌握 JavaScript 加密算法与请求构造的技巧。
网易云音乐是国内最大的音乐平台之一,拥有丰富的音乐资源。在爬虫的应用中,如何从网站中提取数据是核心问题之一。尤其是在面对加密接口时,如何分析和破解这些加密机制往往是技术的难点。
今天,我们将通过 Python 和 JavaScript 的结合,实现爬取网易云音乐歌曲信息的功能。通过逆向网易云音乐的 JS 接口,我们可以轻松破解加密机制,获取到歌曲的详细信息。
首先,我们需要准备一些基本的请求头和 Cookie,以便模拟浏览器的请求。下面是我们需要用到的 headers 和 cookies 配置:
import requests
import execjs
headers = {
"accept": "*/*",
"accept-language": "zh-CN,zh;q=0.9",
"cache-control": "no-cache",
"content-type": "application/x-www-form-urlencoded",
"nm-gcore-status": "1",
"origin": "https://music.163.com",
"pragma": "no-cache",
"priority": "u=1, i",
"referer": "https://music.163.com/search/",
"sec-ch-ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
"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": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"
}
cookies = {
"NTES_P_UTID": "sS3kfyQlxptFAkW243sTmOaWdxoK9ORc|1728789158",
"P_INFO": "[email protected]|1728789158|0|mail163|00&99|sic&1727405394&mail163#sic&510400#10#0#0|&0||[email protected]",
"nts_mail_user": "[email protected]:-1:1",
"NMTID": "00OHYepIiXkGTvlukKQgF2HpnNvF8IAAAGTh2g5fQ",
"_iuqxldmzr_": "32",
"_ntes_nnid": "4640a8c32b20a3853730754afce96f3e,1733143574845",
"_ntes_nuid": "4640a8c32b20a3853730754afce96f3e",
"WEVNSM": "1.0.0",
"WNMCID": "czilew.1733143575040.01.0",
"WM_NI": "u7PQ0EafnNRVhEFsN%2FEdgM8oz8vY%2Bu2QCLPwiAsctusnvdJm6MD4KHN9SPfikydT4VUjzqvFv7FJoGRQrA8QY3J2lkRJENloUSJWltA1D2TI8LF8ZBdDA9lDws65fMlsaHE%3D",
"WM_NIKE": "9ca17ae2e6ffcda170e2e6eeb9d068a18d8ba9e97bf2eb8fb6c54e939e9bb1d660b48fbf82d94fb59ff7b3f02af0fea7c3b92ab7e9a0b2b34fa3baa2afd15eac9b8a94cd2587bca9aebb65bae8babaaa7ff28f8dadd37dab9fbd84f77fb1b2ba85c967f6938cd5ca448ee79db1e563a9a7acb5b75e97b6b692f54eb6e98aabee4d928fbea2bb5b9bed86d3ef6192968bafef65978d86b8ef8083ef8cd3d743fc948ad9d94aa89c8fdaef50b5adfad6e547b0adafa9c837e2a3",
"WM_TID": "i5izftdWa5hEQEVVEQbTW8B6OJQ1V8Ez",
"sDeviceId": "YD-Uzc6b9ISeyVBBhVBBVKCDtBvKJUhJ1BZ",
"ntes_utid": "tid._.J2UKGs6nkBNBVkEVQVeGT9R%252FPIUxcifI._.0",
"__snaker__id": "9IQZDoHKwTbihU9B",
"__remember_me": "true",
"MUSIC_U": "00E628017F7D206D10D10C8AC578FD70BC07B37EF783A27ED7089364D1CF79EDEC9EEDF0EA0AF4F937DE305FE4103A6A282C05FAAC310B5E4C3AD2DD519EB0954BD2089695CBA3BA43A5440C9A361661CD26B2937F9DD976004C317E624BE5C744900FCCEEF1613827565231DD3B48EB637B1E8959EBC723C27475C22A0EE0FB700697600A330CB0B99FB008A4F5B38DAACDA5E2701803504E25971D9425D7113A31FF2616420F9A8AD023B74DEB0576AE9F5884756A75BEB27BDA7CEC7B30D2BB2DD6E2766160223F13275467419F18984A86B9F2DF2183C4B3B938CD347EEA096B59B6D3EEF1A80352ADFA23DA72FF6C2B26994A2A92D63EB128BAB05C912F4233BC5EADC98905777B7F0148F7A390B4632C5A804D4598E65FE301538948EB92A8B1FA38FA255EDDD6D6561F432A861BE8503F7030B9DB0ADA73A0E80DE3E60D55B0FE3AF1A1C6CDFB4B07CED5A9057FBFA68FC371C5193B304E58F9038A4C04",
"__csrf": "f23d9b6d1a9b2dce2dedbd166bad9f9d",
"ntes_kaola_ad": "1",
"gdxidpyhxdE": "zqsOeQwLgv9kdyXHdwr1xoyY2bxIJOcZaRLsJAtEwIfAfWW7%2BNteUrcXUcIead4RD3q02ZhCsNAQ0OGBqezfxOHs9nGdiqqx%5CUZvKVZYnySTdCq7%2BQ%2BANVXGlrhRb55Q5qXX6Uel6%2Fy7iSouCnmkYdRb9Ac0UNYRI9WiIHe%5C0pZhJw2u%3A1733146990085",
"JSESSIONID-WYYY": "HnFgDaYF8Z8bjQhAbCtV%5CG%2FFCChkHfoqr4q1Pc4%5CCwpTqzuQnayxAhcQ0gQtzWlpWceIhxsFI%5CPpqrX0tgQpkDmukr0vFl7noUkvnUnkxt2bj9SIFvewfZ53MmKv8OXacMv5%2F9%5Cl8DgbOPyd1h5A89Jb5xtsKvF3XdaqpbdiINMe%5Com9%3A1733149845764"
}
url = "https://music.163.com/weapi/cloudsearch/get/web"
params = {
"csrf_token": "f23d9b6d1a9b2dce2dedbd166bad9f9d"
}
js_code = open("spider.js", "r", encoding='utf-8').read()
i8a = {
"hlpretag": "",
"hlposttag": "",
"s": "周杰伦",
"type": "1",
"offset": "0",
"total": "false",
"limit": "30",
"csrf_token": "f23d9b6d1a9b2dce2dedbd166bad9f9d"
}
params = execjs.compile(js_code).call("get_params", i8a)
print(params)
data = {
"params": params['encText'],
"encSecKey": params['encSecKey']
}
response = requests.post(url, headers=headers, cookies=cookies, params=params, data=data)
print(response.json())
for item in response.json()['result']['songs']:
print(item)
###完整的代码在 https://cainiao-coder.com/