【爬蟲】逆向爬蟲初體驗之爬取音樂

尋找數據

打開F12中的網絡頁面,播放音樂后,篩選媒體,會發現當前這首歌曲音頻鏈接地址,打開后,點擊“標頭”就能能看到請求URL
在這里插入圖片描述
截取“.mp3”前面的一部分進行搜索,搜索出來了很多數據包,但都是重復的,其實只有兩個。一個就是我們已經找到的音頻鏈接,另一個就是網易云音樂的接口文件
在這里插入圖片描述
打開這個“v1”數據包,在標頭可以看到他的請求URL,在負載
可以看到有兩個表單數據分別是paramsencSecKey
在這里插入圖片描述
在這里插入圖片描述
在預覽頁面中,可以看到請求的返回值,是一個JSON格式的數據,而我們要的音樂鏈接就是url所對應的值
在這里插入圖片描述

代碼實現

有了上面這些請求數據,我們可以用代碼來向網易云音樂發送請求,然后下載歌曲到本地。其中,headers里的cookie需要在標頭中的“請求標頭”中復制,這里我就不展示我的cookie了。代碼模擬瀏覽器給網易云音樂發送請求,獲取到一個json數據,從中找到所需要的url,接著向這個url發送請求進一步獲取二進制的音頻內容,然后以二進制寫入的方式打開文件,把音樂保存到了本地。

import requestsheaders = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0","referer":"https://music.163.com/","cookie":your_cookie
}
def download_music():url = "https://music.163.com/weapi/song/enhance/player/url/v1?csrf_token=528a132e63865dc4c681934d2a7bb31f"data = {"params":"sZ3h9aF5g8SsP4JiHaXuJqi4E+V+aP/ut4FZfUkzOi0bJbr2N7/PvLx3xTcrAeu05Bcb+LG2c77NKfZ01ShNSMYBd8iVxGggg2QFkM8Enes/2kqHwYziVSFB0dHl3NgY2SSBadA2UwJrt28eDXNDsiIATRORvGkCCFmXDEJXCb83sqJWJixEB2sE57L2jZ5oesC9Dsv1mHczuPyC7+OZYw==","encSecKey":"16c8e6d77d5831c34d374bf7c4c9fbf1993cdd0145eb9dcf2eeca8cdf037edda15c0f58c36c60b3765ee7087d6df32e3cf37976e0fe4bc4dfd4e4acf06e45e73317d8b9d4f27941076c5bf334f5456f687854797e2966a14a2fe0bc27592dc5a5553d6ad8339b4fd0e9094726d8633c06f2fdf16a0f90b94103ce79dab78c5f7"}response = requests.post(url=url,data=data,headers=headers)json_data = response.json()music_url = json_data["data"][0]["url"]music_content = requests.get(url=music_url,headers=headers).content# 向音頻鏈接發起請求,獲取二進制的音頻內容with open(f"music.mp3","wb") as f:# 以二進制寫入的方式打開文件,寫入音頻內容f.write(music_content)print("下載成功")
download_music()

逆向解密

上面的代碼是我們在已知paramencSecKey這兩個數據的情況下實現下載音頻文件。通過嘗試下載其他歌曲也不難看出,只要提供正確的paramencSecKey我們就能下載到所對應的音樂了。而這兩個值到底從何而來呢?
在搜索框中搜索"encSecKey",我們找到了一個JS文件
在這里插入圖片描述
點擊后在響應面板中右鍵,在源面板中打開
在這里插入圖片描述
在源代碼頁面進行搜索,找到了一段代碼
在這里插入圖片描述

var bVz9q = window.asrsea(JSON.stringify(i9b), bsC6w(["流淚", "強"]), bsC6w(BA5F.md), bsC6w(["愛心", "女孩", "驚恐", "大笑"]));
e9f.data = j9a.cr0x({params: bVz9q.encText,encSecKey: bVz9q.encSecKey
})

