简单版本
1.案例网站
https://www.ikanbot.com/play/810009
爬取思路
- 查看网络请求情况
- 找到M3u8文件
- 获取m3u8文件请求地址
- 获取文件里面ts视频的请求地址
2.python爬虫 同步版本
import requests
import re
import os
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.67"
}
res = requests.get(url="https://vip.lz-cdn14.com/20230709/26398_57ff35b5/2000k/hls/mixed.m3u8", headers=header)
base_url = "G:\DownLoad\python_video_ts"
data_list = re.findall(r"1b.*?\.ts",res.text, re.S)
print("视频长度:%d".format(len(data_list)))
for i in data_list:
print(f"正在下载{i}:")
r = requests.get(url="https://vip.lz-cdn14.com/20230709/26398_57ff35b5/2000k/hls/" + i, headers=header)
with open(os.path.join(base_url, i), "wb") as f:
f.write(r.content)
多线程版本
import requests
import re
import os
import time
from concurrent.futures import ThreadPoolExecutor
def download_task(url, name):
time.sleep(0.7)
r = requests.get(url=url, headers=header, timeout=120)
with open(os.path.join(base_url, name), "wb") as f:
f.write(r.content)
return f"保存成功{name}"
def thread_pool_run():
with ThreadPoolExecutor(max_workers=3) as pool:
url_list = []
name_list = []
for i in data_list:
url_list.append("https://vip.lz-cdn14.com/20230723/27179_8e701887/2000k/hls/" + i)
name_list.append(i)
res = pool.map(download_task, url_list, name_list)
for i in res:
print(i)
print("所有文件下载完成")
if __name__ == "__main__":
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.82"
}
res = requests.get(url="https://vip.lz-cdn14.com/20230723/27179_8e701887/2000k/hls/mixed.m3u8", headers=header)
base_url = "G:\DownLoad\python_video_ts"
data_list = re.findall(r"1885c23cf.*?\.ts",res.text)
print(data_list)
data_len = len(data_list)
print(f"视频长度:{data_len}")
thread_pool_run()
4.生成m3u8文件(用于ffmpeg合并用的)
import os
base_url = "G:\DownLoad\python_video_ts"
with open(os.path.join(base_url, "all_ts.m3u8"), "w") as f:
name_list = os.listdir(base_url)
for i in name_list:
video_path = os.path.join(base_url, i)
f.write(f"file '{video_path}'\n")
生成这种格式的文件
合并ts文件(需要先安装ffmpeg, 添加文件夹的bin目录到环境变量)
ffmpeg -f concat -safe 0 -i all_ts.m3u8 -c copy -y out.mp4