无聊自学爬虫,想追剧,找到了在线观看的网址,然后想有什么办法能把网站上播放的视频下载下来。

我的m3u8格式是这样的(链接已打码),用的AES128加密

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:9
#EXT-X-PLAYLIST-TYPE:VOD
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-KEY:METHOD=AES-128,URI="https:********/hls/key.key"
#EXTINF:5,
https://********hls/aGmWudvF.ts
#EXTINF:3.52,
https://********/hls/1JAJqOdf.ts

首先获取m3u8文件中的信息,提取出所有的ts文件链接地址和加密秘钥

def get_ts(url_m3u8):d_m3u8 = requests.get(url=url_m3u8,headers=header).content.decode('utf-8')   # 访问网页获取返回信息ts_list = re.findall(r'(.*?\.ts)', d_m3u8)     # 正则提取出列表key_url = re.findall(r'URI="(.*?)"',d_m3u8)[0] #正则提取出秘钥return ts_list,key_url

下载单个tsw文件代码,在使用的时候前面加上retry装饰符,遇上网络不好执行出错的时候可以重复几次

def download_one_file(ts_url,download_path,index):ts_path = download_path + "/{:0>4d}.ts".format(index)file_name = ts_url.split("/")[-1]if not os.path.isfile(ts_path):# print("ts_url", ts_url)#print("开始下载 %s" % file_name)time.sleep(2)  # 防止爬虫间隔时间过短被禁止请求try:#随机挑选一个代理,以防被锁断开连接headers = {'User-Agent': str(UserAgent().random.strip),'Connection':'close'}#记得加上timeout规定时间没反应就抛出异常#以防网络原因造成线程拥堵,整个程序“死机”等待某几个线程response = requests.get(headers=headers, url=ts_url,timeout=(10,60))except Exception as e:print("异常请求:%s" % e.args)raise ewith open(ts_path, "wb+") as file:#被解码的数据长度必须是16的整数倍,不然解码会报错,这里将它补齐content=pad(response.content,16)  file.write(cryptor.decrypt(content))#下面注释了,因为不能这样分块解码,那样保存的视频能看但是卡顿有马赛克# for chunk in response.iter_content(chunk_size=1024):#     if chunk:#         file.write(cryptor.decrypt(chunk))#         # file.write(chunk)else:print("{} 已经存在".format(file_name))

使用线程下载所有的ts文件

def dowload_all_file(ts_urls,download_path):pool=threadpool.ThreadPool(50)args=[]#调用函数的参数for i,u in enumerate(ts_urls):#参数是ts文件的地址和序号,保存的时候用序号保存,排序好才能后续正确合并args.append(([u,download_path,i],None))requests=threadpool.makeRequests(download_one_file,args)print(len(requests))for req in requests:pool.putRequest(req)pool.wait()

下载好后合并所有的ts文件为一个mp4文件

# 将已经下载的ts文件的路径进行排序
def file_walker(path):file_list = []for root, dirs, files in os.walk(path): # 生成器for fn in files:p = str(root+'/'+fn)file_list.append(p)file_list.sort()return file_list# 将所有下载好的ts文件组合成一个文件
# ts_path: 下载好的一堆ts文件的文件夹
# combine_path: 组合好的文件的存放位置
# file_name: 组合好的视频文件的文件名
def combine(ts_path, combine_path, file_name):file_list = file_walker(ts_path)file_path = combine_path + file_name +'.mp4'with open(file_path, 'wb') as fw:for i in range(len(file_list)):content=open(file_list[i], 'rb').read()fw.write(content)print(file_path)

完整代码如下:

# -*- coding: UTF-8 -*-
import datetime
import requests
import os
import time
import re
import threadpool
# Python的urllib3软件包的证书认证及警告的禁用
import urllib3
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from fake_useragent import UserAgent
from retrying import retry
urllib3.disable_warnings()# 访问m3u8 获取到.ts列表
def get_ts(url_m3u8):d_m3u8 = requests.get(url=url_m3u8,headers=header).content.decode('utf-8')   # 访问网页获取返回信息ts_list = re.findall(r'(.*?\.ts)', d_m3u8)     # 正则提取出列表key_url = re.findall(r'URI="(.*?)"',d_m3u8)[0]return ts_list,key_url@retry(stop_max_attempt_number=10,wait_random_min=50,wait_random_max=2000)
def download_one_file(ts_url,download_path,index):ts_path = download_path + "/{:0>4d}.ts".format(index)file_name = ts_url.split("/")[-1]#print(ts_path)if not os.path.isfile(ts_path):# print("ts_url", ts_url)#print("开始下载 %s" % file_name)time.sleep(2)  # 防止爬虫间隔时间过短被禁止请求try:headers = {'User-Agent': str(UserAgent().random.strip),'Connection':'close'}response = requests.get(headers=headers, url=ts_url,timeout=(10,60))except Exception as e:print("异常请求:%s" % e.args)raise ewith open(ts_path, "wb+") as file:content=pad(response.content,16)file.write(cryptor.decrypt(content))else:print("{} 已经存在".format(file_name))def dowload_all_file(ts_urls,download_path):pool=threadpool.ThreadPool(50)args=[]for i,u in enumerate(ts_urls):args.append(([u,download_path,i],None))requests=threadpool.makeRequests(download_one_file,args)print(len(requests))for req in requests:pool.putRequest(req)pool.wait()# 将已经下载的ts文件的路径进行排序
def file_walker(path):file_list = []for root, dirs, files in os.walk(path): # 生成器for fn in files:p = str(root+'/'+fn)file_list.append(p)file_list.sort()return file_list# 将所有下载好的ts文件组合成一个文件
# ts_path: 下载好的一堆ts文件的文件夹
# combine_path: 组合好的文件的存放位置
# file_name: 组合好的视频文件的文件名
def combine(ts_path, combine_path, file_name):file_list = file_walker(ts_path)file_path = combine_path + file_name +'.mp4'with open(file_path, 'wb') as fw:for i in range(len(file_list)):content=open(file_list[i], 'rb').read()fw.write(content)print(file_path)if __name__ == '__main__':start = datetime.datetime.now().replace(microsecond=0)urls, key_url = get_ts('https://******/hls/index.m3u8')key = requests.get(headers=header,url=key_url).contentcryptor=AES.new(key,AES.MODE_CBC,key)dowload_all_file(urls,r"D:/娱乐/ts_download")combine(r"D:/娱乐/ts_download",r"D:/娱乐/ts/","output")end = datetime.datetime.now().replace(microsecond=0)print("耗时:%s"%(end-start))

