用Python撸点视频背景音乐素材
最近疫情,被关烦了,禁足得快发霉了。然后也在学习视频剪辑,视频剪辑需要大量的背景音乐素材,总不能自己唱吧,于是想着网络上撸一些。某度了一下,什么某*fine和某*音悦试听了下,音频里都有万恶的广告,果断放弃,有时间再去撸他们的。今天某*子办公的音乐素材。找到音效配乐栏目,打开开发者工具开始查找。
随便找一首试听,开发者工具-网络-media,可以清楚得看到音频的源文件地址。通过查找源文件地址的某些字符串的时候,发现并没有json数据地址,音频的源文件地址全部渲染在网页文本中并且类似于:https://img-cdn2.xxx.com/sound/00/31/31/45/xxx.mp3。那就简单了。开始构造代码。
单线程:
1 # -*- encoding: utf-8 -*- 2 # @Time: 2022/4/28 10:53 3 # @Author: 、一叶孤城 4 # @File: yespik.py 5 # @IDE: PyCharm 6 # @Motto: ABC(Always Be Coding) 7 8 import concurrent.futures 9 import random 10 import re 11 import time 12 import requests 13 import os 14 15 def get_response(page_url): 16 # 一个获取网页文本的函数 17 headers = { 18 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36', 19 } 20 response = requests.get(url=page_url, headers=headers) # 响应 21 response.raise_for_status() # 排错 22 response.encoding = response.apparent_encoding # 自动识别编码 23 response.encoding = 'utf-8' # 重置编码 24 return response # 返回响应,因为有text和content的内容需要在后面调用,所以只返回响应 25 26 def save_media(media_real_url, media_title): 27 # 先创建文件夹 28 filePath = './视频剪辑音频文件/' # 在当前文档的目录下创建一个文件夹 29 if not os.path.exists(filePath): 30 os.mkdir(filePath) # 创建文件夹 31 32 media_content = requests.get(url=media_real_url).content # 请求音频数据 33 format_name = media_real_url.split('.')[-1] # 取到后缀名 34 # 做个判定吧,一般是有的 35 if media_content: 36 # 如果有数据,就尝试保存 37 # 开始保存 38 try: 39 with open(filePath + media_title + '.' + format_name, mode='wb') as f: 40 f.write(media_content) 41 print(f'--正在保存{media_title},请稍等!') 42 except: 43 print('有异常,请检查!') 44 else: 45 print('没有content数据!') 46 47 def parse_page(url): 48 # 解析列表页的函数 49 media_page_data = get_response(page_url=url).text # 获取列表页面的文本 50 # 音频数据范例:https://img-cdn2.yespik.com/sound/00/31/31/45/313145_60306d4d1114cc554dcfe44ea5cab8a8.mp3 51 # 所以提取音频数据只需要从网页文本数据中用正则提取上面的内容就ok了 52 media_lists = re.findall('src="//(.*?)" type="', media_page_data) 53 # 标题也用正则来提取 54 media_titles = re.findall('<a target="_blank" href="//www.yespik.com/show-sound_\d+.html">(.*?)</a> </div>', media_page_data) 55 media_datas = zip(media_lists, media_titles) 56 57 for media_url, media_title in media_datas: 58 # 构造播放地址的url 59 media_real_url = 'https://' + media_url 60 print(media_real_url, media_title, sep = ' | ') 61 save_media(media_real_url, media_title) 62 63 def main(url): 64 # 主函数 65 parse_page(url) 66 67 if __name__ == "__main__": 68 app = concurrent.futures.ThreadPoolExecutor(max_workers=10) 69 # 开始分页 70 for page in range(1, 30+1): 71 time.sleep(random.uniform(2, 5)) # 随机休眠 72 if page == 1: 73 url = 'https://www.yespik.com/sound/' 74 else: 75 url = f'https://www.yespik.com/sound/0--0-default/p_{page}/' 76 print(f'----------***开始采集第{page}页数据***----------') 77 main(url)
多线程:(在路上)
程序运行截图和保存结果截图:
申明:本文仅供学习和交流使用,如有侵权,请联系我删除。