從這個代碼可以看出,我們要找的paramsencSecKey來自于一個名為bVz9q的對象中。而他又來自于一個window.asrsea的函數。
給這行代碼打上斷點,鼠標懸停在asrsea上。
在這里插入圖片描述
我們直接定位到了這個函數所在的地方,點擊藍色下劃線的文字跳轉
在這里插入圖片描述
跳轉到了一個名為d的函數,原來這個window.asrsea就是d
函數d中需要傳入四個參數分別是a,b,c,d,而在剛剛調用部分的代碼中,我們可以看到他傳入的四個參數分別為

  • JSON.stringify(i9b)
  • bsC6w([“流淚”, “強”])
  • bsC6w(BA5F.md)
  • bsC6w([“愛心”, “女孩”, “驚恐”, “大笑”])
    其中,在控制臺輸入后面四個參數,我們得到的都是如下的定值
    在這里插入圖片描述
    而第一個參數中的i9b比較特殊,通過斷點調試發現這是一個變化的值。網易云音樂的所有接口都會經過這一行代碼,而在播放音樂后我們找到了一個i9b的值如下圖
    在這里插入圖片描述
    這個值就是在調用音頻接口時候的值,不難看出,這個i9b中的編號就是歌曲網址中最后的那一串數字。至于csrf_token,這其實是一個固定值,他就是請求URL最后的那串東西。這么一來問題就迎刃而解了。
    我們只要有歌曲的id就能得到i9b,然后把JSON.stringify(i9b)和其余三個參數傳入到asrsea獲得加密的數據——paramsencSecKey然后作為負載發送請求給網易云音樂,就能下載到歌曲了。
    在這個js代碼中,把相應加密的代碼復制下來到本地的js文件。
    最后我們定義如下函數方便通過python中的execjs模塊調用。
function json_encode(i9b){return JSON.stringify(i9b);
}

完整的js文件太大了就不展示了。

批量下載

現在已經可以實現通過歌曲id下載到對應的歌曲了,而如果想實現批量下載也非常簡單。只要獲取到歌單的url然后發送請求,通過re正則表達式提取出頁面中的歌曲超鏈接中的歌曲id,然后分別下載這些歌曲id對應的音頻文件就行了。

完整代碼

下面附上完整的代碼

import requests
import execjs
import reheaders = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0","referer":"https://music.163.com/","cookie":your_cookie
}
def download_music(music_id,music_name):# 編譯js代碼js_code = execjs.compile(open("爬網易云/網易.js",encoding = 'utf-8').read())#加密參數i9b = {"ids": '', "level": 'exhigh', "encodeType": 'aac', "csrf_token": '528a132e63865dc4c681934d2a7bb31f'}i9b['ids'] = f"[{music_id}]"# 調用解密函數e = '010001';f = '00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7';g = '0CoJUm6Qyw8W8jud';i9b = js_code.call("json_encode",i9b)rdata = js_code.call("asrsea", i9b,e,f,g)url = "https://music.163.com/weapi/song/enhance/player/url/v1?csrf_token=528a132e63865dc4c681934d2a7bb31f"data = {"params":rdata["encText"],"encSecKey":rdata["encSecKey"]}response = requests.post(url=url,data=data,headers=headers)json_data = response.json()music_url = json_data["data"][0]["url"]music_content = requests.get(url=music_url,headers=headers).content# 向音頻鏈接發起請求,獲取二進制的音頻內容with open(f"爬網易云/music/{music_name}.mp3","wb") as f:# 以二進制寫入的方式打開文件,寫入音頻內容f.write(music_content)def get_info_list(list_id):list_url = f"https://music.163.com/playlist?id={list_id}"response = requests.get(url=list_url,headers=headers)html = response.text# <a href="/song?id=1360122230">花月</a>info = re.findall('<a href="/song\?id=(\d+)">(.*?)</a>',html)info_list = [[music_id,music_name] for music_id,music_name in info]return info_listdef get_song_name(music_id):url = f"https://music.163.com/song?id={music_id}"response = requests.get(url=url,headers=headers)html = response.text# <em class="f-ff2">花月</em>name = re.findall('<em class="f-ff2">(.*?)</em>',html)[0]return namemode = input("選擇爬取模式:\n 1.單曲下載 \n 2.批量下載\n")if __name__ == '__main__':if mode == "1":music_id = input("請輸入歌曲ID:")music_name = get_song_name(music_id)download_music(music_id,music_name)print(f"《{music_name}》下載完成")elif mode == "2":list_id = input("請輸入歌單ID:")info_list = get_info_list(list_id)for music_id,music_name in info_list:download_music(music_id,music_name)print(f"《{music_name}》下載完成")print("批量下載完成")

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/89913.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/89913.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/89913.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CppCon 2018 學習:Fancy Pointers for Fun and Profit

