【附件】页面源代码

本博客是https://blog.csdn.net/CY19980216/article/details/104028709的附件,具体使用方法如下:

  1. 新建一个txt文本文档;
  2. 将以下代码复制进去并保存;
  3. 修改该txt文件的后缀为".html";
  4. 用浏览器打开该.html文件即可看到内容;

原谅我出此下策

<!DOCTYPE html>
<html lang="zh-CN">
<head>

    <link href="https://csdnimg.cn/public/favicon.ico" rel="SHORTCUT ICON">
    <title>【日常】论如何在91flac上优雅地白嫖_python,爬虫_囚生CYのParadise-CSDN博客</title>
    <meta name="description" content="刚回家,放下沙雕的模型和跑不通的代码,准备先做些有趣的事情。事情是这样的,去年我为了找一首河图《白马">
                 <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上优雅地白嫖</h1>
            </div>
            <div class="article-info-box">
                <div class="article-bar-top">
                    <!--文章类型-->
                    <span class="article-type type-1 float-left">原创</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">最后发布于2020-01-18 18:00:04                    </span>
                    <span class="read-count">阅读数 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">发布于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">文章标签:</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>
                                版权声明:本文为博主原创文章,遵循<a href="http://creativecommons.org/licenses/by-sa/4.0/" target="_blank" rel="noopener"> CC 4.0 BY-SA </a>版权协议,转载请附上原文出处链接和本声明。                            </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安装手册结束-->
                <!--####专栏广告位图文切换开始-->
                                    <!--####专栏广告位图文切换结束-->
         <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>刚回家,放下沙雕的模型和跑不通的代码,准备先做些有趣的事情。</p>

<p>事情是这样的,去年我为了找一首河图《白马入芦花》的资源,上求度娘,下翻磁链,皆无所得。然后发现了91flac这个神奇的网站,不仅歌曲收录的数量相当全面,不管是古风一类的小众歌曲,还是周董这种在所有平台都需要付费的大牌歌手的作品,都有资源,并且可以<strong>免费下载绝大多数歌曲的流畅音质版本</strong>(至少我想找的付费歌曲都能下载,而且我这种老年人的耳朵也听不太出无损跟流畅的区别)。</p>

<p>好事并没有持续太久,去年音乐领域基本彻底进入“大版权时代”,想要白嫖歌曲谈何容易唉,91flac很快也“沦陷”,目前的情况是这样的(截至20200118凌晨12点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>因为有用截图部分太长,所以我截了两张图(<strong>图1图2</strong>),注意到第二张图的流畅音质部分<strong>曾经是不需要会员</strong>的,直接有<strong>下载按钮</strong>。往事不堪回首啊。。。</p>

<p>可能有些朋友对91flac并不是很熟悉,首页URL为<a href="https://www.91flac.com/" rel="nofollow">https://www.91flac.com/</a>,用户注册非常简单(<strong>为什么要注册用户?因为不注册你就看不到上面这两张截图,尤其是第二章截图中播放器的部分在不登录的情况下是不会出现的,这个播放器是我接下来要写怎么白嫖的关键所在</strong>),只需要提供邮箱和密码即可,不需要绑定手机,不需要实名认证,不需要填写任何个人信息,某种意义上可以说是很良心的了。</p>

<p>恰好这学期深深地陷入河图的两首歌曲《金榜外·纸上尘埃》和《金榜外·杯酒洗诗》,内心产生了强烈地共鸣,在我眼中可以算得上是盖世的两首神作,可惜各大音乐平台(网易云、酷狗、酷我)都没有,只有腾讯爸爸的QQ音乐有,然后就是我使用的华为手机自带的“华为音乐”里也可以搜到,但显然都肯定是需要付费才能下载的,而我的习惯是遇到好歌一定要把它下载到本地存起来,毕竟吃到嘴里的肉才算得上是自己的。</p>

<p>面对上面两张截图,一筹莫展。但是这个播放器是可以用来试听整首音乐的,我想或许是可以有操作的。</p>

<p>废话不多时,点击F12打开监听器,刷新页面看看上面这两张截图的页面刷新后都有什么东西呗:</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 《金榜外·纸上尘埃》歌曲页面刷新后监听抓包截图(下半部分)👆</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请求响应结果(下半部分)👆</strong></p>

<p>如<strong>图3</strong>所示,26个请求 ,就这么1个POST(红线划出),那么肯定得去看看。<strong>图4</strong>中我们看到它的响应是各种不同音质版本歌曲的信息,size显然是歌曲大小的byte值,对照<strong>图1</strong>与<strong>图2</strong>可以发现,什么flac,ape之类的都可以对得上大小和名称,就是最后一个96aac最特殊,它有一段超长的link,而且对不上<strong>图1</strong>与<strong>图2</strong>中的音质版本。</p>

<p>怎么可能对不上呢?仔细看看<strong>图2</strong>,播放器右上角的96aac是摆设么?我忽然发现可能直接去访问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
# 创作不易, 仅供分享, 勿传播

import os
import time

from requests import Session
from bs4 import BeautifulSoup

class Flac():
	
	def __init__(self,
		email="&lt;您的注册邮箱&gt;",
		password="&lt;您的登陆密码&gt;",
		user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0",
	):
		""" 类构造参数 """
		self.email = email
		self.password = password
		self.user_agent = user_agent
		
		""" 类常用参数 """
		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)是什么了,跟浏览器有所区别,返回的结果是仍是首页的html,可能是因为代码里先访问了首页的缘故,总之显然是不行的。</p>

