[ 视频爬虫[python] ]


简单版本

1.案例网站

https://www.ikanbot.com/play/810009

爬取思路 - 查看网络请求情况 2 - 找到M3u8文件 3 - 获取m3u8文件请求地址 4 - 获取文件里面ts视频的请求地址 5

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")

生成这种格式的文件 1

合并ts文件(需要先安装ffmpeg, 添加文件夹的bin目录到环境变量)

ffmpeg -f concat -safe 0 -i all_ts.m3u8 -c copy -y out.mp4