本文共 2323 字,大约阅读时间需要 7 分钟。
仅做技术分享使用,如侵必删
以某网站的视频为例(不同网站的规则不同,这是其中一种未加密的)
在开发者工具中,点击F12,进入开发者模式。在Network选项卡中,点击Media标签,可以看到视频的下载链接。
在Network中的URL列,可以看到视频的下载链接。可以直接复制这个链接使用下载器下载视频。
必须要有完整的请求头信息,否则要么无法访问URL,要么视频无法正确解码。
在浏览器中,将下载链接复制到地址栏,手动刷新页面,获取完整的请求头信息。
可以使用自用的工具类源码,将请求头信息保存为字典类型:
import redef getHeaders(headersStr): headers = {} headersList = re.findall(r':?(.*?): (.*)\n?', headersStr) for headersTuple in headersList: headers[headersTuple[0]] = headersTuple[1] return headers
文件名在下载链接中可以看到,使用正则表达式从URL中提取文件名。
例如,视频的下载链接为:https://example.com/video.mp4
可以使用以下正则表达式提取文件名:
import refile_url = "https://example.com/video_001.mp4"filename = re.findall(r'/(.*?\.mp4)', file_url)[0]print(filename) # 输出:video_001.mp4
保存路径对应的目录必须提前创建好。
可以使用以下命令创建文件夹:
# 创建单层文件夹os.mkdir("路径")# 创建包括父级文件夹在内的各级文件夹os.makedirs("路径")
一切准备就绪后,编写download()
函数,参数包括:
url
:视频下载链接headers
:请求头信息full_file_name
:完整文件名download_path
:文件保存路径import urllib.requestimport osdef download(url, headers, full_file_name, download_path): request = urllib.request.Request(url=url, method="GET", headers=headers) try: response = urllib.request.urlopen(request) os.chdir(download_path) file = open(full_file_name, "wb") file.write(response.read()) file.close() print(f"下载完成!{full_file_name}") except urllib.error.HTTPError as e: if e.code == 404: print("该文件不存在!") else: print(e)
有的网站上传的视频是经过m3u8加密处理过的。
xxxxxxxx000.ts
, xxxxxxxx001.ts
, xxxxxxxx002.ts
.ts
结尾import osdef combineFiles(combinedFileName, downloadPath): try: os.remove(combinedFileName) except FileNotFoundError: pass os.chdir(downloadPath) allTsFileNames = os.listdir() for tsFileName in allTsFileNames: tsFile = open(tsFileName, "rb") combinedFile = open(combinedFileName, "ab") combinedFile.write(tsFile.read()) tsFile.close() os.remove(tsFileName) print("合并完成") os.chdir(defaultPath)
copy /b D:\Python\*.ts D:\Python\combined.mp4
最终,完成一个完整的视频下载工具链,实现从m3u8加密视频到本地合并后的视频文件。
转载地址:http://ilbqz.baihongyu.com/