“Fancy Pointers for Fun and Profit” 這個標題聽起來像是在討論**“高級指針用法”**&#xff0c;尤其是在C里&#xff0c;如何利用智能指針、定制指針類型&#xff0c;或者其他高級指針技巧來寫更安全、更高效、更優雅的代碼。 可能的理解和內容方向&#xff1a; 1. 什么是…

思辨場域丨數字信號技術重塑農林牧漁:從“靠天吃飯”到“靠數吃飯”

凌晨三點&#xff0c;山東萊蕪的養豬戶老李被手機震動驚醒。屏幕顯示&#xff1a;3號豬舍&#xff0c;母豬即將分娩。他輕點屏幕啟動遠程監控&#xff0c;翻身繼續入睡——而在幾年前&#xff0c;這樣的夜晚他只能在豬圈里守著。 清晨的茶園里&#xff0c;興業縣的茶農王大姐掏…

文心大模型及百度大模型內容安全平臺齊獲信通院大模型安全認證

近日&#xff0c;文心大模型與百度大模型內容安全平臺——紅線大模型雙雙榮獲中國信息通信研究院泰爾認證中心頒發的“大規模預訓練模型&#xff08;文本生成功能&#xff09;安全認證證書”&#xff0c;且二者的認證級別皆“增強級”的最高級別。 大規模預訓練模型&#xff08…

香港服務器查詢緩存禁用-性能優化關鍵技術解析

在香港服務器運維過程中&#xff0c;查詢緩存禁用是提升數據庫性能的關鍵操作。本文將深入解析禁用查詢緩存的原理、操作步驟、適用場景及注意事項&#xff0c;幫助管理員優化MySQL服務器配置&#xff0c;解決高并發環境下的性能瓶頸問題。香港服務器查詢緩存禁用-性能優化關鍵…

深度學習圖像分類數據集—七種動物識別分類

該數據集為圖像分類數據集&#xff0c;適用于ResNet、VGG等卷積神經網絡&#xff0c;SENet、CBAM等注意力機制相關算法&#xff0c;Vision Transformer等Transformer相關算法。 數據集信息介紹&#xff1a;七種動物識別分類&#xff1a;[Chinese_Merganser, panda, Sika_Deer, …

ubuntu22桌面版中文輸入法 fcitx5

不要去 ubuntu software 下載 fcitx5 快捷鍵用不了 直接 sudo apt install fcitx5 \ fcitx5-chinese-addons \ fcitx5-frontend-gtk4 fcitx5-frontend-gtk3 fcitx5-frontend-gtk2 \ fcitx5-frontend-qt5不要在fcitx5里面設置快捷鍵&#xff0c;有些應用可能無法生效 在設置里全…

推客系統小程序終極指南:從0到1構建自動裂變增長引擎,實現業績10倍增長!

&#x1f4cc; 前言&#xff1a;為什么傳統營銷越來越難做&#xff1f;在流量紅利消失的今天&#xff0c;企業普遍面臨三大增長困境&#xff1a;獲客成本飆升&#xff1a;電商、教育等行業單客成本突破500元&#xff0c;ROI持續走低用戶粘性差&#xff1a;90%的活動用戶只參與一…

【數據結構】排序算法:歸并與堆

歸并排序&#xff1a;分治策略的經典實現 算法原理 歸并排序采用分治法策略&#xff0c;包含三個關鍵步驟&#xff1a; 分解&#xff1a;遞歸地將數組分成兩半 解決&#xff1a;對子數組進行排序 合并&#xff1a;將兩個有序子數組合并為一個有序數組 C語言實現 #includ…

機器學習-CatBoost