<p>在此之后我就决定试试看爬虫模拟登录后是否可能有所区别,于是先做了一下模拟登录👇</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 模拟登录测试抓包结果👆</strong></p>

<p>以test@163.com与123456为提交字段测试抓包,看到还好提交字段没有被加密,但是多了一个_token,初步猜测是CSRF验证,因为它的位置处于表单数据中的第一个,以我这种前端小白的直觉,应该是这样的。然后右键打开页面源代码,如下<strong>图7</strong>所示,红线部分恰好为_token,验证了猜想。</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
# 创作不易, 仅供分享, 勿传播

import os
import time

from requests import Session
from bs4 import BeautifulSoup

class Flac():
	
	def __init__(self,
		email="&lt;您的注册邮箱&gt;",
		password="&lt;您的登录密码&gt;",
		user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0",
	):
		""" 类构造参数 """
		self.email = email
		self.password = password
		self.user_agent = user_agent
		
		""" 类常用参数 """
		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开发的经验来看, csrf-token总是是作为第一个参数, 所以后端一般会选择过滤掉第一个字段
			"_token": csrf_token,
			"email": self.email,
			"password": self.password,
		}
		r = self.session.post(self.loginURL,data=formdata)				 # POST提交登录字段

		""" 判断登录是否成功: 目前简单根据title字段来判断 """
		html = r.text
		soup = BeautifulSoup(html,"lxml")
		title = str(soup.find("title").string)
		if "登录" in title: return False									 # 20200117登录失败的title为: &lt;title&gt;登录_91flac.com无损音乐网&lt;/title&gt;
		else: return True												 # 20200117登录成功的title为: &lt;title&gt;我的资料_13856244865_91flac.com无损音乐网&lt;/title&gt; 		

		
if __name__ == "__main__":
	f = Flac()
	flag = f.login()
	if flag: print("登陆成功")
	else: print("登陆失败")
</code></pre>

<p>事实上即便使用登陆后的session仍然无法得到我想要的东西,事情又变得坏起来了。</p>

<p>睡前准备再试试,于是试着监听点击<strong>图2</strong>中的播放器的播放按钮,听一段音乐,看看会有什么好事发生呗。</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 《金榜外·纸上尘埃》歌曲页面点击播放按钮后监听抓包情况👆</strong></p>

<p>天晴了,雨停了,图大唱起来了,我觉得自己又行了。看到这两个包,第一个是重定向302,显然不靠谱(<strong>仔细看看第一个其实就是图5中访问的URL,只是查询字符串中的token换了而已</strong>), 那我们看看第二个的响应是什么呗</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 《金榜外·纸上尘埃》歌曲页面点击播放按钮后监听抓包:第二个包的响应结果👆</strong></p>

<p>这一串莫名其妙的串让我想到了之前模拟登录B站时抓取canvas画布上的验证图片抓包时同样看到了类似的东西,我想可能八九不离十了。但是我很难找到这个请求的URL是从哪里截取得到的(可能有点蠢,找不到),所以我就直接复制了请求URL做了测试👇</p>

<pre class="has">
<code>		urls = [
			"http://mobileoc.music.tc.qq.com/C400001dyoiE0eCdgK.m4a?guid=FA&amp;vkey=E7EF3A574783636B3E9F4A75C819810AB7F230CF819A76C044746BBB16A07A9169242B5EF3960A1DBEFE1FB47F27B490577AFB8B2ECD3989&amp;uin=0&amp;fromtag=8",
			"http://mobileoc.music.tc.qq.com/C400004D66CL3XaKNU.m4a?guid=FA&amp;vkey=3DD5852551E8778622E753569E02ACA04E6B11FDCCD1231A7DE2FE1F54A675740C91472E7318D5305E71A4611354139396B816CDD738D2C1&amp;uin=0&amp;fromtag=8",
			"http://mobileoc.music.tc.qq.com/C400002u6wBM0LSG0Q.m4a?guid=FA&amp;vkey=B9EA91CCCB41BC9E158DFA518E16CF78EE556AD2567C2CECB787E6FB1442DAC0106BF2BAE27D5809FEB9F1EEBBA76326B1E088DAE132D782&amp;uin=0&amp;fromtag=8",
			"http://mobileoc.music.tc.qq.com/C400000NXIup1NeWNq.m4a?guid=FA&amp;vkey=4B8094605617C0A65DB19F664466B5555967F4259C6835A474A69C51C99F1A36C961C2806F8916A65DAC8BDF4BB945CC50155D972E246182&amp;uin=0&amp;fromtag=8",	
		]
# 这些URL在不同时间段复制都是不一样的(即"?"后面的查询字符串都是有差异的),但是我试下来这些URL并非阅后即焚,是可以重复使用的,至于多久失效,我没有做测试,总之能用就行了。</code></pre>

