import random
import os
import re
import requests
import asyncio
import aiohttp
import time
from lxml import etree
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad,unpad url = "https://www.9tata.cc/play/17360-2-0.html"
user_agent_list = [
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 "
"(KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 "
"(KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 "
"(KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 "
"(KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 "
"(KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 "
"(KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 "
"(KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 "
"(KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 "
"(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 "
"(KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]
headers ={
"User-Agent":random.choice(user_agent_list)
} async def get_m3u8_url():
async with aiohttp.ClientSession() as session:
async with session.get(url, headers=headers,ssl=False) as response:
text = await response.text()
html = etree.HTML(text) # 1. 获取页面html
video_name = html.xpath('//div[@class="page-header"]/h2/a[2]//text()')[0]
m3u8_1 = re.search('now="(.*?m3u8)";', text).group(1)
return m3u8_1, video_name # 2. 从网页源码(js)获取m3u8地址
async def get_m3u8_detail(m3u8_url):
async with aiohttp.ClientSession() as session:
async with session.get(m3u8_url, headers=headers,ssl=False) as response:
text = await response.text()
path = text.split('\n')[2]
# m3u8_2_path = os.path.join(os.path.dirname(m3u8_1), path)
m3u8_2_path = os.path.dirname(os.path.dirname(os.path.dirname(m3u8_url)))+path
return m3u8_2_path,os.path.dirname(path) async def get_key(m3u8_url):
"""获取Key"""
print(m3u8_url)
async with aiohttp.ClientSession() as session:
async with session.get(m3u8_url+"/key.key", headers=headers,ssl=False) as response:
text = await response.text()
with open("videos/key.key", "w") as f:
f.write(text)
return text # 4. 获取m3u8文件顺序
async def get_ts_list(m3u8_detail,path):
async with aiohttp.ClientSession() as session:
async with session.get(m3u8_detail, headers=headers,ssl=False) as response:
text = await response.text()
with open("videos/old_index.m3u8","w") as f:
text = text.replace(path+'/',os.path.abspath("videos")+'\\')
# text = text.replace("\\","\\\\")
f.write(text)
ts_list = re.findall(r"\\([A-Za-z0-9]*\.ts)",text)
print(ts_list)
base_path = os.path.dirname(m3u8_detail)
return ts_list, base_path async def download(base_path, ts, aes):
# 5. 下载ts文件
ts_path = base_path+'/'+ts
ts_name = os.path.basename(ts)
print(ts_path)
with open(f"videos/{ts_name}", "wb") as f:
async with aiohttp.ClientSession() as session:
async with session.get(ts_path, headers=headers,ssl=False) as response:
f.write(aes.decrypt(pad(await response.content.read(), AES.block_size)))
# f.write(aes.decrypt(await response.content.read()))
print(f"{ts_name}下载完成") def change_m3u8():
"""视频ts已经解密,不需要在解密 #EXT-X-KEY这行删除"""
with open("videos/old_index.m3u8",'r') as f:
lines = f.readlines()
with open("index.m3u8", 'w') as file:
for line in lines:
if "#EXT-X-KEY" not in line:
file.readline(line) def merge(video_name="flash"):
"""视频合并"""
os.chdir(os.path.join(os.path.dirname(os.path.abspath(__file__)),"videos"))
os.system(f"ffmpeg -allowed_extensions ALL -i index.m3u8 -c copy {video_name}.mp4") async def main():
m3u8_url, name = await get_m3u8_url()
m3u8_detail,path = await get_m3u8_detail(m3u8_url)
key = await get_key(os.path.dirname(m3u8_detail))
aes = AES.new(key.encode('utf-8'), AES.MODE_CBC,b"0000000000000000")
ts_list, base_path = await get_ts_list(m3u8_detail,path)
tasks = [asyncio.create_task(download(base_path,ts, aes)) for ts in ts_list]
await asyncio.wait(tasks)
change_m3u8()
merge(name) start = time.time()
asyncio.run(main())
print(f"耗时:{time.time()-start}")

爬取m3u8加密视频的更多相关文章

  1. 利用selenium和ffmpeg爬取m3u8 ts视频《进击的巨人》

    需求 想看下动漫<进击的巨人>,发现到处被和谐,找不到资源,但是在一个视频网站找到了在线播放,https://www.55cc.cc/dongman/17890/player-2-1.ht ...

  2. 爬虫之爬取B站视频及破解知乎登录方法(进阶)

    今日内容概要 爬虫思路之破解知乎登录 爬虫思路之破解红薯网小说 爬取b站视频 Xpath选择器 MongoDB数据库 爬取b站视频 """ 爬取大的视频网站资源的时候,一 ...

  3. 如何手动写一个Python脚本自动爬取Bilibili小视频

    如何手动写一个Python脚本自动爬取Bilibili小视频 国庆结束之余,某个不务正业的码农不好好干活,在B站瞎逛着,毕竟国庆嘛,还让不让人休息了诶-- 我身边的很多小伙伴们在朋友圈里面晒着出去游玩 ...

  4. python爬虫:爬取慕课网视频

    前段时间安装了一个慕课网app,发现不用注册就可以在线看其中的视频,就有了想爬取其中的视频,用来在电脑上学习.决定花两天时间用学了一段时间的python做一做.(我的新书<Python爬虫开发与 ...

  5. Python爬取B站视频信息

    该文内容已失效,现已实现scrapy+scrapy-splash来爬取该网站视频及用户信息,由于B站的反爬封IP,以及网上的免费代理IP绝大部分失效,无法实现一个可靠的IP代理池,免费代理网站又是各种 ...

  6. Python爬虫实战:爬取腾讯视频的评论

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 易某某 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...

  7. python 爬取腾讯视频的全部评论

    一.网址分析 查阅了网上的大部分资料,大概都是通过抓包获取.但是抓包有点麻烦,尝试了F12,也可以获取到评论.以电视剧<在一起>为例子.评论最底端有个查看更多评论猜测过去应该是 Ajax ...

  8. Python爬取某短视频热点

    写在前面的一些话: 随着短视频的大火,不仅可以给人们带来娱乐,还有热点新闻时事以及各种知识,刷短视频也逐渐成为了日常生活的一部分.本文以一个简单的小例子,简述如何通过Pyhton依托Selenium来 ...

  9. Python 自动爬取B站视频

    文件名自定义(文件格式为.py),脚本内容: #!/usr/bin/env python #-*-coding:utf-8-*- import requests import random impor ...

  10. Python爬取抖音视频

    最近在研究Python爬虫,顺便爬了一下抖音上的视频,找到了哥们喜欢的小姐姐居多,咱们给他爬下来吧. 最终爬取结果 好了废话补多说了,上代码! #https://www.iesdouyin.com/a ...

随机推荐

  1. 科普达人丨漫画图解什么是eRDMA?

    简介: 绕过CPU,将数据直接从一台计算机的内存传输到另一台计算机,进行网络加速 在一个领先的阿里云数据中心里,数百台服务器(也就是大型的计算机)在疯狂工作和通信,他们正在合力完成一个大型的大数据处理 ...

  2. Java 应用压测性能问题定位经验分享

    简介: 问题千千万,但只要修练了足够深厚的内功,形成一套属于自己的排查问题思路和打法,再加上一套支撑问题排查的工具,凭借已有的经验还有偶发到来的那一丝丝灵感,相信所有的问题都会迎刃而解. 作者:凡勇 ...

  3. Serverless 时代下大规模微服务应用运维的最佳实践

    简介: 原来的微服务用户需要自建非常多的组件,包括 PaaS 微服务一些技术框架,运维 IaaS.K8s,还包括可观测组件等.SAE 针对这些方面都做了整体的解决方案,使用户只需要关注自己的业务系统, ...

  4. WPF 设置 IncludePackageReferencesDuringMarkupCompilation 属性导致分析器不工作

    本文记录在 WPF 项目里面设置 IncludePackageReferencesDuringMarkupCompilation 属性为 False 导致了项目所安装的分析器不能符合预期工作 设置 I ...

  5. dotnet 6 推荐一个可代替 .NET Remoting 的 IPC 库

    本文将来和大家推荐一个基于最友好 MIT 协议的完全在 GitHub 上开源的,可代替 .NET Remoting 的 IPC 本机多进程通讯库 本机内多进程通讯 IPC 不同于跨设备系统的 RPC ...

  6. 一分钟部署 Llama3 中文大模型,没别的,就是快

    前段时间百度创始人李彦宏信誓旦旦地说开源大模型会越来越落后,闭源模型会持续领先.随后小扎同学就给了他当头一棒,向他展示了什么叫做顶级开源大模型. 美国当地时间4月18日,Meta 在官网上发布了两款开 ...

  7. 如何基于surging跨网关跨语言进行缓存降级

    概述 surging是一款开源的微服务引擎,包含了rpc服务治理,中间件,以及多种外部协议来解决各个行业的业务问题,在日益发展的今天,业务的需求也更加复杂,单一语言也未必能抗下所有,所以在多语言行业解 ...

  8. 【转载】超级系统工具Sysdig,比 strace、tcpdump、lsof 加起来还强大

    可以用sysdig命令做很多很酷的事情 网络 查看占用网络带宽最多的进程 sysdig -c topprocs_net 显示主机192.168.0.1的网络传输数据 as binary: sysdig ...

  9. 14、web 中间件加固-Tomcat 加固

    1.用户配置 如果不需要控制台管理,请更改控制台用户文件注销账号信息:如果需要,请更改账户信息 修改 tomcat/conf/tomcat-user.xml 文件 注释或修改如下信息 <role ...

  10. Linux中的cp命令

    Linux中cp命令用来赋值文件或者目录,其常用的命令选项如下: 下面是cp命令的一些使用示例: 默认情况下,cp命令赋值出来的权限或者属性通常来源自操作者本身.比如上面在root身份在执行cp命令, ...