视频下载

简介: 利用python爬虫爬取视频

下载m3u8中的视频,下载下来的是一个个ts文件切片,最终合并为mp4文件

import shutil
import time
from urllib.parse import urljoin

import requests
import os
import re
from concurrent.futures import ThreadPoolExecutor, wait


def get_m3u8_url(url):
    '''
    获取页面中m3u8的url
    :param url: 电影页面的url
    :return:
    '''
    session = requests.Session()
    # 访问首页获取cookie
    session.get('https://www.9meiju.cc/', headers=headers)
    # url = 'https://www.9meiju.cc/mohuankehuan/shandianxiadibaji/1-2.html'
    response = session.get(url, headers=headers)
    response.encoding = 'UTF-8'
    data = response.text
    # print(data)
    m3u8_uri = re.search('"url":"(.+?index.m3u8)"', data).group(1).replace('\\', '')


    # 请求可以获取index.m3u8文件
    response = session.get(m3u8_uri, headers=headers)
    response.encoding = 'UTF-8'
    data = response.text
    # 拆分返回的内容获取真整的index.m3u8文件的url
    # 注意 一定要strip
    url = data.split('/', 3)[-1].strip()
    print(data)
    print('m3u8_uri', m3u8_uri)
    url = urljoin(m3u8_uri, url)
    print('url', url)
    return url

def down_video(url, i):
    '''
    下载ts文件
    :param url:
    :param i:
    :return:
    '''
    # print(url)
    # 下载ts文件
    resp = requests.get(url, headers=headers)
    with open(os.path.join(path, str(i)+'.ts'), mode="wb") as f3:
        f3.write(resp.content)
    # print('{} 下载完成!'.format(url))


def download_all_videos(url, path):
    '''
    下载m3u8文件以及多线程下载ts文件
    :param url:
    :param path:
    :return:
    '''
    # 请求m3u8文件进行下载
    resp = requests.get(url, headers=headers)
    with open("index.m3u8", mode="w", encoding="utf-8") as f:
        f.write(resp.content.decode('UTF-8'))
    if not os.path.exists(path):
        os.mkdir(path)
    # 开启线程 准备下载
    pool = ThreadPoolExecutor(max_workers=50)
    # 1. 读取文件
    tasks = []
    i = 0
    with open("index.m3u8", mode="r", encoding="utf-8") as f:
        for line in f:
            # 如果不是url 则走下次循环
            if line.startswith("#"):
                continue
            print(line, i)
            # 开启线程
            tasks.append(pool.submit(down_video, line.strip(), i))
            i += 1
    print(i)
    # 统一等待
    wait(tasks)



# 解析伪装成png的ts
def resolve_ts(src_path, dst_path):
    '''
    如果m3u8返回的ts文件地址为
    https://p1.eckwai.com/ufile/adsocial/7ead0935-dd4f-4d2f-b17d-dd9902f8cc77.png
    则需要下面处理后 才能进行合并
    原因在于 使用Hexeditor打开后,发现文件头被描述为了PNG
    在这种情况下,只需要将其中PNG文件头部分全部使用FF填充,即可处理该问题
    :return:
    '''
    if not os.path.exists(dst_path):
        os.mkdir(dst_path)
    file_list = sorted(os.listdir(src_path), key=lambda x: int(x.split('.')[0]))
    for i in file_list:
        origin_ts = os.path.join(src_path, i)
        resolved_ts = os.path.join(dst_path, i)
        try:
            infile = open(origin_ts, "rb")  # 打开文件
            outfile = open(resolved_ts, "wb")  # 内容输出
            data = infile.read()
            outfile.write(data)
            outfile.seek(0x00)
            outfile.write(b'\xff\xff\xff\xff')
            outfile.flush()
            infile.close()  # 文件关闭
            outfile.close()
        except:
            pass
        """
        else:
            # 删除目录
            shutil.rmtree(src_path)
            # 将副本重命名为正式文件
            os.rename(dst_path, dst_path.rstrip('2'))
        """
        print('resolve ' + origin_ts + ' success')


# 处理m3u8文件中的url问题
def do_m3u8_url(path, m3u8_filename="index.m3u8"):
    # 这里还没处理key的问题
    if not os.path.exists(path):
        os.mkdir(path)

    with open(m3u8_filename, mode="r", encoding="utf-8") as f:
        data = f.readlines()

    fw = open(os.path.join(path, m3u8_filename), 'w', encoding="utf-8")
    abs_path = os.getcwd()
    i = 0
    for line in data:
        # 如果不是url 则走下次循环
        if line.startswith("#"):
            fw.write(line)
        else:
            fw.write(f'{abs_path}/{path}/{i}.ts\n')
            i += 1

def merge(path, filename='output'):
    '''
    进行ts文件合并 解决视频音频不同步的问题 建议使用这种
    :param filePath:
    :return:
    '''
    os.chdir(path)
    cmd = f'ffmpeg -i index.m3u8 -c copy {filename}.mp4'
    os.system(cmd)


