保姆级教程:详细记录使用Python来爬取某网站的ts电影资源

使用爬虫爬取某电影分享网站最新电影链接 -- 基于Python Requests库 前提: 我弟在搞微信群营销,使用了一个第三方微信机器人软件来群发“最新电影链接”,看着别人群里分享的各种短域名,自己却没有资源,于是来求助我,虽然对爬虫有点了解,但是从来没亲自做过爬虫,只能硬着头皮上了,于是就有了下面这个全过程。 准备工作: 先是理解一下他的需求,就是想要一个最新电影的链接,然后还要可以根据群成员的提问,比如有成员发送“爱情公寓”,那么就要通过机器人返回给“爱情公寓... 阅读详情

首先找到我们需要蹂躏的网站

"http://www.wbdy.tv/play/29398_1_1.html"

在源代码中找到想要的播放内容

 

私信小编01即可获取大量python学习资源

打开这个在源代码里面的网站

http://www.wbdy.tv/js/player/?url=https://video.buycar5.cn/20200810/3UbmZCEa/index.m3u8&id=29398&num=1&count=48&vt=1


查看发送的请求,看到有两个index,这个网站很有意思,从第一个连接给你一个m3u8,然后再从第一个m3u8里面给你第二个m3u8,这个后面说
我们先请求第一个index的url,获得m3u8响应文件,并下载下来,再读取第二个m3u8的文件,这样子全部的m3u8文件都获取到了,然后下载

获取到第一个m3u8的内容如下:


/20200810/3UbmZCEa/2000kb/hls/index.m3u8
然后我们再看第二个m3u8的header:Request URL:
https://video.buycar5.cn/20200810/3UbmZCEa/2000kb/hls/index.m3u8

怎么样 是不是很像,我们直接域名拼接过去,访问,看看resp是什么
resp是一长串ts文件内容,我们请求这个网站,并下载这些文件

写入文件之后,我们请求文件里面的ts连接地址,下载到本地为ts文件
下载完成之后,我们发现这些ts文件是打不开的,是加密过的,我们需要解密
我们可以看见第二个index 和 key.key 都指向key.key,ok 我们直接怼着key去

发送个请求,得到key的值是3c6ed8fbae9cdcbb
然后我们进行AES

