爬虫案例七Python协程爬取视频

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、Python协程爬取视频


前言

提示:这里可以添加本文要记录的大概内容:

爬虫案例七协程爬取视频


提示:以下是本篇文章正文内容,下面案例可供参考

一、Python协程爬取视频

"""
网址:https://www.tpua.vip/play/84942-1-1.html
目标:爬取视频
"""
import requests
import re
from urllib.parse import urljoin
import aiohttp
import aiofiles
import asyncio
import os
import subprocess
head = {
	"":""#自行添加自己的头
}
def get_m3u8_url():
    url = "https://www.tpua.vip/play/84942-1-1.html"
    session = requests.session()
    session.headers = {
		"":""#自行添加自己的头
    }
    resp = session.get(url)
    obj = re.compile(r'"player":"\\/public\\/","url":"(?P<url>.*?)"')
    m3u8_url = obj.search(resp.text).group("url").replace("\\","")
    print(m3u8_url)
    return m3u8_url

def download_m3u8(url):
    session = requests.session()
    session.headers =  {
		"":""#自行添加自己的头
    }

    m3u8_resp = session.get(url)
    # # 保存m3u8
    with open('index.m3u8',mode="w",encoding='utf-8') as f:
        f.write(m3u8_resp.text)
def has_next_m3u8():
    with open("index.m3u8",mode="r",encoding="utf-8") as f:
        for line in f:
            if line.startswith("#EXT-X-STREAM-INF"):
                return f.readline().strip()
    return False

async def download_one(ts_url,file_name,sem):
    print(f"{file_name},开始下载")
    # 设置并发量
    async with sem:
        # 下载
        # 设置超时时间

        async with aiohttp.ClientSession(headers=head) as sess:
            async with sess.get(ts_url) as resp:
                content = await resp.content.read()
                async with aiofiles.open(f"./source/{file_name}", mode="wb") as f:
                    await f.write(content)
    print(f"{file_name},下载完毕")
async def download_all_ts(m3u8_url_2):
    # 信号量,控制并发量
    sem = asyncio.Semaphore(10)
    tasks = []
    i = 1
    with open("index.m3u8",mode='r',encoding='utf-') as f:
        for line in f:
            if i == 10:
                break
            line = line.strip()
            if line.startswith("#"):
                continue
            if not line.startswith("https"):
                line = urljoin(m3u8_url_2, line)
            print(line)
            # 去下载一个ts
            t = asyncio.create_task(download_one(line,f"{i}.ts",sem))
            tasks.append(t)
            i += 1

        await asyncio.wait(tasks)

def create_list():
    input_folder = './source'  # 替换为你的 .ts 文件文件夹路径
    # merge_ts_files(input_folder, output_file)
    # 获取所有 .ts 文件并排序
    ts_files = sorted([os.path.join(input_folder, f) for f in os.listdir(input_folder) if f.endswith('.ts')])

    if not ts_files:
        print("未找到 .ts 文件!")
    # 创建一个临时文件,列出所有 .ts 文件的路径
    file_list_path = os.path.join(input_folder, 'file_list.txt')

    with open(file_list_path, 'w') as f:
        for ts_file in ts_files:
            ts_name = ts_file.split("\\")[-1]
            # print(ts_name)
            f.write("file " + ts_name+"\n")
def main():
    # 提取m3u8的url
    m3u8_url = get_m3u8_url()
    print("提取的m3u8_url",m3u8_url)
    # 下载m3u8文件
    download_m3u8(m3u8_url)
    print("下载m3u8_url文件",m3u8_url)
    # 是否有下一层m3u8
    m3u8_url_2 = has_next_m3u8()
    print("是否有下一层next_m3u8_url",m3u8_url_2)
    while m3u8_url_2:
        # 有下一层拼接url
        m3u8_url = urljoin(m3u8_url,m3u8_url_2)
        # 下载文件
        download_m3u8(m3u8_url)
        print("下载m3u8",m3u8_url)
        # 判断是否还要下一层
        m3u8_url_2 = has_next_m3u8()
        print("是否还有下一层",m3u8_url_2)

    # 异步下载ts
    loop = asyncio.get_event_loop()
    loop.run_until_complete(download_all_ts(m3u8_url))
    