<p>这里分别是我手动复制的4首歌请求URL(即<strong>图9</strong>中抓包的请求URL),从上到下分别是《金榜外·纸上尘埃》《金榜外·杯酒洗诗》《金榜外·纸上尘埃(伴奏)》《金榜外·杯酒洗诗(伴奏)》。</p>

<p>这些URL在不同时间段复制都是不一样的(即"?"后面的查询字符串都是有差异的),但是我试下来这些URL并非阅后即焚,是可以重复使用的,至于多久失效,我没有做测试,总之能用就行了。</p>

<p>下载代码如下所示</p>

<pre class="has">
<code># -*- coding: UTF-8 -*-
# Author: 囚生
# 时间:20200118
# 创作不易, 仅供分享, 勿传播

import os
import time

from requests import Session
from bs4 import BeautifulSoup

class 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",
	):
		""" 类构造参数 """
		self.email = email
		self.password = password
		self.user_agent = user_agent
		
		""" 类常用参数 """
		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开发的经验来看, csrf-token总是是作为第一个参数, 所以后端一般会选择过滤掉第一个字段
			"_token": csrf_token,
			"email": self.email,
			"password": self.password,
		}
		r = self.session.post(self.loginURL,data=formdata)				 # POST提交登录字段

		""" 判断登录是否成功: 目前简单根据title字段来判断 """
		html = r.text
		soup = BeautifulSoup(html,"lxml")
		title = str(soup.find("title").string)
		if "登录" in title: return False								 # 20200117登录失败的title为: &lt;title&gt;登录_91flac.com无损音乐网&lt;/title&gt;
		else: return True												 # 20200117登录成功的title为: &lt;title&gt;我的资料_13856244865_91flac.com无损音乐网&lt;/title&gt; 		

	def download(self):

		flag = self.login()
		if flag: print("登录成功!")
		else:
			return False
			print("登陆失败!")

		urls = [
			"http://mobileoc.music.tc.qq.com/C400001dyoiE0eCdgK.m4a?guid=FA&amp;vkey=E7EF3A574783636B3E9F4A75C819810AB7F230CF819A76C044746BBB16A07A9169242B5EF3960A1DBEFE1FB47F27B490577AFB8B2ECD3989&amp;uin=0&amp;fromtag=8",
			"http://mobileoc.music.tc.qq.com/C400004D66CL3XaKNU.m4a?guid=FA&amp;vkey=3DD5852551E8778622E753569E02ACA04E6B11FDCCD1231A7DE2FE1F54A675740C91472E7318D5305E71A4611354139396B816CDD738D2C1&amp;uin=0&amp;fromtag=8",
			"http://mobileoc.music.tc.qq.com/C400002u6wBM0LSG0Q.m4a?guid=FA&amp;vkey=B9EA91CCCB41BC9E158DFA518E16CF78EE556AD2567C2CECB787E6FB1442DAC0106BF2BAE27D5809FEB9F1EEBBA76326B1E088DAE132D782&amp;uin=0&amp;fromtag=8",
			"http://mobileoc.music.tc.qq.com/C400000NXIup1NeWNq.m4a?guid=FA&amp;vkey=4B8094605617C0A65DB19F664466B5555967F4259C6835A474A69C51C99F1A36C961C2806F8916A65DAC8BDF4BB945CC50155D972E246182&amp;uin=0&amp;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()函数中的urls变量里放入我要下载的歌曲的URL(自己到浏览器抓包页面手动复制),然后get请求后以"wb"模式将响应的content写入mp3文件(我这里是test0.mp3,test1.mp3,test2.mp3,test2.mp3)</p>

<p>运行结果如<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 运行后工作目录下的文件结果👆 </strong></p>

<p>看这些文件的大小,与<strong>图4</strong>中的抓包响应结果大致匹配,我确信已经成功了,打开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,因为我不希望我的电脑上有乱七八糟的APP,能不装的APP我都尽量是不装,所以只能用浏览器打开。显然是打开失败了,我猜想这个文件不是mp3格式的(后发现是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动作慢点,我还有几首图大的歌没下呢,希望明早不会看到已经不能用这种方法偷鸡了。</p>

<p> </p>

<p>睡前PS:</p>

<p>经过测试直接把代码中urls中的4个URL直接复制到浏览器中也可以打开该音乐并保存,但是获取到这些URL仍需登录才行,并且我觉得要批量下载的话还是写个爬虫可能还是快些。</p>

<p>另外这个又牵扯到另一个问题,比如在手机APP上(如网易云)听完歌曲,一般即使不缓存,一段时间以内是可以离线播放的,这个显然是得有音乐文件保存在本地的,如何找到它们也是一个有意思的问题(其实今晚在做这事情之前我还先试了试这个问题,但没有得到结果)。</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">点赞</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>
                        <!--打赏开始-->
                                                <!--打赏结束-->
                                            </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>发布了41 篇原创文章</span> · <span>获赞 135</span> · <span>访问量 44万+</span></div>
                </div>
                            </div>
                    </div>
    </article>
    

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值