Python爬虫获取VIP电影资源,体验白嫖的快乐

前言

网页上的视频看一半就经常容易"卡顿"(或无法观看[偷笑]),看完这篇文章就不用再为影视资源或播放卡顿而烦恼啦~

运行环境

Python版本:3.11.3 Python下载(官网)

ffmpeg环境(用于最后视频的合并) ffmpeg下载(官网)

[!IMPORTANT]

这里注意将下载好的Pythonffmpeg配置在环境变量中!

相关模块:

requests(需要手动安装)
threading
m3u8(需手动安装)

安装模块命令:

pip install requests
pip install m3u8

效果展示

在这里插入图片描述

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

在这里插入图片描述

逻辑分析

一般来说Web端网站播放的较长视频都是采取m3u8格式的多个ts文件的拼接,这样可以大大减少网页加载的时间,我们的任务就是获取到它播放的m3u8文件。


来到网站,通过开发者工具抓包可以发现播放的就是这个m3u8文件
在这里插入图片描述

随便粘贴一个到浏览器查看,可以看到直接将ts文件下载到本地了。确保它没有加密,咱们还是打开看一眼~
在这里插入图片描述
在这里插入图片描述
OK能正常打开,下面就开始下载m3u8文件中的ts视频片段。

由于我们一般看的影视都是电视剧,电影这些时间比较长的媒体资源,因此单线程下载是非常慢的(但也不是不行,无非就是慢慢等嘛。。。),这里我们采取多线程的方式进行爬取。

代码展示

"""
-*- coding: utf-8 -*-
@File   : .py
@author : @鲨鱼爱兜兜
@Time   : 2024/07/18 17:28
"""

import threading
import m3u8
import requests


def thread_task():
    while True:
        if video_list:
            print(video_list)
            headers1 = {
                'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
                'accept-language': 'zh-CN,zh;q=0.9',
                'cache-control': 'no-cache',
                'pragma': 'no-cache',
                'priority': 'u=0, i',
                'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
                'sec-ch-ua-arch': '"x86"',
                'sec-ch-ua-bitness': '"64"',
                'sec-ch-ua-full-version': '"126.0.6478.127"',
                'sec-ch-ua-full-version-list': '"Not/A)Brand";v="8.0.0.0", "Chromium";v="126.0.6478.127", "Google Chrome";v="126.0.6478.127"',
                'sec-ch-ua-mobile': '?0',
                'sec-ch-ua-model': '""',
                'sec-ch-ua-platform': '"Windows"',
                'sec-ch-ua-platform-version': '"15.0.0"',
                'sec-fetch-dest': 'document',
                'sec-fetch-mode': 'navigate',
                'sec-fetch-site': 'same-origin',
                'sec-fetch-user': '?1',
                'upgrade-insecure-requests': '1',
                'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
            }
            url = video_list.pop()
            while True:
                try:
                    print(url)
                    response1 = requests.get(url=url, headers=headers1)
                    content = response1.content
                    # 这里替换成自己想要下载的位置
                    with open(rf'C:\Users\sharkdd\Desktop\Shark MV\{shark_dict[url]}.ts', 'wb') as f1:
                        f1.write(content)
                    break
                except Exception as e:
                    print(1, e)
                    continue
        else:
            break