參考書籍&#xff1a;《機器學習-公式推導和代碼實現》 官方文檔提供的原生接口代碼參考書籍的P187&#xff5e;P188 簡介 全稱是Categorical Boosting&#xff0c;由俄羅斯搜索引擎巨頭Yandex于2017年提出。突出的優勢是在于可以高效地處理數據中的類別特征 ML中對類別特征…

MPLS 多協議標簽交換

前言&#xff1a; 多協議標簽交換MPLS&#xff08;Multiprotocol Label Switching&#xff09;是一種IP&#xff08;Internet Protocol&#xff09;骨干網技術。MPLS在無連接的IP網絡上引入面向連接的標簽交換概念&#xff0c;將第三層路由技術和第二層交換技術相結合&#xf…

CTF Web PHP弱類型比較與布爾值判斷

題目源碼與注釋 <?php show_source("index.php"); // 顯示自身源碼&#xff0c;方便分析 include("flag.php"); // 包含flag變量 $a $_GET[a]; // 獲取GET參數a&#xff0c;抑制報錯// 關鍵判斷 if($a 0 and $a){echo $flag; …

AntV G6動態連線

完整代碼如下 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>AntV G6 動態連線</titl…

puppeteerSharp html轉pdf

部屬到linux 上報錯&#xff1a; Failed to launch browser! /wwwroots/xxx/Chrome/Linux-138.0.7204.92/chrome-linux64/chrome: error while loading shared libraries: libatk-1.0.so.0: cannot open shared object file: No such file or directory 問題服務包缺少依賴&…

springBoot接口層時間參數JSON序列化問題,兼容處理

背景&#xff1a;解決前端傳入時間參數格式不固定場景&#xff0c;避免接收參數報錯時間格式不能序列化。一、概述在 Java 后端開發中&#xff0c;處理 JSON 數據時&#xff0c;經常需要對日期時間字段進行反序列化。Java 中常用的日期時間類型是 java.time.LocalDateTime&…

List、Set、Map三者之間的關系

1、數據結構與核心特性接口數據結構順序性唯一性鍵值對null 元素List動態數組/鏈表有序&#xff08;插入順序&#xff09;允許重復否允許多個 nullSet哈希表 / 紅黑樹無序&#xff08;HashSet&#xff09;有序&#xff08;LinkedHashSet/TreeSet&#xff09;不允許重復否僅 Has…

進程控制----進程終止

一、進程終止的核心場景正常終止&#xff08;代碼完整運行完畢&#xff09;成功&#xff1a;進程執行到main函數結束或調用exit()&#xff0c;返回退出碼 0&#xff08;約定為執行成功&#xff09;。失敗&#xff1a;代碼執行完畢但結果異常&#xff0c;返回非零退出碼&#xf…

Milvus docker-compose 部署

文章目錄 前言Milvus docker-compose 部署1. 下載2. 修改配置3. 啟動4. 測試 前言 如果您覺得有用的話&#xff0c;記得給博主點個贊&#xff0c;評論&#xff0c;收藏一鍵三連啊&#xff0c;寫作不易啊^ _ ^。 ??而且聽說點贊的人每天的運氣都不會太差&#xff0c;實在白嫖的…

EveryThing搜索具體路徑下文件中的內容

1.打開EveryThing 2.點擊搜索&#xff0c;選擇高級搜索 3.選擇需要搜索的文件的路徑以及文件中需要包含的內容 4.之后就可以搜索到對應的目標文件

【算法】寬度優先遍歷BFS

二叉樹的寬搜 429、N叉樹的層序遍歷 題解 BFS核心思想 二叉樹的寬搜一般都是借助隊列來實現的&#xff0c;實現的原理為首先將根節點進行放入隊列中&#xff0c;然后將根節點進行彈出的時候&#xff0c;將這個節點的孩子節點進行放入隊列中&#xff0c;然后繼續彈出隊頭的元…

【STM32】通用定時器基本原理

STM32 通用定時器基本原理&#xff08;基于 STM32F1&#xff09;參考資料&#xff1a;STM32F1xx官方資料&#xff1a;《STM32中文參考手冊V10》-第14章通用定時器STM32 定時器分類 STM32F103 系列共有三類定時器&#xff1a;&#x1f50e; 通用定時器&#xff08;TIM2~TIM5&…