【附件】页面源代码
本博客是https://blog.csdn.net/CY19980216/article/details/104028709的附件,具體使用方法如下:
原諒我出此下策
<!DOCTYPE html> <html lang="zh-CN"> <head><link href="https://csdnimg.cn/public/favicon.ico" rel="SHORTCUT ICON"><title>【日常】論如何在91flac上優(yōu)雅地白嫖_python,爬蟲_囚生CYのParadise-CSDN博客</title><meta name="description" content="剛回家,放下沙雕的模型和跑不通的代碼,準(zhǔn)備先做些有趣的事情。事情是這樣的,去年我為了找一首河圖《白馬"><link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/detail-e2af80a482.min.css"><link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/themes/skin-yellow/skin-yellow-db01cea9f7.min.css"><!-- 自定義皮膚樣式--><link rel="stylesheet" href="https://csdnimg.cn/public/sandalstrap/1.4/css/sandalstrap.min.css"><style>.MathJax, .MathJax_Message, .MathJax_Preview{display: none}</style> </head> <body class="nodata " > <link rel="stylesheet" href="https://csdnimg.cn/public/common/toolbar/content_toolbar_css/content_toolbar.css"><link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/blog_code-c3a0c33d5c.css"> <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/vendor/pagination/paging-e040f0c7c8.css"><link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/chart-3456820cac.css" /> <div class="main_father clearfix d-flex justify-content-center" style="height:100%;"> <div class="container clearfix" id="mainBox"><div class='space_container'></div><main><div class="blog-content-box"><div class="article-header-box"><div class="article-header"><div class="article-title-box"><h1 class="title-article">【日常】論如何在91flac上優(yōu)雅地白嫖</h1></div><div class="article-info-box"><div class="article-bar-top"><!--文章類型--><span class="article-type type-1 float-left">原創(chuàng)</span> <span class="c-purple">私密</span><a class="follow-nickName" href="https://me.csdn.net/CY19980216" target="_blank" rel="noopener">囚生CY</a><span class="time">最后發(fā)布于2020-01-18 18:00:04 </span><span class="read-count">閱讀數(shù) 8</span><a id='blog_detail_zk_collection' data-report-click='{"mod":"popu_823"}'><svg class="icon"><use xlink:href="#icon-csdnc-Collection-G" ></use></svg>收藏</a></div><div class="up-time">發(fā)布于2020-01-18 01:51:45</div><div class="slide-content-box"><div class="tags-box artic-tag-box"><span class="label">分類專欄:</span><a class="tag-link" target="_blank" rel="noopener"href="https://blog.csdn.net/cy19980216/category_8079847.html">日常 </a><a class="tag-link" target="_blank" rel="noopener"href="https://blog.csdn.net/cy19980216/category_8079848.html">小確幸 </a></div><div class="tags-box artic-tag-box"><span class="label">文章標(biāo)簽:</span><a data-report-click='{"mod":"popu_626","strategy":"python"}' data-report-view='{"mod":"popu_626","strategy":"python"}' class="tag-link" href="https://so.csdn.net/so/search/s.do?q=python&t=blog" target="_blank" rel="noopener">python <a data-report-click='{"mod":"popu_626","strategy":"爬蟲"}' data-report-view='{"mod":"popu_626","strategy":"爬蟲"}' class="tag-link" href="https://so.csdn.net/so/search/s.do?q=爬蟲&t=blog" target="_blank" rel="noopener">爬蟲 </a></div><div class="article-copyright"><span class="creativecommons"><a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"></a><span>版權(quán)聲明:本文為博主原創(chuàng)文章,遵循<a href="http://creativecommons.org/licenses/by-sa/4.0/" target="_blank" rel="noopener"> CC 4.0 BY-SA </a>版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。 </span><div class="article-source-link2222">本文鏈接:<a href="https://caoyang.blog.csdn.net/article/details/104026184">https://caoyang.blog.csdn.net/article/details/104026184</a></div></span> </div></div><div class="operating"><a class="href-article-edit" href="https://mp.csdn.net/postedit/104026184">編輯</a><a class="href-article-edit slide-toggle">展開</a></div></div></div></div><article class="baidu_pl"><!--python安裝手冊開始--><!--python安裝手冊結(jié)束--><!--####專欄廣告位圖文切換開始--><!--####專欄廣告位圖文切換結(jié)束--><div id="article_content" class="article_content clearfix"><link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-833878f763.css" /><link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-833878f763.css" /><div class="htmledit_views" id="content_views"><p>剛回家,放下沙雕的模型和跑不通的代碼,準(zhǔn)備先做些有趣的事情。</p><p>事情是這樣的,去年我為了找一首河圖《白馬入蘆花》的資源,上求度娘,下翻磁鏈,皆無所得。然后發(fā)現(xiàn)了91flac這個神奇的網(wǎng)站,不僅歌曲收錄的數(shù)量相當(dāng)全面,不管是古風(fēng)一類的小眾歌曲,還是周董這種在所有平臺都需要付費(fèi)的大牌歌手的作品,都有資源,并且可以<strong>免費(fèi)下載絕大多數(shù)歌曲的流暢音質(zhì)版本</strong>(至少我想找的付費(fèi)歌曲都能下載,而且我這種老年人的耳朵也聽不太出無損跟流暢的區(qū)別)。</p><p>好事并沒有持續(xù)太久,去年音樂領(lǐng)域基本徹底進(jìn)入“大版權(quán)時代”,想要白嫖歌曲談何容易唉,91flac很快也“淪陷”,目前的情況是這樣的(截至20200118凌晨12點(diǎn)30分):</p><p style="text-align:center;"><img alt="" class="has" height="405" src="https://img-blog.csdnimg.cn/20200118002940479.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9jYW95YW5nLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70" width="720" /></p><p><strong>圖1 《金榜外·紙上塵埃》歌曲頁面截圖(上半部分)👆</strong></p><p style="text-align:center;"><img alt="" class="has" height="405" src="https://img-blog.csdnimg.cn/20200118003018201.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9jYW95YW5nLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70" width="720" /></p><p><strong>圖2 《金榜外·紙上塵埃》歌曲頁面截圖(下半部分)👆</strong></p><p>因?yàn)橛杏媒貓D部分太長,所以我截了兩張圖(<strong>圖1圖2</strong>),注意到第二張圖的流暢音質(zhì)部分<strong>曾經(jīng)是不需要會員</strong>的,直接有<strong>下載按鈕</strong>。往事不堪回首啊。。。</p><p>可能有些朋友對91flac并不是很熟悉,首頁URL為<a href="https://www.91flac.com/" rel="nofollow">https://www.91flac.com/</a>,用戶注冊非常簡單(<strong>為什么要注冊用戶?因?yàn)椴蛔阅憔涂床坏缴厦孢@兩張截圖,尤其是第二章截圖中播放器的部分在不登錄的情況下是不會出現(xiàn)的,這個播放器是我接下來要寫怎么白嫖的關(guān)鍵所在</strong>),只需要提供郵箱和密碼即可,不需要綁定手機(jī),不需要實(shí)名認(rèn)證,不需要填寫任何個人信息,某種意義上可以說是很良心的了。</p><p>恰好這學(xué)期深深地陷入河圖的兩首歌曲《金榜外·紙上塵埃》和《金榜外·杯酒洗詩》,內(nèi)心產(chǎn)生了強(qiáng)烈地共鳴,在我眼中可以算得上是蓋世的兩首神作,可惜各大音樂平臺(網(wǎng)易云、酷狗、酷我)都沒有,只有騰訊爸爸的QQ音樂有,然后就是我使用的華為手機(jī)自帶的“華為音樂”里也可以搜到,但顯然都肯定是需要付費(fèi)才能下載的,而我的習(xí)慣是遇到好歌一定要把它下載到本地存起來,畢竟吃到嘴里的肉才算得上是自己的。</p><p>面對上面兩張截圖,一籌莫展。但是這個播放器是可以用來試聽整首音樂的,我想或許是可以有操作的。</p><p>廢話不多時,點(diǎn)擊F12打開監(jiān)聽器,刷新頁面看看上面這兩張截圖的頁面刷新后都有什么東西唄:</p><p style="text-align:center;"><img alt="" class="has" height="405" src="https://img-blog.csdnimg.cn/2020011800492551.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9jYW95YW5nLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70" width="720" /></p><p><strong>圖3 《金榜外·紙上塵埃》歌曲頁面刷新后監(jiān)聽抓包截圖(下半部分)👆</strong></p><p style="text-align:center;"><img alt="" class="has" height="405" src="https://img-blog.csdnimg.cn/20200118005418429.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9jYW95YW5nLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70" width="720" /></p><p><strong>圖4 《金榜外·紙上塵埃》歌曲頁面刷新后唯一POST請求響應(yīng)結(jié)果(下半部分)👆</strong></p><p>如<strong>圖3</strong>所示,26個請求 ,就這么1個POST(紅線劃出),那么肯定得去看看。<strong>圖4</strong>中我們看到它的響應(yīng)是各種不同音質(zhì)版本歌曲的信息,size顯然是歌曲大小的byte值,對照<strong>圖1</strong>與<strong>圖2</strong>可以發(fā)現(xiàn),什么flac,ape之類的都可以對得上大小和名稱,就是最后一個96aac最特殊,它有一段超長的link,而且對不上<strong>圖1</strong>與<strong>圖2</strong>中的音質(zhì)版本。</p><p>怎么可能對不上呢?仔細(xì)看看<strong>圖2</strong>,播放器右上角的96aac是擺設(shè)么?我忽然發(fā)現(xiàn)可能直接去訪問96aac這個link就完事了。</p><p>我先試試在瀏覽器上訪問會怎么樣👇</p><p style="text-align:center;"><img alt="" class="has" height="405" src="https://img-blog.csdnimg.cn/20200118010405595.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9jYW95YW5nLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70" width="720" /></p><p><strong>圖5 失敗的嘗試👆</strong></p><p>不死心再用requests試試👇</p><pre class="has"> <code># -*- coding: UTF-8 -*- # Author: 囚生 # 時間:20200118 # 創(chuàng)作不易, 僅供分享, 勿傳播import os import timefrom requests import Session from bs4 import BeautifulSoupclass Flac():def __init__(self,email="<您的注冊郵箱>",password="<您的登陸密碼>",user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0",):""" 類構(gòu)造參數(shù) """self.email = emailself.password = passwordself.user_agent = user_agent""" 類常用參數(shù) """self.workspace = os.getcwd()self.date = time.strftime("%Y%m%d")self.mainURL = "https://www.91flac.com"self.loginURL = self.mainURL + "/login"self.musicURL = self.mainURL + "/song/{}"self.linkURL = self.mainURL + "/song/{}/link"self.session = Session()""" 類初始化 """self.session.headers = {"User-Agent":self.user_agent}print("正在訪問首頁...")self.session.get(self.mainURL) # 訪問首頁r = self.session.get("https://www.91flac.com/song_file?token=eyJpdiI6IlVHWDZQNkxsQ1NyNFV5bGViZjl2S2c9PSIsInZhbHVlIjoiQmZnZXZXMzB5cjRFbFYrZWUzMXhYaXAzUStTNngxV2tnSDhiUUZtQ1orVjlYSklHZ1ZwYnNkdmZ2ZnVIWGU4XC82ekNaeFpFU3FJS0ZyTXRkZ0tDOGhPMGJOanRoc094M2dBdVRmRjVNMDNJPSIsIm1hYyI6IjFiZDFkYWE1MjUwYTMxNWMxYTBlMTM0M2U0OGYzYTE0YTIyMTI5ODdmZTY3NWM1NTkwMDVkZWEzN2Y4ZGU4YWMifQ%3D%3D")print(r.text)if __name__ == "__main__":f = Flac() </code></pre><p>我就不展示到底print(r.text)是什么了,跟瀏覽器有所區(qū)別,返回的結(jié)果是仍是首頁的html,可能是因?yàn)榇a里先訪問了首頁的緣故,總之顯然是不行的。</p><p>在此之后我就決定試試看爬蟲模擬登錄后是否可能有所區(qū)別,于是先做了一下模擬登錄👇</p><p style="text-align:center;"><img alt="" class="has" height="405" src="https://img-blog.csdnimg.cn/20200118011449331.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9jYW95YW5nLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70" width="720" /></p><p><strong>圖6 模擬登錄測試抓包結(jié)果👆</strong></p><p>以test@163.com與123456為提交字段測試抓包,看到還好提交字段沒有被加密,但是多了一個_token,初步猜測是CSRF驗(yàn)證,因?yàn)樗奈恢锰幱诒韱螖?shù)據(jù)中的第一個,以我這種前端小白的直覺,應(yīng)該是這樣的。然后右鍵打開頁面源代碼,如下<strong>圖7</strong>所示,紅線部分恰好為_token,驗(yàn)證了猜想。</p><p style="text-align:center;"><img alt="" class="has" height="405" src="https://img-blog.csdnimg.cn/20200118011602703.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9jYW95YW5nLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70" width="720" /></p><p><strong>圖7 登錄頁面源代碼👆</strong></p><p>于是模擬登錄就很簡單了,代碼自取👇</p><pre class="has"> <code># -*- coding: UTF-8 -*- # Author: 囚生 # 時間:20200118 # 創(chuàng)作不易, 僅供分享, 勿傳播import os import timefrom requests import Session from bs4 import BeautifulSoupclass Flac():def __init__(self,email="<您的注冊郵箱>",password="<您的登錄密碼>",user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0",):""" 類構(gòu)造參數(shù) """self.email = emailself.password = passwordself.user_agent = user_agent""" 類常用參數(shù) """self.workspace = os.getcwd()self.date = time.strftime("%Y%m%d")self.mainURL = "https://www.91flac.com"self.loginURL = self.mainURL + "/login"self.musicURL = self.mainURL + "/song/{}"self.linkURL = self.mainURL + "/song/{}/link"self.session = Session()""" 類初始化 """self.session.headers = {"User-Agent":self.user_agent}print("正在訪問首頁...")self.session.get(self.mainURL) # 訪問首頁def login(self):print("正在訪問登錄頁面...")html = self.session.get(self.loginURL).text # GET訪問登錄頁面soup = BeautifulSoup(html,"lxml")csrf_token = soup.find("meta",attrs={"name":"csrf-token"}).attrs["content"]print("csrf-token為: {}".format(csrf_token))formdata = { # 建議不要改字段順序, 就我WEB開發(fā)的經(jīng)驗(yàn)來看, csrf-token總是是作為第一個參數(shù), 所以后端一般會選擇過濾掉第一個字段"_token": csrf_token,"email": self.email,"password": self.password,}r = self.session.post(self.loginURL,data=formdata) # POST提交登錄字段""" 判斷登錄是否成功: 目前簡單根據(jù)title字段來判斷 """html = r.textsoup = BeautifulSoup(html,"lxml")title = str(soup.find("title").string)if "登錄" in title: return False # 20200117登錄失敗的title為: <title>登錄_91flac.com無損音樂網(wǎng)</title>else: return True # 20200117登錄成功的title為: <title>我的資料_13856244865_91flac.com無損音樂網(wǎng)</title> if __name__ == "__main__":f = Flac()flag = f.login()if flag: print("登陸成功")else: print("登陸失敗") </code></pre><p>事實(shí)上即便使用登陸后的session仍然無法得到我想要的東西,事情又變得壞起來了。</p><p>睡前準(zhǔn)備再試試,于是試著監(jiān)聽點(diǎn)擊<strong>圖2</strong>中的播放器的播放按鈕,聽一段音樂,看看會有什么好事發(fā)生唄。</p><p style="text-align:center;"><img alt="" class="has" height="405" src="https://img-blog.csdnimg.cn/2020011801215846.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9jYW95YW5nLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70" width="720" /></p><p><strong>圖8 《金榜外·紙上塵埃》歌曲頁面點(diǎn)擊播放按鈕后監(jiān)聽抓包情況👆</strong></p><p>天晴了,雨停了,圖大唱起來了,我覺得自己又行了。看到這兩個包,第一個是重定向302,顯然不靠譜(<strong>仔細(xì)看看第一個其實(shí)就是圖5中訪問的URL,只是查詢字符串中的token換了而已</strong>), 那我們看看第二個的響應(yīng)是什么唄</p><p style="text-align:center;"><img alt="" class="has" height="405" src="https://img-blog.csdnimg.cn/20200118012646203.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9jYW95YW5nLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70" width="720" /></p><p> <strong>圖9 《金榜外·紙上塵埃》歌曲頁面點(diǎn)擊播放按鈕后監(jiān)聽抓包:第二個包的響應(yīng)結(jié)果👆</strong></p><p>這一串莫名其妙的串讓我想到了之前模擬登錄B站時抓取canvas畫布上的驗(yàn)證圖片抓包時同樣看到了類似的東西,我想可能八九不離十了。但是我很難找到這個請求的URL是從哪里截取得到的(可能有點(diǎn)蠢,找不到),所以我就直接復(fù)制了請求URL做了測試👇</p><pre class="has"> <code> urls = ["http://mobileoc.music.tc.qq.com/C400001dyoiE0eCdgK.m4a?guid=FA&vkey=E7EF3A574783636B3E9F4A75C819810AB7F230CF819A76C044746BBB16A07A9169242B5EF3960A1DBEFE1FB47F27B490577AFB8B2ECD3989&uin=0&fromtag=8","http://mobileoc.music.tc.qq.com/C400004D66CL3XaKNU.m4a?guid=FA&vkey=3DD5852551E8778622E753569E02ACA04E6B11FDCCD1231A7DE2FE1F54A675740C91472E7318D5305E71A4611354139396B816CDD738D2C1&uin=0&fromtag=8","http://mobileoc.music.tc.qq.com/C400002u6wBM0LSG0Q.m4a?guid=FA&vkey=B9EA91CCCB41BC9E158DFA518E16CF78EE556AD2567C2CECB787E6FB1442DAC0106BF2BAE27D5809FEB9F1EEBBA76326B1E088DAE132D782&uin=0&fromtag=8","http://mobileoc.music.tc.qq.com/C400000NXIup1NeWNq.m4a?guid=FA&vkey=4B8094605617C0A65DB19F664466B5555967F4259C6835A474A69C51C99F1A36C961C2806F8916A65DAC8BDF4BB945CC50155D972E246182&uin=0&fromtag=8", ] # 這些URL在不同時間段復(fù)制都是不一樣的(即"?"后面的查詢字符串都是有差異的),但是我試下來這些URL并非閱后即焚,是可以重復(fù)使用的,至于多久失效,我沒有做測試,總之能用就行了。</code></pre><p>這里分別是我手動復(fù)制的4首歌請求URL(即<strong>圖9</strong>中抓包的請求URL),從上到下分別是《金榜外·紙上塵埃》《金榜外·杯酒洗詩》《金榜外·紙上塵埃(伴奏)》《金榜外·杯酒洗詩(伴奏)》。</p><p>這些URL在不同時間段復(fù)制都是不一樣的(即"?"后面的查詢字符串都是有差異的),但是我試下來這些URL并非閱后即焚,是可以重復(fù)使用的,至于多久失效,我沒有做測試,總之能用就行了。</p><p>下載代碼如下所示</p><pre class="has"> <code># -*- coding: UTF-8 -*- # Author: 囚生 # 時間:20200118 # 創(chuàng)作不易, 僅供分享, 勿傳播import os import timefrom requests import Session from bs4 import BeautifulSoupclass Flac():def __init__(self,email="1299868821@qq.com",password="123456",user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0",):""" 類構(gòu)造參數(shù) """self.email = emailself.password = passwordself.user_agent = user_agent""" 類常用參數(shù) """self.workspace = os.getcwd()self.date = time.strftime("%Y%m%d")self.mainURL = "https://www.91flac.com"self.loginURL = self.mainURL + "/login"self.musicURL = self.mainURL + "/song/{}"self.linkURL = self.mainURL + "/song/{}/link"self.session = Session()""" 類初始化 """self.session.headers = {"User-Agent":self.user_agent}print("正在訪問首頁...")self.session.get(self.mainURL) # 訪問首頁def login(self):print("正在訪問登錄頁面...")html = self.session.get(self.loginURL).text # GET訪問登錄頁面soup = BeautifulSoup(html,"lxml")csrf_token = soup.find("meta",attrs={"name":"csrf-token"}).attrs["content"]print("csrf-token為: {}".format(csrf_token))formdata = { # 建議不要改字段順序, 就我WEB開發(fā)的經(jīng)驗(yàn)來看, csrf-token總是是作為第一個參數(shù), 所以后端一般會選擇過濾掉第一個字段"_token": csrf_token,"email": self.email,"password": self.password,}r = self.session.post(self.loginURL,data=formdata) # POST提交登錄字段""" 判斷登錄是否成功: 目前簡單根據(jù)title字段來判斷 """html = r.textsoup = BeautifulSoup(html,"lxml")title = str(soup.find("title").string)if "登錄" in title: return False # 20200117登錄失敗的title為: <title>登錄_91flac.com無損音樂網(wǎng)</title>else: return True # 20200117登錄成功的title為: <title>我的資料_13856244865_91flac.com無損音樂網(wǎng)</title> def download(self):flag = self.login()if flag: print("登錄成功!")else:return Falseprint("登陸失敗!")urls = ["http://mobileoc.music.tc.qq.com/C400001dyoiE0eCdgK.m4a?guid=FA&vkey=E7EF3A574783636B3E9F4A75C819810AB7F230CF819A76C044746BBB16A07A9169242B5EF3960A1DBEFE1FB47F27B490577AFB8B2ECD3989&uin=0&fromtag=8","http://mobileoc.music.tc.qq.com/C400004D66CL3XaKNU.m4a?guid=FA&vkey=3DD5852551E8778622E753569E02ACA04E6B11FDCCD1231A7DE2FE1F54A675740C91472E7318D5305E71A4611354139396B816CDD738D2C1&uin=0&fromtag=8","http://mobileoc.music.tc.qq.com/C400002u6wBM0LSG0Q.m4a?guid=FA&vkey=B9EA91CCCB41BC9E158DFA518E16CF78EE556AD2567C2CECB787E6FB1442DAC0106BF2BAE27D5809FEB9F1EEBBA76326B1E088DAE132D782&uin=0&fromtag=8","http://mobileoc.music.tc.qq.com/C400000NXIup1NeWNq.m4a?guid=FA&vkey=4B8094605617C0A65DB19F664466B5555967F4259C6835A474A69C51C99F1A36C961C2806F8916A65DAC8BDF4BB945CC50155D972E246182&uin=0&fromtag=8", ]for i in range(len(urls)):r = self.session.get(urls[i])with open("test{}.mp3".format(i),"wb") as f:f.write(r.content)if __name__ == "__main__":f = Flac()f.download() </code></pre><p>我在download()函數(shù)中的urls變量里放入我要下載的歌曲的URL(自己到瀏覽器抓包頁面手動復(fù)制),然后get請求后以"wb"模式將響應(yīng)的content寫入mp3文件(我這里是test0.mp3,test1.mp3,test2.mp3,test2.mp3)</p><p>運(yùn)行結(jié)果如<strong>圖10</strong>所示👇</p><p style="text-align:center;"><img alt="" class="has" height="405" src="https://img-blog.csdnimg.cn/20200118014001495.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9jYW95YW5nLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70" width="720" /></p><p><strong>圖10 運(yùn)行后工作目錄下的文件結(jié)果👆 </strong></p><p>看這些文件的大小,與<strong>圖4</strong>中的抓包響應(yīng)結(jié)果大致匹配,我確信已經(jīng)成功了,打開test0.mp3👇</p><p style="text-align:center;"><img alt="" class="has" height="405" src="https://img-blog.csdnimg.cn/20200118014216522.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9jYW95YW5nLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70" width="720" /></p><p>請不要吐槽我用瀏覽器打開mp3,因?yàn)槲也幌M业碾娔X上有亂七八糟的APP,能不裝的APP我都盡量是不裝,所以只能用瀏覽器打開。顯然是打開失敗了,我猜想這個文件不是mp3格式的(后發(fā)現(xiàn)是m4a格式的),于是用WIN10自帶的Windows Media打開👇</p><p style="text-align:center;"><img alt="" class="has" height="405" src="https://img-blog.csdnimg.cn/20200118014545997.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9jYW95YW5nLmJsb2cuY3Nkbi5uZXQ=,size_16,color_FFFFFF,t_70" width="720" /></p><p>不多說了總之我很滿足,也很困了。</p><p>希望91flac動作慢點(diǎn),我還有幾首圖大的歌沒下呢,希望明早不會看到已經(jīng)不能用這種方法偷雞了。</p><p> </p><p>睡前PS:</p><p>經(jīng)過測試直接把代碼中urls中的4個URL直接復(fù)制到瀏覽器中也可以打開該音樂并保存,但是獲取到這些URL仍需登錄才行,并且我覺得要批量下載的話還是寫個爬蟲可能還是快些。</p><p>另外這個又牽扯到另一個問題,比如在手機(jī)APP上(如網(wǎng)易云)聽完歌曲,一般即使不緩存,一段時間以內(nèi)是可以離線播放的,這個顯然是得有音樂文件保存在本地的,如何找到它們也是一個有意思的問題(其實(shí)今晚在做這事情之前我還先試了試這個問題,但沒有得到結(jié)果)。</p></div><div class="more-toolbox"><div class="left-toolbox"><ul class="toolbox-list"><li class="tool-item tool-active is-like tool-clicked"><a href="javascript:;"><svg class="icon" aria-hidden="true"><use xlink:href="#csdnc-thumbsup"></use></svg><span class="name">點(diǎn)贊</span><span class="count">1</span></a></li><li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click='{"mod":"popu_824"}'><svg class="icon" aria-hidden="true"><use xlink:href="#icon-csdnc-Collection-G" ></use></svg><span class="name">收藏</span></a></li><li class="tool-item tool-active is-share"><a href="javascript:;"><svg class="icon" aria-hidden="true"><use xlink:href="#icon-csdnc-fenxiang"></use></svg>分享</a></li><!--打賞開始--><!--打賞結(jié)束--></ul></div></div><div class="person-messagebox"><div class="left-message"><a href="https://caoyang.blog.csdn.net"><img src="https://profile.csdnimg.cn/1/E/6/3_cy19980216" class="avatar_pic" username='CY19980216'><img src="https://g.csdnimg.cn/static/user-reg-year/1x/2.png" class="user-years"></a></div><div class="middle-message"><div class="title"><span class="tit"><a href="https://caoyang.blog.csdn.net" data-report-click='{"mod":"popu_379"}' target="_blank">囚生CY</a></span></div><div class="text"><span>發(fā)布了41 篇原創(chuàng)文章</span> · <span>獲贊 135</span> · <span>訪問量 44萬+</span></div></div></div></div></article>?
總結(jié)
- 上一篇: Python学习 Day28 JS函数(
- 下一篇: 关于POS操作的一些文章收集链接