if __name__ == '__main__':
    main()
    create_list()
    # cmd 上输入命令合并视频 ffmpeg -f concat -i file_list.txt -c copy output.mp4 
    # ffmpeg需要自行去下载,并将其bin路径添加到path的环境变量中

流程是在源代码里要找到并用re提取出m3u8的url,并异步去.ts文件,当然有的可能不是.ts,可能是其他的结尾形式如:.jpeg,最后使用ffmpeg合并.ts文件,我并没有全部对.ts文件全部爬取,只是爬取了前10个.ts文件,并进行了视频合并。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/983485.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GB28181视频监控流媒体平台LiveGBS如何自定义收流端口区间以便减少收流端口数或解决端口冲突问题

LiveGBS GB28181流媒体服务在接收视频的时候默认是使用30000-30249&#xff0c; webrtc流播放端口区间默认是UDP的30250-30500区间。有些网络环境不方便开放这么大的端口区间&#xff0c;下面介绍下如何修改配置这个区间。 从页面上修改这个区间&#xff0c;端口区间尽量设置大…

从连接到交互:SDN 架构下 OpenFlow 协议的流程与报文剖析

在SDN架构中&#xff0c;交换机与控制器之间的通信基于 OpenFlow协议&#xff0c;其设计目的是实现控制平面与数据平面的解耦。以下是 交换机连接控制器 和 数据包进入交换机触发交互 的详细流程及协议报文分析&#xff1a; 一、交换机连接控制器的流程&#xff08;初始化阶段&…

每日一练之反转链表

题目&#xff1a; 画图解答&#xff1a; 方法&#xff1a;三指针 代码解答&#xff08;带解析&#xff09;&#xff1a; //题目给的结构体 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct Lis…

虚拟机总结| 关于虚拟机的一些配置总结

前言 每次安装新的虚拟机都需要重新在网上搜索如何配置网络&#xff0c;我需要写一个自己的部署步骤&#xff0c;增加工作效率&#xff0c;不用每次配置的时候再去网上去翻找。 1.只需要联网功能记录(不固定IP) 1.1 修改ifcfg-ens33 vi etc/sysconfig/network-scripts/ifcfg…

【数据结构初阶】---堆的实现、堆排序以及文件中的TopK问题

1.树的概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&…

Autojs无线连接vscode方法

1.获得电脑的IP 在电脑的CMD界面输入 ipconfig 然后找到ipv4的那一行&#xff0c;后面的即是你的电脑IP地址 2.打开vscode的autojs服务 安装autojs插件 在vscode界面按下ctrlshiftp 输入autojs 找到 点击 之后打开手机上的autojs 之后输入刚刚电脑上的地址 可以看到vsc…

【Java开发指南 | 第三十五篇】Maven + Tomcat Web应用程序搭建

读者可订阅专栏&#xff1a;Java开发指南 |【CSDN秋说】 文章目录 前言Maven Tomcat Web应用程序搭建1、使用Maven构建新项目2、单击项目&#xff0c;连续按两次shift键&#xff0c;输入"添加"&#xff0c;选择"添加框架支持"3、选择Java Web程序4、点击&…

PyTorch深度学习框架60天进阶学习计划第16天:循环神经网络进阶!

PyTorch深度学习框架60天进阶学习计划 - 第16天&#xff1a;生成对抗网络原理 学习目标 今天我们将深入探讨生成对抗网络(GAN)的基本原理和数学基础&#xff0c;重点解析GAN的minimax博弈公式&#xff0c;推导生成器与判别器的损失函数&#xff0c;分析Wasserstein GAN的改进…

系统架构设计师—系统架构设计篇—微服务架构

文章目录 概述优势挑战 概述 微服务是一种架构风格&#xff0c;将单体应用划分成一组小的服务&#xff0c;服务之间相互协作&#xff0c;实现业务功能&#xff0c;每个服务运营在独立的进程中&#xff0c;服务间采用轻量级的通信机制协作&#xff08;通常是HTTP/JSON&#xff0…

静态时序分析STA——2. 数字单元库-(2)

参考文献 [1]Static Timing Analysis for Nanometer Designs A Practical Approach [2]静态时序分析圣经翻译计划 三.组合逻辑单元的时序模型 对于一个两输入与门的时序弧&#xff0c;两个时序弧均为正单边类型&#xff08;positive_unate&#xff09;。这意味着对于 NLDM 模型…