因为写好的代码总是不记得放哪去了,每次找都麻烦,重新写查找函数使用方法都花好久。放这里方便自己以后使用,也是对自己工作做个总结。可能不同的网站爬虫的时候要做不同的修改,大差不差我这个思路。

但是缺陷在于只能下载单集电视剧,每次需要自己去网站调试找到m3u8文件的地址。还不能只通过视频网站地址爬虫,那个我看资料需要会js逆向,我还不太懂哈哈,继续学习。

根据M3U8文件地址下载网站上的视频相关推荐

  1. 教你如何简便下载网站上的视频

    教你如何简便下载网站上的视频 利用you-get可以下载的国外网站: 利用you-get可以下载的国内网站: 接下来就具体介绍如何下载: 一.下载视频 1.安装you-get 如果之前没装过you-g ...

  2. 如何下载网站上的视频,亲测有效

    You-get是GitHub上的一个项目,也可以说是一个命令行程序,帮助大家下载大多主流网站上的视频.图片及音频. 第一步:下载安装python3.7(最新) 第二步:按住键盘上的"win+ ...

  3. 如何使用python下载网站上的视频

    youtube-dl 从名字上也能看出来,是专门用来下载YouTube的视频. 不过本人对YouTube不感兴趣,但是这个模块可以用来下载bilibili上的视频我们就来试一试 首先pip insta ...

  4. 视频网站上的视频下载工具

    http://www.vidown.cn/softdownload.html 这个叫维棠的视频下载软件真的很不错呢,可以直接下载视频网站上的视频, 本来想下载完就删掉的,但是没想到这么好用, 就留着吧 ...

  5. qfile超过下载文件容量_如何下载视频网站上的视频,这里有方法

    你是否在网上看到某个视频,非常喜欢,但是却苦于不知道如何将其下载下来.下面,我来给大家介绍一个好用的网站和软件. 这个网站软件叫 硕鼠,是一个专门下载网站视频和转换视频的网站和软件.下面我来介绍一下如 ...

  6. 一款Github工具包-快速下载网页上的视频

    导读:今天给大家推荐一款优秀的Github工具包,可以让您快速下载网页上的视频. You-get 项目主页:https://github.com/soimort/you-get/wiki/中文说明#i ...

  7. 怎么下载网页上的视频

    现在视频网站非常火爆,有时候看到一些精美的视频,我们都想下载下来,方便日后观看,但不懂电脑知识的人,就觉得非常难,其实,这些都是很简单的,下面我就一步一步教大家如何下载视频网站上的视频. 通用方法,所 ...

  8. 【下载网页上的视频】IDM显示无法将下载行为传输到IDM

    安装了绿化版的IDM来下载网页上的视频,非常好用,但是下载之后却显示无法将下载行为传输到IDM. [解决办法]下载之前进行配置:运行IDM,下载-选项-常规下进行设置: 常规设置-勾选接管所有浏览器下 ...

  9. Python如何下载网页上的视频

    Python如何下载网页上的视频 1.在电脑上创建一个文件夹 2.在文件夹里输入cmd 3.回车 4.输入 pip install you-get 回车 5.输入you-get 自己喜欢的视频链接 回 ...

最新文章

  1. 【THML】兴唐第二十八节课 几个小程序
  2. 【Git 第2课】 GitHub是什么?
  3. AngularJS内置指令
  4. 前台后台进程转换问题
  5. Mybatis(1)---入门篇单表查询
  6. iOS Core ML与Vision初识
  7. 【转】Galileo伽利略项目-- 数字城市规划和基础设施建模
  8. jquery计算两个日期天数差
  9. 获取网页html内容
  10. office visio 替代_5款替代微软Visio的开源免费软件
  11. 19.4.17 javaScript基础 培训第三天
  12. C语言指针 与字符串的学习
  13. Latex符号查询网站
  14. 【BP回归预测】鲸鱼算法优化BP神经网络回归预测(多输入单输出)【含Matlab源码 1554期】
  15. 键盘符号中英文对照表
  16. ROS学习笔记(2)——ROS通信机制
  17. 【windows】bat 更改系统时间同步internet时间
  18. 【前端学习 Vue (8) 什么是SSR】
  19. Flutter-防京东商城项目-创建商品数据模型 、请求Api接口渲染热门商品 推荐商品 获取数据然后模型赋值-06
  20. OpenHarmony编译系统

热门文章

  1. [2]十道算法题【Java实现】
  2. 【实战总结】根据地图经纬度及范围查询坐标点信息
  3. 在excel中如何筛选重复数据_Excel如何快速筛选
  4. JS 复习(6)JavaScript对象
  5. [PTA] 7-11 计算平均分
  6. 如何快速查询京东快递物流正在派送中的单号
  7. windows XP全公略
  8. android手机api等级_什么是Android API 级别?
  9. 高中计算机教学心得,高中教学心得随笔
  10. html5 css3 内边距,css什么是内边距?css内边距的设置方法(实例)