Python +Pyqt5 简单视频爬取学习及工具实现(二)
前言
一、通过主网址,获取HTML所有内容;
二、解析HTML,自动获取m3u8索引文件
三、通过每个视频的索引文件,下载视频流;
四、判断视频流是否需要自动进行格式转化和解密;
五、判断视频流自动合并后是否清除原有ts视频;
六、演示1【下载单个视频】
七、演示2【下载多个视频】
总结
前言
目的:将网站上的m3u8视频下载到本地,包含多个视频自动下载-----仅娱乐使用;
这一次以假面骑士视频作为实例,随便,回顾曾经的热血.......哈哈哈
流程:
- 通过主网址,获取HTML所有内容;
- 解析HTML,自动获取m3u8索引文件;
- 通过每个视频的索引文件,下载视频流;
- 判断视频流是否需要自动进行格式转化和解密;
- 判断视频流自动合并后是否清除原有ts视频;
- 演示1【下载单个视频】;
- 演示2【下载多个视频】;
一、通过主网址,获取HTML所有内容;
代码实现如下:
import random
import requests
# 主网址
m3u8_url = "https://dayuya.com/index.php/vod/play/id/25251/sid/2/nid/1.html"
# 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)
二、解析HTML,自动获取m3u8索引文件
也就是分析HTML内容,从中查询出m3u8索引文件(其他格式的视频流,如果没有索引文件的话,嗯,这边建议只找m3u8格式(*^▽^*))
首先,我们需要知道索引文件在元素哪里,如下图所示:
注意:查询该地址时,需要确认是否查找正确,url索引文件必须正确。
根据网页元素,我们使用正则表达式从HTML内容中(字符串)查询出我们需要的数据
代码实现如下:
import random
import requests
# 主网址
m3u8_url = "https://dayuya.com/index.php/vod/play/id/25251/sid/2/nid/1.html"
# 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)
import re
find = "{}(.*?){}".format("data-play","m3u8")
# print(find)
data = re.findall(find,data)[0]
data = data + "m3u8"
print("\nindex地址:",data)
这是一个视频的索引文件获取流程,其他视频流的获取过程一样,只是主网址不同而已。
如下图所示:(视频第二集视频)
三、通过每个视频的索引文件,下载视频流;
这里就可以看Python +Pyqt5 简单视频爬取学习(一)
其中的流程一样的,没什么区别。
注意:这里有时候下载ts视频会失败,会被网站拒绝或者限制或者请求不完全,各种异常,这种情况下,就是换主网址视频源的线路,或者换其他网站,反正流程都是一样的,能下载下来就行,当然,你也可以尝试解决这些问题。
四、判断视频流是否需要自动进行格式转化和解密;
很简单,通过只读取index索引文件前十行,从中就可以获取到视频下载的格式是否需要自动转化和解密。
五、判断视频流自动合并后是否清除原有ts视频;
这里我是通过配置文件来决定是否自动清除原视频
代码实例如下:
from configparser import ConfigParser
cp = ConfigParser()
cp.read("./config/save.ini",encoding="utf-8")
print(cp.items("configs")) # 获取cmd节点下的所有键值对
print(cp.sections()) # 获取所有的节点
shuju= cp.get("configs", "Find_first") # 获取thread_sleepd的值
print(shuju)
print(type(shuju))
然后,用os.remove(paths) 便可清除视频,paths:视频的路径。
六、演示1【下载单个视频】
界面部分参数解释:
七、演示2【下载多个视频】
总结
虽然不能适配所有网站的资源下载,但个人使用已经满足要求了,下下视频,看看啥的,够用了,反正比网站上看视频要快很多(≖‿≖)✧ ,::ೖ(⑅σ̑ᴗσ̑)ೖ::┏(^0^)┛