Mysql的卸载安装配置以及简单使用

MySQL其它问题已经更新在&#xff1a;MySQL完善配置---可视化-CSDN博客 一、卸载 ①控制面板卸载 ②C盘隐藏项目>ProgramData>mysql相关文件夹&#xff0c;还有Program file下的MySQL文件夹 ③开始菜单栏搜索>服务&#xff0c;找到MySQL相关服务删除&#xff0c;如果再…

第五课:Express框架与RESTful API设计:技术实践与探索

在使用Node.js进行企业应用开发&#xff0c;常用的开发框架Express&#xff0c;其中的中间件、路由配置与参数解析、RESTful API核心技术尤为重要&#xff0c;本文将深入探讨它们在应用开发中的具体使用方法&#xff0c;最后通过Postman来对开发的接口进行测试。 一、Express中…

基于Django的协同过滤算法养老新闻推荐系统的设计与实现

基于Django的协同过滤算法养老新闻推荐系统&#xff08;可改成普通新闻推荐系统使用&#xff09; 开发工具和实现技术 Pycharm&#xff0c;Python&#xff0c;Django框架&#xff0c;mysql8&#xff0c;navicat数据库管理工具&#xff0c;vue&#xff0c;spider爬虫&#xff0…

Facebook 的隐私保护数据存储方案研究

Facebook 的隐私保护数据存储方案研究 在这个信息爆炸的时代&#xff0c;数据隐私保护已成为公众关注的热点。Facebook&#xff0c;作为全球最大的社交媒体平台之一&#xff0c;承载着海量用户数据&#xff0c;其隐私保护措施和数据存储方案对于维护用户隐私至关重要。本文将深…

World of Warcraft [CLASSIC] BigFoot BiaoGe

World of Warcraft [CLASSIC] BigFoot BiaoGe 金团表格插件 设置60秒拍卖装备时间 ALT 鼠标左键&#xff0c;点击装备&#xff0c;弹出对话框&#xff0c;填写 1&#xff09;拍卖时间默认60秒&#xff0c;起拍价&#xff0c; 2&#xff09;点击【开始拍卖】 团队所有安装了…

Docker和DockerCompose基础教程及安装教程

Docker的应用场景 Web 应用的自动化打包和发布。自动化测试和持续集成、发布。在服务型环境中部署和调整数据库或其他的后台应用。从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。 CentOS Docker 安装 使用官方安装脚本自动安装 安装命令…

题解:洛谷 AT_dp_c Vacation

题目https://www.luogu.com.cn/problem/AT_dp_c设 表示对于前 天&#xff0c;以 项目结尾能获得的最大价值。 则&#xff1a; 答案为&#xff1a;。 实现 #include<bits/stdc.h> using namespace std; #define int long long int n,dp[100005][3]; signed main(){i…

通义万相2.1:开启视频生成新时代

文章摘要&#xff1a;通义万相 2.1 是一款在人工智能视频生成领域具有里程碑意义的工具&#xff0c;它通过核心技术的升级和创新&#xff0c;为创作者提供了更强大、更智能的创作能力。本文详细介绍了通义万相 2.1 的背景、核心技术、功能特性、性能评测、用户反馈以及应用场景…

ubuntu 20.04 C++ 源码编译 cuda版本 opencv4.5.0

前提条件是安装好了cuda和cudnn 点击下载&#xff1a; opencv_contrib4.5.0 opencv 4.5.0 解压重命名后 进入opencv目录&#xff0c;创建build目录 “CUDA_ARCH_BIN ?” 这里要根据显卡查询一下,我的cuda是11&#xff0c;显卡1650&#xff0c;所以是7.5 查询方法1&#xff1…

【人工智能】Open WebUI+ollama+deepSeek-r1 本地部署大模型与知识库

目录 一 、命令行下载安装 二、运行 三、添加开机自启服务 ollama serve 四、重新加载配置、重启ollama server 五、查看模型文件信息 六、 添加open-webui 七、 配置open webui 八、创建自己知识库 九、网络加密优化 十、大工告成&#xff0c;大家如果有问题可以私信…