寻找东莞微信网站建设,做英语在线翻译兼职网站,昆山网络公司哪家比较好,昌吉北京网站建设#x1f4da;博客主页#xff1a;knighthood2001 ✨公众号#xff1a;认知up吧 #xff08;目前正在带领大家一起提升认知#xff0c;感兴趣可以来围观一下#xff09; #x1f383;知识星球#xff1a;【认知up吧|成长|副业】介绍 ❤️如遇文章付费#xff0c;可先看… 博客主页knighthood2001 ✨公众号认知up吧 目前正在带领大家一起提升认知感兴趣可以来围观一下 知识星球【认知up吧|成长|副业】介绍 ❤️如遇文章付费可先看看我公众号中是否发布免费文章❤️ 笔者水平有限欢迎各位大佬指点相互学习进步 在之前的文章我们实现了将指定视频下载下来并且实现了将下载的视频音频合并成完整视频。
今天我们要实现的将多个指定视频进行下载。
项目架构
运行前就这三个文件一个ffmpeg.exe用来将视频音频进行合并url.txt用来存放你要爬取的url
url.txt中放的url链接如下
运行后会产生两个保存视频的文件夹。
替换不能作为文件名的字符
这里我注意到有些标题中存在不能作为文件名的字符因此需要将其替换。这里选择将其替换成空格。
# 定义一个函数用于替换文件名中的特定字符
def sanitize_filename(filename):# 使用正则表达式替换文件名中的特定字符sanitized_filename re.sub(r[/\:*?|], , filename)return sanitized_filename全部代码
import requests
import re
import json
import os
import subprocess
# 函数下载并保存视频和音频
def download_video_and_audio(url, headers):try:# 发送请求response requests.get(urlurl, headersheaders)response.raise_for_status() # 如果响应状态不是200将抛出异常html response.text# 解析数据提取视频标题title re.findall(title(.*?), html)[0]print(f视频标题: {title})new_title sanitize_filename(title)# 解析视频信息info re.findall(window.__playinfo__(.*?)/script, html)[0]json_data json.loads(info)# 提取视频链接和音频链接video_url json_data[data][dash][video][0][baseUrl]audio_url json_data[data][dash][audio][0][baseUrl]print(f视频链接: {video_url})print(f音频链接: {audio_url})# 下载视频内容video_content requests.get(urlvideo_url, headersheaders).content# 下载音频内容audio_content requests.get(urlaudio_url, headersheaders).contentif not os.path.exists(process_video):os.makedirs(process_video)# 保存视频和音频数据with open(fprocess_video\\{new_title}.mp4, modewb) as v:v.write(video_content)with open(fprocess_video\\{new_title}.mp3, modewb) as a:a.write(audio_content)print(下载完成)return new_title # 返回视频标题except requests.exceptions.RequestException as e:print(f请求错误: {e})except json.JSONDecodeError:print(解析JSON时出错)except Exception as e:print(f发生错误: {e})def merge_video(title):print(开始合并视频...)if not os.path.exists(finally_video):os.makedirs(finally_video)# 合并成完整的视频内容cmd fffmpeg -hide_banner -i process_video\\{title}.mp4 -i process_video\\{title}.mp3 -c:v copy -c:a aac -strict experimental finally_video\\{title}output.mp4# 调用命令subprocess.run(cmd)# 定义一个函数用于替换文件名中的特定字符
def sanitize_filename(filename):# 使用正则表达式替换文件名中的特定字符sanitized_filename re.sub(r[/\:*?|], , filename)return sanitized_filenameif __name__ __main__:cookie buvid32844B77E-F527-FB05-1DF5-9FDF834AE3E888277infoc; b_nut1709986388; i-wanna-go-back-1; b_ut7; _uuid6577D687-BED9-9AE2-106A10-551210627F5AC88087infoc; enable_web_pushDISABLE; buvid45ED5B3A0-A998-7D47-3815-9AD9A1B27A4989131-024030912-0Fw3r6dKwZLwPoWOl%2F8HuA%3D%3D; CURRENT_FNVAL4048; rpdid|(u|Jmkkuukk0Ju~u|ulR~)~; header_theme_versionCLOSE; fingerprintc27c0b59dd10dcdc4c14701a58f49669; buvid_fp_plainundefined; LIVE_BUVIDAUTO6217111182462626; FEED_LIVE_VERSIONV_WATCHLATER_PIP_WINDOW3; bp_video_offset_691902317925084214145056785; DedeUserID691902317; DedeUserID__ckMd5ead312019baad7ed; CURRENT_QUALITY80; home_feed_column4; PVID1; bili_ticketeyJhbGciOiJIUzI1NiIsImtpZCI6InMwMyIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTY1NjYyODAsImlhdCI6MTcxNjMwNzAyMCwicGx0IjotMX0.4OcEc8xnUd8GPCTUkZM9UBejaRUnP0dhhjgL_DuFkgY; bili_ticket_expires1716566220; SESSDATA8abf5422%2C1731859084%2Ce2fa9%2A51CjD4mACI26GPIuH7wAe_rVLLXDq2VIckm2YvNvZpeMgzOMZCFVGss2CRvlLzxdOTmpASVk9nbUJtTU1QaWFqcUw1aWN5M19UMW0zdkhsZkdHRFdHdTZ1VVEzRUFmVUtKejhfS3FraFZ5WGM1OUstS1ZyeGRDTDhLM2Z1ekFuN09FcXFyaWIzWElnIIEC; bili_jctecb04e890e743862a38e01c7f37e08dd; bp_t_offset_691902317934571401762832385; buvid_fpc27c0b59dd10dcdc4c14701a58f49669; b_lsidCB3EFD71_18FA63D003A; bmg_af_switch1; bmg_src_def_domaini0.hdslb.com; browser_resolution675-639filename url.txt# 打开文件with open(filename, r, encodingutf-8) as file:# 逐行读取for line in file:# 打印每一行的内容print(line.strip()) # 使用strip()移除每行末尾的换行符url line.strip()headers {Referer: url,User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36,Cookie: cookie}# 调用函数title download_video_and_audio(url, headers)merge_video(title)这里和之前的博客代码相比在下载视频获取其标题的时候应该需要调用替换字符的函数。new_title sanitize_filename(title)
要注意我把读取每行写在了最外面因为考虑到如果将全部url读取存到列表中不太符合日常减少内存开销的好习惯。
不过大家平时可以将其封装成函数然后返回一个都是url的列表。