if __name__ == '__main__':
    headers = {
   
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36"
    }
    url = get_m3u8_url('https://www.9meiju.cc/mohuankehuan/shandianxiadibaji/1-20.html')
    # 抓取99美剧闪电侠
    # ts文件存储目录
    path = 'ts'
    # 下载m3u8文件以及ts文件
    download_all_videos(url, path)
    # 合并png的ts文件
    src_path = path
    dst_path = path+'2'
    resolve_ts(src_path, dst_path)
    do_m3u8_url(dst_path)
    merge(dst_path, '闪电侠')
    print('over')
目录
相关文章
|
9月前
|
人工智能 关系型数据库 分布式数据库
PolarDB开源社区精华内容导航
汇聚PolarDB开发者社区开发者、KOL以及官方精华内容
|
10月前
|
Ubuntu API 数据库
PXD 部署 阿里云 PolarDB-X 集群(企业版、标准版)教程
本文详细演示了使用PXD在Ubuntu 24.04上部署PolarDB-X企业版和标准版集群的完整流程,涵盖环境准备、Docker与Python配置、PXD安装、集群创建、连接测试及销毁等步骤,并附多篇主流操作系统安装指南,助力快速搭建分布式数据库环境。
2731 6
|
10月前
|
敏捷开发 监控 数据可视化
产品研发轻量化管理工具(Sprint Board):敏捷落地的核心载体,让迭代效率倍增
Sprint Board 是面向敏捷团队的轻量化迭代管理工具,以极简看板串联“需求规划-任务拆解-执行跟踪-交付复盘”全流程。支持拖拽操作、实时同步、燃尽图与阻塞标记,助力中小团队快速落地Scrum,聚焦价值交付,降低协作内耗。(239字)
|
Web App开发 安全 数据安全/隐私保护
利用Python+Requests实现抖音无水印视频下载
利用Python+Requests实现抖音无水印视频下载
|
机器学习/深度学习 存储 算法
动态规划算法深度解析:0-1背包问题
0-1背包问题是经典的组合优化问题,目标是在给定物品重量和价值及背包容量限制下,选取物品使得总价值最大化且每个物品仅能被选一次。该问题通常采用动态规划方法解决,通过构建二维状态表dp[i][j]记录前i个物品在容量j时的最大价值,利用状态转移方程避免重复计算子问题,从而高效求解最优解。
1163 1
|
10月前
|
Linux 数据库
Linux 环境 Polardb-X 数据库 单机版 rpm 包 安装教程
本文介绍在CentOS 7.9环境下安装PolarDB-X单机版数据库的完整流程,涵盖系统环境准备、本地Yum源配置、RPM包安装、用户与目录初始化、依赖库解决、数据库启动及客户端连接等步骤,助您快速部署运行PolarDB-X。
2228 2
Linux 环境 Polardb-X 数据库 单机版 rpm 包 安装教程
|
7月前
|
人工智能 Rust 前端开发
边缘智能与硬件融合——软件定义的新边界
教程来源 http://yvyus.cn/category/shengxiaoyunshi.html 2026嵌入式开发迎来深度变革:敏捷化转型打破软硬壁垒;TinyML赋能边缘智能,实现低延时高隐私;RISC-V崛起终结硬件锁定;Qt 6.x统一跨平台UI,覆盖MCU至高端显示;全栈生态融合边缘、云与端,构建高效协同数字系统。
|
人工智能 算法 调度
端侧宠物识别+拍摄控制智能化:解决设备识别频次识别率双低问题
随着宠物成为家庭重要成员,其影像创作需求激增。传统相机“人脸优先”逻辑难以应对宠物拍摄的复杂场景,如毛发模糊、动态多变、光照反差大等。本文基于端侧AI与影像工程经验,系统梳理宠物识别驱动的对焦曝光重构技术,结合算法与产业实践,构建从检测到参数调度的完整解决方案,推动拍摄技术向“宠物优先”转型。
657 0
|
12月前
|
编解码 API C++
【实用技巧】火语言 RPA“鼠标 / 元素点击” 组件:模拟鼠标点击 vs 浏览器接口点击的核心区别
火语言 RPA“鼠标 / 元素点击” 组件中,有两种核心点击方式 ——“模拟鼠标点击” 和 “通过浏览器接口自动点击元素”,:前者是完全模拟真人手动操作的点击逻辑,后者则是直接向浏览器发送指令、触发元素点击功能。
|
11月前
|
人工智能 自然语言处理 安全
2025-2026智能客服选型推荐:主流方案实测与甄选
2025 年,AI Agent 技术的规模化落地与大模型的行业化适配,推动智能客服行业迈入“全链路价值协同 + 场景化主动服务”的成熟周期。中国电子技术标准化研究院数据显示,零售、金融、政务三大核心领域的智能客服渗透率已突破 65%,部分头部企业的 AI 服务占比更是超过 80%。对于企业而言,智能客服已不再是单纯的“成本优化工具”,更升级为串联售前引流、售中转化、售后复购的业务增长引擎,成为数字化转型的核心基础设施。