(#EXT-X-KEY:METHOD=AES-128,URI="
https://ts1.yuyuangewh.com:9999/20200810/3UbmZCEa/2000kb/hls/key.key")AES解密(链接里面有提示)

然后解密,解密之后再合并ts,即可。下面看代码
想运行代码的话自己在目录下先建好文件夹“video”

import asyncio
 
import requests
from bs4 import BeautifulSoup
import re
import asyncio
import aiohttp
import aiofiles
from Crypto.Cipher import AES  # pycryptodome
import os
 
 
def get_iframe_url(url):
    resp = requests.get(url)
    main_page = BeautifulSoup(resp.text, "html.parser")
    src = main_page.find("iframe").get("src")
    # 拼接src 获得真真正正的ts播放路径
    '''
     真真正正的路径是 http://www.wbdy.tv/js/player/?url=https://video.buycar5.cn/20200901/e4NhpyM5/index.m3u8&id=29911&num=1&count=22&vt=1
     得到的路径是                      /js/player/?url=https://video.buycar5.cn/20200901/e4NhpyM5/index.m3u8&id=29911&num=1&count=22&vt=1src = "http://"+url.split("//")[1].split("/play")[0] + src
     '''
    src = url.split("/play/")[0] +src
    return src
 
def get_first_m3u8_url(play_url):
 
    resp = requests.get(play_url)
    # print(resp.text)
 
    obj = re.compile(r'url: "(?P<url>.*?)",', re.S)
    m3u8_url = obj.search(resp.text).group("url")
    # print(m3u8_url)
    # output  https://video.buycar5.cn/20200810/3UbmZCEa/index.m3u8
    # need    https://video.buycar5.cn/20200810/3UbmZCEa/index.m3u8
    return m3u8_url
 
 
def down_load_m3u8(url, name):
    # print(url)
    resp = requests.get(url)
    with open(name, mode="wb")as f:
        f.write(resp.content)
 
 
async def download_ts(url, name, session):
    async with session.get(url) as resp:
        async with aiofiles.open(f"video/{name}", mode="wb") as f:
            await f.write(await resp.content.read())  # 把下载到的内容写入到文件中
    print(f"{name}下载完毕")
 
 
 
async def aio_download():  # https://boba.52kuyun.com/20170906/Moh2l9zV/hls/
    tasks = []
    async with aiohttp.ClientSession() as session:  # 提前准备好session
        async with aiofiles.open("second.txt", mode="r", encoding='utf-8') as f:
            async for line in f:
                if line.startswith("#"):
                    continue
                line = line.strip()
                name = line.split("/hls/")[1]
                # print(name)
                # print(line)
                task = asyncio.create_task(download_ts(line, name, session))  # 创建任务
                tasks.append(task)
 
            await asyncio.wait(tasks)  # 等待任务结束
 
 
def get_key(url):
    # print(url)
    resp = requests.get(url)
    # print("resp,",resp.text)
    return(resp.content)
 
 
async def dec_ts(name, key):
    name = name.split("/hls/")[1]
    aes = AES.new(key=key, IV=b"0000000000000000", mode=AES.MODE_CBC)
    async with aiofiles.open(f"video/{name}", mode="rb", ) as f1, \
            aiofiles.open(f"video/temp_{name}", mode="wb", ) as f2:
        bs = await f1.read()  # 从源文件读取内容
        # print(bs)
 
        await f2.write(aes.decrypt(bs))  # 把解密好的内容写入文件
    print(f"{name}处理完毕")
 
async def aio_dec(key):
    # 解密
    tasks = []
    async with aiofiles.open("second.txt", mode="r", encoding="utf-8") as f:
        async for line in f:
            if line.startswith("#"):
                continue
            line = line.strip()
            # 开始创建异步任务
            task = asyncio.create_task(dec_ts(line, key))
            tasks.append(task)
        await asyncio.wait(tasks)
             
 
 
def merge_ts():
    list = []
    with open("second.txt", mode="r", encoding="utf-8") as f:
        for line in f:
            if line.startswith("#"):
                continue
            line = line.strip().split("/hls/")[1]
            # video/temp_{name}
            # print(line)
            list.append(f"video/temp_{line}")
 
    s = "+".join(list)
    # adb = "D:"
    # os.system(adb)
 
    # print(os.system("di"))
    os.chdir(r'进到文件所在地址')
    os.system(f"copy /b *.ts xxx.mp4")
    print("完事")
 
def main(url):
    # 1. 拿到主页源代码 去iframe 找到对应的播放url
    # Warning------> 记得在函数里面return出去,光输出是没有用的
    play_url = get_iframe_url(url)
    # print(play_url)
    # 2. 拿到第一层的ts下载路径
 
 
    first_m3u8_utl = get_first_m3u8_url(play_url)
    # need                            /20200810/3UbmZCEa/2000kb/hls/index.m3u8
    # output https://video.buycar5.cn/20200810/3UbmZCEa/index.m3u8
    # print(first_m3u8_utl)
 
 
 
    # 3.1 下载第一层的m3u8文件
    down_load_m3u8(first_m3u8_utl, "first.txt")
 
    # 3.2 下载第二层的 m3u8文件
 
    with open("first.txt", mode="r", encoding="utf-8") as f:
        for line in f:
            if line.startswith("#"):
                continue
            else:
                line = line.strip().split("?skipl=1")[0]
                #                                      /20200901/e4NhpyM5/1000kb/hls/index.m3u8
                # Request URL: https://video.buycar5.cn/20200901/e4NhpyM5/1000kb/hls/index.m3u8
                #              https://video.buycar5.cn/20200901/e4NhpyM5/index.m3u8
                #              https://ts1.yuyuangewh.com:9999/20200901/e4NhpyM5/1000kb/hls/ZlPMyMi0.ts
                # print(first_m3u8_utl)
                # print(line)
 
                second_m3u8_url = first_m3u8_utl.split("/20200810/")[0] + line
                # print(second_m3u8_url)
                # output https://video.buycar5.cn/20200810/3UbmZCEa/index.m3u8/20200810/3UbmZCEa/2000kb/hls/index.m3u8
                #        https://video.buycar5.cn/20200810/3UbmZCEa/2000kb/hls/index.m3u8
                # need   https://video.buycar5.cn/20200810/3UbmZCEa/2000kb/hls/index.m3u8
                # line                           /20200810/3UbmZCEa/2000kb/hls/index.m3u8
 
 
                down_load_m3u8(second_m3u8_url, "second.txt")
                # print("m3u8文件下载完毕")
 
 
    # 4. 下载视频
 
 
    # 下载txt里面的视频即可
    # 异步协程
    asyncio.run((aio_download()))
 
    # 解密
    # 5.1 拿到秘钥
    # need https://ts1.yuyuangewh.com:9999/20200810/3UbmZCEa/2000kb/hls/key.key
    # file https://ts1.yuyuangewh.com:9999/20200810/3UbmZCEa/2000kb/hls/key.key
    key_url = ""
    with open("second.txt", mode="r", encoding="utf-8") as f:
         for line in f:
            if line.startswith("#EXT-X-KEY"):
                line = line.split('AES-128,URI="')[1].replace('"', "")
                # print(line)
                key_url = line
 
 
 
    # print(key_url)
    key = get_key(key_url)
 
    # 5.2 解密
    asyncio.run(aio_dec(key))
 
    # 6.合并
    merge_ts()
 
 
 
 
if __name__ == '__main__':
    url = "http://www.wbdy.tv/play/29398_1_1.html"
    main(url)

在新标签打开所有链接复制所有链接URL复制所有链接URL(反向)复制所有链接标题 + URL复制所有链接标题 + URL (MD)复制所有链接标题 + URL (BBS)复制所有链接标题 + URL (筛选)复制所有链接标题 + URL (设置复制格式)在新标签页打开所有图片链接在一个标签页显示所有图片链接
复选框 - 选中
复选框 - 取消
复选框 - 反选
单选框 - 选中
单选框 - 取消
特殊单选框 - 选中

Python爬虫获取VIP电影资源,体验白嫖的快乐 网页上的视频看一半就经常容易"卡顿"(或无法观看[偷笑]),看完这篇文章就不用再为影视资源或播放卡顿而烦恼啦~ 阅读详情

相关推荐

TS视频下载V1.1

TS视频流下载,TS转MP4,TS视频流合并工具。 TS的全称则是Transport Stream,即传输流,DVD节目中的MPEG2格式,是MPEG2-PS,MPEG2-TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码的

ts视频下载

前提:找到视频的m3u8文件地址 package com.main; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.Inpu...

一只小怪的笔记 1万+

高清ts文件

TS码流测试文件。ts文件为传输流文件,视频编码主要格式h264/mpeg4,音频为acc/MP3。 ts文件分为三层:ts层Transport Stream、pes层 Packet ElementalStream、es层 Elementary Stream. es层就是音视频数据,pes层是在音视频数据上加了时间戳等对数据帧的说明信息,ts层就是在pes层加入数据流的识别和传输必须的信息

【免费下载】 TS俱乐部资源文件下载:一站式获取技术盛宴

TS俱乐部资源文件下载:一站式获取技术盛宴 【下载地址】TS俱乐部资源文件下载 TS俱乐部资源文件下载 项目地址: https://gitcode.com/open-source-toolkit/a661c ...

gitblog_09781的博客 4391

TS视频下载

TS视频流下载,TS转MP4,TS视频流合并工具。 TS的全称则是Transport Stream,即传输流,DVD节目中的MPEG2格式,是MPEG2-PS,MPEG2-TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码的

TS流网页视频播放

TS流网页视频播放器,一个可以支持windows 网页端播放ts流的demo。

Python爬取视频之爱情电影及解密TS文件和两种合并ts的方法

俗话说,兴趣所在,方能大展拳脚。so结合兴趣的学习才能事半功倍,更加努力专心,apparently本次任务是在视频网站爬取国产爱情动作片,地址不放(狗头保命)只记录过程。 环境 &依赖 Win10 64bit IDE:Pycharm Python 3.8 Python-site-package:requests +BeautifulSoup + lxml + m3u8 + AES 在PyCharm中创建一个项目会创建一个临时目录存放环境和所需要的package包,所以要在PyCharm..

KeithPro的博客 2万+

ts-transform-paths:根据tsconfig路径加载节点模块

ts-transform-paths 使用它来加载其位置在tsconfig.json的path部分中指定的模块。 安装 yarn add ts-transform-paths -D 要求 打字稿> = 2.4.1 如何使用 不幸的是,TypeScript本身目前还没有提供使用自定义转换器的任何简便方法(请参阅 )。 以下是自定义转换器的示例用法。 tsconfig.json { " compilerOptions " : { " paths " : { " @schema " : [ " ./src/schema " ], " @modules/* " : [ " ./src/modules/* " ] } } } webpack(使用ts-loader或awesome-typescript-loader) // webpack.con

python学习之爬取ts流电影

还没有想好写啥

wmx的博客 3585

ts格式视频

ts格式视频,视频市场21秒,当时用来做高级网络PJ rtp视频传输用的

ts合并工具.rar

合并m3u8视频分段的小工具

使用爬虫爬取热门电影

既然要把视频切成非常多个小碎片. 那就需要有个文件来记录这些小碎片的路径. 该文件一般为M3U文件. M3U文件中的内容经过UTF-8的编码后, 就是M3U8文件. 今天, 我们看到的各大视频网站平台使用的几乎都是M3U8文件.更好的方案是对视频进行切片(ts),切完了以后每个切片都有一个独立的url,当我们把所有的切片都获取到以后,再把切片文件的正确顺序进行保存,然后合并就可以得到一个完整的视频。里面最重要的就是每一个ts文件的路径了,而且这个ts文件是没有加密的。现在的视频网站用的几乎都是这种方案。

鬼手的博客 6029

Artplayer 视频播放器全开源PHP源码 带弹幕库源码(播放器源代码)

Artplayer播放器全开源源码(播放器源代码),支持限制ip每分钟访问次数,两种返回模式,支持网页播放模式,支持输出json数据模式,返回json数据模式支持限制ip每分钟访问次数+UA限制+key密钥。 搭建说明: 1.推荐使用php8以上 速度更快 2.此播放器不支持直链必须有json接口 3.支不支持解析全看你的json接口支不支持 4.如果只想播放.m3u8.mp4.ts.mpd 资源 请填入目录下json.php 例如:域名/json.php?url= config.php自行修改 每个后面都有备注。 artplayer/js/setting.js文件可在jsjiami.com加密防止被转换成json盗用 加密后记得查看下ctrl+f你修改的密钥能不能搜索到,如果能搜到重新加密。 苹果cms自动下一集播放器JS代码自行在苹果CMS后台配置 或者你的苹果cms目录/static/player/parse.js

Python爬虫实战之电影爬取过程

俗话说,兴趣所在,方能大展拳脚。so结合兴趣的学习才能事半功倍,更加努力专心,apparently本次任务是在视频网站爬取一些好看的小电影,地址不放(狗头保命)只记录过程。 实现功能: 从网站上爬取采用m3u8分段方式的视频文件,对加密的 "ts"文件解密,实现两种方式合并"ts"文件,为防止IP被封,使用代理,最后删除临时文件。 环境 &依赖 Win10 64bit IDE:Pycharm Python 3.8 Python-site-package:requests +

Python免费教程 1万+

OpenEuler22.03 LTS下Zabbix7.0监控系统的容器化部署避坑指南(含Docker-Compose完整配置)

本文详细介绍了在OpenEuler22.03 LTS操作系统上容器化部署Zabbix7.0监控系统的完整流程,包括Docker引擎配置、Docker-Compose编排、网络模式选择及性能调优等关键步骤。针对OpenEuler环境下的特殊问题提供了解决方案,帮助用户高效搭建稳定可靠的监控系统。

python9snake的博客 268

OpenFOAM算例文件结构深度解析:以cavity案例为例教你读懂每个文件夹的作用

本文以OpenFOAM经典cavity案例为例,深度解析CFD算例文件结构。详细阐述了0、constant、system三个核心目录的作用:0存放初始与边界条件,constant定义物理属性和网格,system控制求解策略。通过剖析关键文件,帮助用户理解每个参数的意义,掌握从读懂到定制算例的能力,为高效使用这一开源CFD工具奠定坚实基础。

beer8的博客 238

Python爬取视频之爱情电影及解密TS文件和两种合并ts!

俗话说,兴趣所在,方能大展拳脚。so结合兴趣的学习才能事半功倍,更加努力专心,apparently本次任务是在视频网站爬取一些好看的小电影,地址不放(狗头保命)只记录过程。 实现功能: 从网站上爬取采用m3u8分段方式的视频文件,对加密的"ts"文件解密,实现两种方式合并"ts"文件,为防止IP被封,使用代理,最后删除临时文件。 环境 &依赖 Win10 64bit IDE:Pycharm Python 3.8 Python-site-package:requests +Be...

爬遍所有网站 3707

想在瑞芯微RK3588上跑视频分类模型?避开3D卷积这个坑,试试这几种NPU友好的方案

本文探讨了在瑞芯微RK3588上部署视频分类模型时如何避开3D卷积的性能陷阱,提供了三种NPU友好的替代方案:MobileNetV2+GRU组合、Temporal Shift Module(TSM)和帧级池化。这些方案在保持较高准确率的同时,充分利用RKNPU的硬件加速能力,显著提升推理效率。文章还分享了从模型转换到部署优化的完整流程和实战经验。

weixin_28724319的博客 418

爬取指定网站的电影,默认url已获得。代码经测试可用

python爬取电影 测试可用爬取指定网站的电影,默认url已获得 爬取指定网站的电影,默认url已获得 你网站是以 .ts 流的形式,顺序增加的。 import requests def temp(i): ## 1找到url url ="https://bobo.okokbo.com/20171117/2Eknv6hZ/6583kb/hls/yoCGHLE"+ i +"....

weixin_44418748的博客 1607

激光器安规详细解读 - 一级 - 并以940波长为例

前言: 作为人工智能的重要解决方案,激光作为不可或缺的一个选项。但是,激光的安规问题始终是要得到关注。尤其是3D识别技术在人脸上的使用的时候,如何判读激光器的安全使用规范,变得非常重要。本文,尝试从欧洲激光标准IEC 60825-1:2014,以及国家激光产品规则标准GB 7247.1,抛砖引玉,写出自己的理解。 本节,主要讨论,人脸识别需要符合的安全等级1: 1 激光标准的分类 激光国际...

山云的专栏 5036

pytest学习和使用19-pytest断言失败后,怎样保持后续的断言继续执行?(pytest-assume)

【代码】pytest学习和使用19-pytes断言失败后,怎样保持后续的断言继续执行?

虫无涯的博客 1390

m3u8转mp4缓存合并工厂_Python爬取视频之爱情电影及解密TS文件和两种合并ts!

俗话说,兴趣所在,方能大展拳脚。so结合兴趣的学习才能事半功倍,更加努力专心,apparently本次任务是在视频网站爬取一些好看的小电影,地址不放(狗头保命)只记录过程。实现功能:从网站上爬取采用m3u8分段方式的视频文件,对加密的 "ts"文件解密,实现两种方式合并"ts"文件,为防止IP被封,使用代理,最后删除临时文件。环境 &依赖Win10 64bitIDE:PycharmPyth...

weixin_39627361的博客 2224

学Simulink——基于Simulink的超前-滞后校正控制器设计与仿真建模示例

本文完成了基于 Simulink 的超前-滞后校正控制器设计与仿真,实现了:✅掌握超前与滞后校正的物理意义与设计流程✅分步设计复合控制器,兼顾动态与稳态✅在 Simulink 中搭建闭环系统并验证卓越性能✅达成高稳定裕度、高精度、快速响应三大目标。

xiaoheshang_123的博客 78

爬虫|Python|ts格式的加密视频合并方法

爬虫可以看做是一个非常规手段,通常,该手段是借助Python编程(其中有各种各样的工具,框架,库类)来绕过网站的安全和权限来获得所需的资源。 so,对于爬虫来说,没有道德(比如,某些爬虫上w的并发,那么,一些小站可能就会崩溃,其实爬虫也是可以作为网络攻击的,假设有需要攻击的网站,上w甚至上百万的并发爬虫持续攻击,这个网站可能开不了),没有知识产权(爬虫行为本来就是无视知识产权的,例如,爬取视频,音乐,文章),没有网站安全这些规则(通常,爬虫一旦开始,除非快速的自动封禁,例如,封IP,否则无法停止)

zsk_john的技术分享专用博客 3936

AEJoy —— 表达式之仅限在某一维摆动【JS】

效果图 wiggle() 的作用仅限于水平方向 想法 wiggle() 确实是一个非常方便的工具,但有时您希望对它有更多的控制。在本例中,我们希望仅将摆动限制在水平方向。 设计 要理解 wiggle() 最重要的一点是,它生成的结果与应用它的属性具有相同的维度。例如,如果你将 wiggle() 应用于 3D 层的 position 属性,结果将是一个由三个元素组成的数组(x、y 和 z 各一个)。我们需要做的就是将 wiggle() 的结果捕捉到一个变量(我们称之为 “w” ),然后从这个变量中提取我们想

ShaderJoy 的兴趣技术杂货铺 2094

软件测试面试题之易错题

(1)白盒测试:又称功能功能 测试、数据驱动测试和行为测试,是一种从用户观点出发的测试,被测程序为黑盒子, 通过测试来检测每个功能是否能够正常使用。(2)黑盒测试:又称结构测试和逻辑驱动 测试,是知道产品内部工作过程,通过测试来检测产品内部动作是否按照规格说明书 的规定去正常运行。(1)、测试需求分析;(2)动态白盒测试:需要对各个模块功能、模块间的接口、局部数据结构、主要执行路径、 错误处理等方面的测试。(2) 集成测试所测试的对象是模块间的接口,其目的是在找出在模块接口上面,包括整体体系结构上的问题;

m0_37449634的博客 679
上一篇: Python学习的简约路线图,学完神功大成,对应一下看看你自己在哪个阶段
下一篇: 利用python从GitHub获取https代理,采集网站的数据的速度翻倍
Python编程_可乐
博客等级 码龄6年 917粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值