cookies = {
    'googtrans': '/zh-CN/zh-CN',
    'dn_config': 'isDark=1&region=GL.',
    '_ga': 'GA1.1.1964850234.1706854180',
    '_ga_JEW7TS0WWF': 'GS1.1.1708056951.14.1.1708056955.0.0.0',
    'cf_clearance': 'AbQIAlJ9qDRhrCLVv9q2fSpIQGCx6fHXNZQ7TyAAdEI-1720333396-1.0.1.1-6B6JfQY4Q4UTNkheBspk6LH2m0BvYBYIUHHlM9I29GsUOqRdyqukS6P8C4SvSk15wsI_67zViBYS5yhL60nCGQ',
}
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'zh-CN,zh;q=0.9',
    'cache-control': 'no-cache',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
    'sec-ch-ua-arch': '"x86"',
    'sec-ch-ua-bitness': '"64"',
    'sec-ch-ua-full-version': '"126.0.6478.127"',
    'sec-ch-ua-full-version-list': '"Not/A)Brand";v="8.0.0.0", "Chromium";v="126.0.6478.127", "Google Chrome";v="126.0.6478.127"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-model': '""',
    'sec-ch-ua-platform': '"Windows"',
    'sec-ch-ua-platform-version': '"15.0.0"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
}
response = requests.get('https://global.tfbgbbb.com/s8/ppot/_definst_/mp4:s8/ivod/lxj-drwwnn-37-03A0EE52F.mp4/chunklist.m3u8?vendtime=253402297200&vhash=r3cb9iMilHC0ZOGj44q3kaZdf9_ZpPA1w0YGIqdKghg=&vCustomParameter=0_0.0.0.0.GL&lb=deac0c99c785cb428d463b2f95d9e53a&pub=25&vv=1&proxy=PsnlOc5iBdHcOcTYOc8kOsyslZEsDx4mjXSwCp4piR6nbp6tjhupjZUnCBONEZCnCx8oCXSnjxQz6TiRs9XR2vqPc9dPMLbBcDlRNndR6ynCBONEZCnDxomiB2NCRUs1', headers=headers, cookies=cookies)
response.encoding = 'uft-8'
obj = m3u8.loads(response.text)
video_dict1 = {}
video_list = []
for i in range(len(obj.segments.uri)):
    video_dict1[obj.segments.uri[i]] = i
    video_list.append(obj.segments.uri[i])
shark_dict = {_: cnt for cnt, _ in enumerate(video_list)}
print(shark_dict)
threads = []
for _ in range(20):
    thread = threading.Thread(target=thread_task)
    threads.append(thread)

for thread in threads:
    thread.start()

for thread in threads:
    thread.join()

# 这里替换成自己想要下载的位置
with open(r'C:\Users\sharkdd\Desktop\Shark MV\file.txt', 'w', encoding='utf-8') as f1:
    for _ in range(len(list(shark_dict.keys()))):
        f1.write(f'file \'{_}.ts\'\n')

print("所有视频下载完成")

这里我开启了20个线程同时进行爬取任务,可以看到很快就将ts文件全部下载到了本地
在这里插入图片描述

上面代码中,大家不难发现我在多线程任务结束后,多生成了一个txt文件(用于ffmpeg合并视频)
在这里插入图片描述
接下来使用ffmpeg命令对多个视频片段进行合并(这里错误的应该是最前面说的环境变量没有配好)

ffmpeg -f concat -i file.txt -c copy output.mp4

在这里插入图片描述
最终会导出一个mp4后缀的文件,这个文件也就是完整的影片了。
在这里插入图片描述

双击播放检验一下是否能观看(这里我使用的是VLC播放器,下载地址放在文末。)
在这里插入图片描述

OK啦,这样就能离线不卡顿观看了。

补充知识点

  • 对于比较普通的m3u8(未经过特殊处理的,未经过AES或其他加密的)可以直接通过VLC播放器直接捕捉网络串流,直接在线播放。(VLC播放器下载地址
  • 文中出现的图片Shark MV使用pyside6第三方库进行搭建个性化MV播放器,同时自动连接了VLC播放器,解析完成后自动播放,播放完成自动删除,保证不占用系统内存,代码太长这里就不贴出来了,有兴趣的可以私信我哦。

[!NOTE]

声明:文章中影视资源全部来自互联网,本文仅供学习交流,任何人或组织不得用于商用目的。由此产生的任何纠纷责任由使用者本人承担!

在这里插入图片描述
@鲨鱼爱兜兜

  • 37
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值