Python +Pyqt5 简单视频爬取学习(一)

news/2024/11/17 0:00:51 标签: python, 学习, 开发语言, 网络爬虫

文章目录

前言

一、演示

二、查找网页视频流的索引文件

三、分析视频流的url和视频流索引文件的差异性

四、判断视频数据是否需要转化为ts

五、判断视频是否被加密,如若被加密,需要先解密

六、合并所有的ts视频,以MP4模式输出完整视频

总结


前言

目的:将网站上的m3u8视频下载到本地-----仅娱乐使用;

流程:

  1. 通过网页调试模式,获取网页视频流的索引文件;
  2. 分析视频流的url和视频流索引文件的差异性;
  3. 通过视频流的url,下载视频数据至本地;
  4. 判断视频数据是否需要转化为ts;
  5. 判断视频是否被加密,如若被加密,需要先解密;
  6. 合并所有的ts视频,以MP4模式输出完整视频;

一、演示


二、查找网页视频流的索引文件

F12调试模式后,找到该文件,双击后,可直接下载视频索引文件,其中存在视频片段的部分url或者完整url;

User-Agent 用户代理查询

代码实现如下:

python"># 视频索引文件下载网址
m3u8_url = "https://v.gsuus.com/play/PdyY7qzd/index.m3u8"
# User-Agent 即用户代理,在网站中可以查询
hea = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0"
user_agent_list = [
                # 在这里可以写多个headers,然后随机选一个进行访问,这样可以防止频繁访问ip被封
                hea,
            ]
headers = {
    'user-agent': random.choice(user_agent_list),
    'Connection': 'close',
}

resp = requests.get(m3u8_url, headers, verify=False)
data = resp.text
print(data)

三、分析视频流的url和视频流索引文件的差异性

通过分析视频流的地址,来下载所有的片段视频

代码实现如下:

python"># 视频文件下载网址
url_dow = "https://gs.gszyi.com:999/hls/499/20241002/2923112/plist0.ts"

# User-Agent 即用户代理,在网站中可以查询
hea = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 Edg/130.0.0.0"
user_agent_list = [
                # 在这里可以写多个headers,然后随机选一个进行访问,这样可以防止频繁访问ip被封
                hea,
            ]
headers = {
    'user-agent': random.choice(user_agent_list),
    'Connection': 'close',
}

# url_dow:下载ts视频文件的url
# headers:自定义 HTTP 请求头
# timeout:请求超时时间设置
res = requests.get(url_dow, headers,timeout=20)

save_path = "000.ts"
# 判断页面是否正确
if res.status_code == 200:
    data = res.content
    # 以二进制模式打开文件,写入二进制数据
    with open(save_path, 'wb+') as f:
        f.write(data)
        f.flush()
    print("视频{}下载完毕!!!".format(save_path))

四、判断视频数据是否需要转化为ts

视频为ts格式,则不需要进行转化,如若是其他格式,比如jpeg,jpg格式则需要转化为ts格式,即是重命名文件名称(用该功能函数即可实现 os.rename() )。


五、判断视频是否被加密,如若被加密,需要先解密

如若显示该key网址url,则表示视频被加密,一般所有视频都只有一个key,但也有例外,有些视频每个片段都会进行加密,目前还在研究如何解决,不过也够用了,嘿嘿。

前面下载的视频打开便会显示错误,则就是说明视频需要解密。(注意:某些情况下,可能解密后视频依然无法正常打开,造成原因可能是解密方法不对或者下载视频数据异常。)

代码实现如下:

python">from Crypto.Cipher import AES

# 解密ts视频
def jiemi(src,dec,key):
    # src:要解密的文件; dec:解密后的文件;  key、iv 从m3u8可见
        try:
            # 以二进制格式打开已下载的ts文件
            with open(src, 'rb') as f1:
                # 读取文件数据
                part = f1.read()  

            # key密钥的长度等于IV的向量长度
            if len(key) == 16: 
                IV=b'0000000000000000'
            elif len(key) == 32:     
                IV=b'00000000000000000000000000000000'

            # 解密数据
            cipher = AES.new(key, AES.MODE_CBC,IV) 
            plain_data = cipher.decrypt(part)

            if part:
                # 创建新文件
                with open(dec, 'wb') as f2:
                    # 将解密后的数据写入到创建的新文件中
                    f2.write(plain_data)  
                print("解密成功!") 
        except Exception as error:
            print(src)
            print("错误异常:%s" % error )
            print("原始异常信息:{}".format(traceback.format_exc())) # 返回异常信息
       
 # src:要解密的文件; dec:解密后的文件;  key、iv 从m3u8可见

 src = "000.ts"
 dec = "111.ts"
 # key文件中读取
 key = "qG6ikBmMJpJGNulz"
 # 需要将key和iv转换为字节形式的数据
 key = bytes(key, encoding='utf-8')
    
 jiemi(src,dec,key)

