【Python学习笔记】:Python爬取音频
背景前摇(省流可以不看):
人工智能公司实习,好奇技术老师训练语音模型的过程,遂请教,得知训练数据集来源于爬取某网页的音频。
很久以前看B站@同济子豪兄的《两天搞定图像识别毕业设计》系列,见识到了(祖传代码)爬虫爬取大量图片制作训练数据集的能力,然后我就想到,我之前学的BeautifulSoup和Scrapy都是爬网页文本的,我还从来没有写代码成功且专门爬过视频和图片的经验,那正好学一下,以后没准也可以拿来做自己的数据集,这次就先搞定音频的爬取吧。
原理讲解这部分,我认为下面这个视频无懈可击——言简意赅,简明扼要,时长感人,堪称吾辈楷模!!
【python】几分钟教你如何用python爬取音频数据:
https://www.bilibili.com/video/BV1mL4y1N7eV/?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click&vd_source=cdfd0a0810bcc0bcdbcf373dafdf6a82
传送门
网址后缀只有mp3
————————————————————————————————
原理明白了,下面进入实操细节:我承认我选这个教程的很大原因,是被“突破网站反爬”几个字吸引了。
突破网站反爬-制作简易的音乐播放器【Python】:https://www.bilibili.com/list/watchlater?oid=1556173520&bvid=BV1e1421b73k&spm_id_from=333.1007.top_right_bar_window_view_later.content.click
传送门
老师这个清晰的板书风格,爱了。
意外收获找个歌曲的宝藏网站一枚:歌曲宝,能在线听也能下载
(说真的,感觉有这网站在都不用劳动爬虫大驾,笑死)
https://www.gequbao.com/
传送门————————————————————————————————
思路梳理:
————————————————————————————————
第一部分,单首歌曲采集:
F12/右键——检查,选择”网络“模块,然后点击页面上的刷新按钮,让网页数据重新加载出来。
右边示范的这个链接还是歌曲本身:
下面这个play_url就是我们需要的歌曲播放链接了:
这个有点难点到,先点play_url下面的数据内容,然后再选Headers。
然后就可以看到数据的标头了——可以得知请求网站,请求方法和请求参数等等都可看到。
数据包地址Request URL: https://www.gequbao.com/api/play_url?id=402856&json=1
————————————————————————————————
思路分析清楚后,就该到代码实践步骤了:
主要使用的是请求标头里面的参数,比如这个User-Agent:
user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
插入代码后要注意写成字典形式:
# 模拟浏览器
headers = {
#User-Agent 用户代理,表示浏览器基本身份信息
'User-Agent' :'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
# 请求网址
url = 'https://www.gequbao.com/api/play_url?id=402856&json=1'
————————————————————————————————
经过以上步骤,可以成功获取一个格式类似json的结果:
#导入数据请求模块
import requests
'''发送请求'''
# 模拟浏览器
headers = {
#User-Agent 用户代理,表示浏览器基本身份信息
'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
# 请求网址
url = 'https://www.gequbao.com/api/play_url?id=402856&json=1'
# 发送请求
response = requests.get(url=url, headers=headers)
'''获取数据'''
#获取响应json数据——字典数据
json_data = response.json()
print(json_data)
输出:
{
'code': 1, 'data': {
'url': 'https://sy-sycdn.kuwo.cn/edde772eaab20af3f141ec9f2561df44/66912c2a/resource/n2/70/55/756351052.mp3?bitrate$128&from=vip'}, 'msg': '操作成功'}
通过键值对取值的方式,一层一层获得歌曲的播放链接:
'''获取数据'''
#获取响应json数据——字典数据
json_data = response.json()
'''解析数据'''
#提取歌曲链接(键值对取值)
play_url = json_data['data']['url']
print(json_data)
print(play_url)
————————————————————————————————
下一步是保存数据,现在我们拿到的只是一个链接地址,要想保存到本地,要向这个链接发出请求获取音频内容。
写入数据这部分要用到os这个包,并且写之前要判断是否存在目标路径,如果没有的话会报错。
UP老师为了直观省事(毕竟这个程序很简单)直接指定文件夹的名字并且把存在与否的逻辑判断放在了最开头,但我见的更多的写法是和文件操作放在一起写,比如执行读写操作之前判断一下有无此目录,如果没有的话再建立。
#导入数据请求模块
import requests
#导入文件操作模块
import os
'''自动创建保存音频的文件夹'''
file = 'music'
#判断文件夹是否存在
if not os.path.exists(file):
#创建文件夹
os.mkdir(file