我们要做的是用 python 抓取浏览器中的音乐资源
我们要知道,通常我们访问浏览器中的网页来听歌,读文章,看视频都是通过浏览器中的点击、输入等操作,对目标网站的服务器发送请求,服务器给予相对的响应得以实现的。
这意味着,如果我们可以通过浏览器听歌,那么服务器中相应的音频文件就被浏览器获取了。这就为我们用程序大规模的抓取提供了可能。哪怕网页中没有下载的相关选项,我们也可以直接将准备用于播放的音频文件直接下载到本地
明白了原理我们就可以将思路简化
即:通过程序访问网址(目标服务器),找到音频文件位置,并下载到本地。
我们对网页进行请求要用到python中的requests库
import requsets
resp = requests.get(url)
requests库中的get函数可以以GET请求访问指定的url(统一资源定位系统)并将响应返回,这里我将请求URL返回的东西放进了变量resp中,所以我们只要找到返回音频文件的URL就行啦
我这里用某某音乐网站做演示,假设我们要抓取《大鱼》相关歌曲
其他的老师没教,我不会(手动狗头)
要从服务器中抓取目标音频文件,我们首先要知道这个文件在服务器的什么地方。也就是含有这个音频文件的网址。
哪里会有我们想要的音频文件呢?
音乐播放页面都将音频文件播放了,那里肯定有(确信)。所以我们进入大鱼播放页面
在浏览器中按F12(或右键选择检查)
进入开发者模式(我用的是Microsoft Edge浏览器)
点击‘网络’('network')选项,里面显示了当前网页从此刻开始对服务器的请求与响应的内容
有时打开后里面没啥东西是因为网页加载的差不多了,对服务器没有新的请求了,此时刷新一下网页(重新请求服务器),服务器会将该网页重新响应给浏览器,就会有东西了。
这行可以分类显示请求和服务器的响应,我们要抓音频文件的话一般要去‘媒体’里面找,不过大多数网站都做了反爬机制,大概率是找不到的(doge)。
直接找不到文件没关系,既然没有直接响应音频文件,它总会调用音频文件(.mp3)吧。我们可以在请求框的左边直接搜索包含'.mp3'的请求
搜索后我们发现一个index.php的响应,点击它目录下的那个小1
我们可以在响应中发现,这个相应貌似有点像json文件啊,我们在标头中找到请求URL将它复制在标签新页中打开,刚才在响应中看到的内容就被呈现出来了。将呈现出来的内容去掉前后不符合json文件格式的部分,剩下的复制到下方网站中JSON在线解析及格式化验证 - JSON.cnhttps://www.json.cn/
我们就可以看懂这个文件所包含的内容了,我们可以在“data”键所对的列表中找到下面这两个URL
将URL复制在新标签页中打开,发现音乐开始播放了!好了,现在我们找到返回音频文件的URL
(我也不知道这俩有啥区别,但是看目录雀食都指向同一个文件,但play_url打不开显示403,无权限访问,另一个可以正常打开但只能播放一分钟,就算搞到自己电脑上也只有一分钟,回到浏览器中听,结果也是听一分钟然后让下载客户端,我估摸着某狗音乐的音频文件就只有完整歌曲切片,他有些歌就没放完整歌曲)
我们已经获得了可以返回音频文件的url,我们的程序只需要访问url,将返回的内容写入文件就可以了,所以我们的代码核心就是下面两个操作
music_url="https://webfs.ali.kugou.com/202304131339/250b7148bf0fffeaa72e7029d2efa96f/part/0/960111/KGTX/CLTX001/clip_bfbdd3df47727b701d4480ea36a8f73b.mp3"
resp = requests.get(music_url,headers=my_headers) # music_url就是我们刚刚找到的url
with open('目标音乐.mp3','wb') as f: # 将音频文件写入到“目标音乐.mp3”中
f.write(resp.content) # .content 返回的是二进制的数据(bytes)
有心的同学已经发现了,在我们进行request的时候还有一个headers参数,headers是请求头,服务器的服务对象是用户也就是人,当我们用程序访问服务器时,服务器是不会提供服务的,所以我们就要对我们的请求进行伪装。程序与人的访问区别就在于请求头,一般我们访问的时候,我们的浏览器向服务器发送请求,会根据我们电脑的信息以及使用浏览器的信息自动加上请求头。
所以要进行伪装我们就要手动加上请求头,如下:
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.62',
'cookie':'kg_mid=de44f639ea991660223a5aa840ca404a; kg_dfid=4FHhDn2dR2xe05M6zP1ZqrxN; kg_dfid_collect=d41d8cd98f00b204e9800998ecf8427e; Hm_lvt_aedee6983d4cfc62f509129360d6bb3d=1680399404,1680405501; kg_mid_temp=de44f639ea991660223a5aa840ca404a; Hm_lpvt_aedee6983d4cfc62f509129360d6bb3d=1680407859'}
这个简单的请求头中包含了两个参数‘user-agent’和‘cookie’,前者取决以你的电脑与浏览器(是不会改变的),后者取决于访问的服务器(具有时效性,具体有效时间多长人家说了算)这两个参数都能在开发者模式中找到
这样我们用程序抓取单个音乐的程序就完成了!
以下是完整代码示例
import requests
#伪装(请求头)
my_headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.62'}
#存有音频文件的url
music_url = "https://webfs.ali.kugou.com/202304131339/250b7148bf0fffeaa72e7029d2efa96f/part/0/960111/KGTX/CLTX001/clip_bfbdd3df47727b701d4480ea36a8f73b.mp3"
resp = requests.get(music_url,headers=my_headers) #访问url获取音频文件
with open('目标音乐.mp3','wb') as f:
f.write(resp.content) #将音频文件保存
结语:这个简单代码只是抓取了单个音乐文件,但如果爬虫只能做到这种事情那还真没啥存在的必要,还不如我直接手动访问url下载
获取音乐列表选择下载的那篇我还在写,等我肝出来我往这放个链接(狗头保命)