爬虫案例七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_urldef download_m3u8(url):session = requests.session()session.headers =  {"":""#自行添加自己的头}m3u8_resp = session.get(url)# # 保存m3u8with 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 Falseasync 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 = 1with open("index.m3u8",mode='r',encoding='utf-') as f:for line in f:if i == 10:breakline = line.strip()if line.startswith("#"):continueif not line.startswith("https"):line = urljoin(m3u8_url_2, line)print(line)# 去下载一个tst = asyncio.create_task(download_one(line,f"{i}.ts",sem))tasks.append(t)i += 1await 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的urlm3u8_url = get_m3u8_url()print("提取的m3u8_url",m3u8_url)# 下载m3u8文件download_m3u8(m3u8_url)print("下载m3u8_url文件",m3u8_url)# 是否有下一层m3u8m3u8_url_2 = has_next_m3u8()print("是否有下一层next_m3u8_url",m3u8_url_2)while m3u8_url_2:# 有下一层拼接urlm3u8_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)# 异步下载tsloop = 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文件,并进行了视频合并。

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

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


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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++指南】一文总结C++类和对象【中】

&#x1f31f; 各位看官好&#xff0c;我是egoist2023&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习C类和对象的语法知识。注意&#xff1a;在本章节中&#xff0c;小编会以Date类举例 &#x1f44d; 如果觉得…

Python 入

Python 入侵交换机 随着网络安全威胁不断增加&#xff0c;对于网络设备的安全防护变得愈发重要。而交换机作为网络中重要的设备之一&#xff0c;也需要加强安全保护。本文将介绍如何利用Python来入侵交换机&#xff0c;并对其进行漏洞扫描和安全检测。 1. Python 入侵交换机原…

『PostgreSQL』PGSQL备份与还原实操指南

&#x1f4e3;读完这篇文章里你能收获到 了解逻辑备份与物理备份的区别及适用场景&#x1f50d;。掌握全库、指定库、指定表备份还原的命令及参数&#x1f4dd;。学会如何根据业务需求选择合适的备份策略&#x1f4ca;。熟悉常见备份还原问题的排查与解决方法&#x1f527;。 …

《Python实战进阶》No20: 网络爬虫开发:Scrapy框架详解

No20: 网络爬虫开发&#xff1a;Scrapy框架详解 摘要 本文深入解析Scrapy核心架构&#xff0c;通过中间件链式处理、布隆过滤器增量爬取、Splash动态渲染、分布式指纹策略四大核心技术&#xff0c;结合政府数据爬取与动态API逆向工程实战案例&#xff0c;构建企业级爬虫系统。…

Spring Boot整合WebSocket

目录 ?引言 1.WebSocket 基础知识 ?1.1 什么是 WebSocket&#xff1f; ?1.2 WebSocket 的应用场景 ?2.Spring Boot WebSocket 整合步骤 2.1 创建 Spring Boot 项目 2.2 添加 Maven 依赖 2.3 配置 WebSocket 2.4 创建 WebSocket 控制器 2.5 创建前端页面 引言 在…

《OkHttp:工作原理 拦截器链深度解析》

目录 一、OKHttp 的基本使用 1. 添加依赖 2. 发起 HTTP 请求 3. 拦截器&#xff08;Interceptor&#xff09; 4. 高级配置 二、OKHttp 核心原理 1. 责任链模式&#xff08;Interceptor Chain&#xff09; 2. 连接池&#xff08;ConnectionPool&#xff09; 3. 请求调度…

【前端】BOM DOM

两天更新完毕&#xff0c;建议关注收藏点赞 友情链接&#xff1a; HTML&CSS&LESS&Bootstrap&Emmet Axios & AJAX & Fetch BOM DOM 待整理 js2 Web API 是浏览器提供的一套操作浏览器功能和页面元素的 API ( BOM 和 DOM)。官方文档点击跳转 目录 BOMDOM…

产品需求分析-概览

产品需求分析-概览 产品需求分析(上)-理论流程 需求产生(来源) 公司内部(老板、其他部门同事)产品经理自己(策划、挖掘)外部(用户、客户、伙伴) 需求分类 功能类数据类运营类体验类设计类 需求决策 战略定位产品定位用户需求 需求分位&#xff1a;四象限定位法 重要又…

小程序事件系统 —— 32 事件系统 - 事件分类以及阻止事件冒泡

在微信小程序中&#xff0c;事件分为 冒泡事件 和 非冒泡事件 &#xff1a; 冒泡事件&#xff1a;当一个组件的事件被触发后&#xff0c;该事件会向父节点传递&#xff1b;&#xff08;如果父节点中也绑定了一个事件&#xff0c;父节点事件也会被触发&#xff0c;也就是说子组…

spring6概述

spring6 1、概述 1.1、Spring是什么&#xff1f;1.2、Spring 的狭义和广义1.3、Spring Framework特点1.4、Spring模块组成1.5、Spring6特点 1.5.1、版本要求 2.2、构建模块2.3、程序开发 2.3.1、引入依赖2.3.3、创建配置文件2.3.4、创建测试类测试2.3.5、运行测试程序 2.4、程序…

【Linux docker】关于docker启动出错的解决方法。

无论遇到什么docker启动不了的问题 就是 查看docker状态sytemctl status docker查看docker日志sudo journalctl -u docker.service查看docker三个配置文件&#xff08;可能是配置的时候格式错误&#xff09;&#xff1a;/etc/docker/daemon.json&#xff08;如果存在&#xf…

CTF网络安全题库 CTF网络安全大赛答案

此题解仅为部分题解&#xff0c;包括&#xff1a; 【RE】&#xff1a;①Reverse_Checkin ②SimplePE ③EzGame 【Web】①f12 ②ezrunner 【Crypto】①MD5 ②password ③看我回旋踢 ④摩丝 【Misc】①爆爆爆爆 ②凯撒大帝的三个秘密 ③你才是职业选手 一、 Re ① Reverse Chec…

1.1 双指针专题:移动零(easy)

一、题目链接 283. 移动零 二、题目描述 给定⼀个数组 nums &#xff0c;编写⼀个函数将所有 0 移动到数组的末尾&#xff0c;同时保持⾮零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进⾏操作。 ⽰例 1: 输⼊: nums [0,1,0,3,12] 输出: […

STM32如何精准控制步进电机?

在工业自动化、机器人控制等场合&#xff0c;步进电机以其高精度、开环控制的特性得到了广泛应用。而在嵌入式系统中&#xff0c;使用STM32进行步进电机的精确控制&#xff0c;已成为开发者的首选方案之一。 本文将从嵌入式开发者的角度&#xff0c;深入探讨如何基于STM32 MCU…

Android Studio右上角Gradle 的Task展示不全

Android Studio 版本如下&#xff1a;Android Studio lguana|2023.21, 发现Gradle 的Tasks阉割严重&#xff0c;如下图&#xff0c;只显示一个other 解决方法如下&#xff1a;**Setting>Experimental>勾选Configure all gradle tasks during Gradle Sync(this can make…

华为hcia——Datacom实验指南——三层交换和ARP的工作原理

什么是三层交换 三层交换是指连接在同一台三层交换机上&#xff0c;不同vlan用户&#xff0c;不同网段ip&#xff0c;通过vlanif接口进行数据交换。 什么是ARP协议 通过网络层的ip地址解析成数据链路层的mac地址。 说白了就是通过目标ip地址去问他对应的mac地址是多少。 A…

【互联网性能指标】QPS/TPS/PV/UV/IP/GMV/DAU/MAU/RPS

&#x1f4d5;我是廖志伟&#xff0c;一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》&#xff08;基础篇&#xff09;、&#xff08;进阶篇&#xff09;、&#xff08;架构篇&#xff09;清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、…

Spring(七)AOP-代理模式

目录 代理模式 一 静态代理 一、核心作用 二、使用场景 二 动态代理 一、核心作用 二、使用场景 具体实现&#xff1a;&#xff08;初始&#xff09; 具体实现&#xff1a;&#xff08;改进&#xff09; 一、核心业务逻辑 1. 接口 MathCalculator 2. 实现类 MathCa…

AI革命编程学习:Python语法速通与高阶突破全实战(第二部分:AI辅助调试与高阶编程)

只要编程&#xff0c;代码错误和有问题肯定是难免&#xff0c;更何况还是全AI生成代码&#xff0c;是否符合我们的要求与预期&#xff0c;以及代码是否有逻辑错误&#xff0c;是否有代码错误。下面我们继续这一部分&#xff0c;代码调试、代码修复等基本过程。 一、代码调试 …

脚本学习(1)验证目录自动化生成脚本

1、脚本介绍 旨在一键创建符合IC验证规范的目录结构&#xff0c;避免手动创建目录和文件的重复劳动。 优点&#xff1a;模块级验证目录可一键创建&#xff0c;代码简单易懂&#xff0c;可复用性高。 缺点&#xff1a;子系统或系统级不适用。 2、生成的目录结构 /home/user…