实例演示:


六、合并所有的ts视频,以MP4模式输出完整视频

前置条件:

1、需要配置ffmpeg 的运行环境【可以自行下载,或者我的资源中也有安装包】;

2、下载ffmpeg 完成后,配置环境变量即可。

使用该命令合并视频:

#file_names_file:表示所有ts文件的路径

#output.mp4 输出视频名称

os.system(f'ffmpeg -f concat -safe 0 -i {file_names_file} -c copy output.mp4')

所以,合并视频之前,我们需要将file_names_file文件创造出来,否则执行合并命令会失败;

如下图所示(这里就不写代码实现了,思路就是将存放视频流的文件目录列出来,然后判断是否为视频文件,并将对应的路径写入到txt文件内即可。);

然后,我们有了这个file_names_file文件后,便可直接运行合并命令(视频流必须完整,视频流必须与文件内的视频路径对应,否则会执行失败);

代码实现如下:

python">import threading
def getvideo():
    # 3.2 大量 ts 文件
    file_names_file = 'video.txt'
    os.system(f'ffmpeg -f concat -safe 0 -i {file_names_file} -c copy output.mp4')
    # os.remove(file_names_file)


t = threading.Thread(target=getvideo)
t.start()
t.join()
print("视频合并结束!")

总结

至此,整个流程完结,可以下载到我们需要的视频了,说实话,比在网站上看要快不少,还是比较有趣的。

并且,请求频繁会导致资源请求失败,这个也要考虑,我用的是多线程,速度很快,所以加入了获取资源失败时会重新获取资源,至少不会漏掉视频资源。

网页请求失败的话,则是表示网站拒绝你的访问,这个问题还待解决,不解决也足够使用了,反正自己使用即可。

后续完善整个工具,目前只实现单个视频下载,后续完成多个视频下载....


http://www.niftyadmin.cn/n/5754742.html

相关文章

爬虫——Requests库的使用

在爬虫开发中,HTTP请求是与服务器进行交互的关键操作。通过发送HTTP请求,爬虫可以获取目标网页或接口的数据,而有效地处理请求和响应是爬虫能够高效且稳定运行的基础。Requests库作为Python中最常用的HTTP请求库,因其简洁、易用和…

【TryHackMe】 Backtrack靶机

now look this!还没更新完,有空就会更新! 目录 端口目录扫描 CVE-2023-39141 我们用openvpn链接,然后进行练习。 端口目录扫描 先扫描一下主机端口,这是我们进攻的入口。 ┌──(root㉿kali)-[~] └─# nmap 10.1…

Web性能优化:从基础到高级

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 Web性能优化:从基础到高级 Web性能优化:从基础到高级 Web性能优化:从基础到高级 引言 基础优…

【星海随笔】ZooKeeper-Mesos

开源的由 Twitter 与 伯克利分校的 Mesos 项目组共同研发设计。 两极调度架构 支持高可用集群,通过ZooKeeper进行选举。 Mesos master 管理着所有的 Mesos slave 守护进程 每个slave运行具体的任务或者服务。 Franework 包括的调度器和执行机两部分 执行器运行在Me…

集群搭建高可用

contos7.9 部署3节点 hadoop3.4 高可用集群 contos7.9 部署3节点 hadoop3.4 高可用集群环境信息Hadoop与Zookeeper的版本对应关系服务器角色分配使用端口服务器配置配置免密登录服务器配置初始化 init_server.sh配置主机名映射所有节点配置 hosts文件 hadoop 安装环境配置下载安…

redis7.x源码分析:(2) adlist双向链表

链表是一种常用的数据结构(如果不了解,请先学习数据结构),由于c语言本身没有实现标准的链表库,所以redis自己实现了一个双向链表。 双向链表在redis内部的使用非常的多,几乎所有模块中都有用到。 下面看下它…

Win10下使用Anaconda安装GPU版本PyTorch

PyTorch是一个开源机器学习框架,最初来自Meta Ai。如果你想研究人工智能或从事人工智能项目方面的工作,那么在本地机器上使用PyTorch设置开发环境对于许多项目来说都是必不可少的。GPU(图形处理单元)是一种专用处理器,…

关于adb shell登录开发板后terminal显示不完整

现象 今天有个同事跟我说,adb shell 登录开发板后,终端显示不完整,超出边界后就会出现奇怪的问题,比如字符覆盖显示等。如下图所示。 正常情况下应该如下图所示: 很明显,第一张图的显示区域只有完整区域…