今天学习的是如何爬取视频,回顾我们爬取网页文字小说或者图片的时候,大都是从主页面进入到子页面,然后图片就拿到它的src,文字小说大概是拿到某个节点的content.但是爬取视频和上述二者有较大的区别,视频在服务器中的存放是分清晰度和分切片的,以至于我们每次请求都只能请求较短的一小个切片,所以想要爬取一个完整的视频就需要不断请求各个切片的url。然后下载ts文件,并合并成为一个完整的mp4文件。
#<video src="*****.mp4"></video>这种形式写的url会让访问者访问速度特别慢,尤其是加载大视频的时候,会一次性全部加载,就需要等待很久 #视频网站的工作原理 #用户上传视频——转码(转换成不同分辨率的同时长视频,4K-2K\1K\1080P)——切片处理(把单个视频文件进行拆分) #用户在拖动进度条的时候其实是选择哪个切片 #需要一个文件来记录信息:1.视频的播放顺序2.视频的存放路径 #m3u8 txt json----文本---可编码#想要抓取一个视频: #1.找到m3u8文件(各种手段) #2.通过m3u8文件下载到ts文件 #3.运用各种手段把ts文件合并成mp4文件
今天的任务:
#抓取视频简单版: """ 1.拿到html页面源代码 2.从源代码里面提取出m3u8的url 3.下载m3u8 4.读取m3u8文件,下载视频 5.合并视频 """
import requests
import re
#1.拿到html页面源代码
url="http://www.91kanju2.com/vod-play/60767-1-1.html"
headers={
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36"
}
resp=requests.get(url)
#print(resp.text)
#2.从源代码里面提取出m3u8的url
obj=re.compile(r'"","url":"(?P<m3u8_url>.*?)"',re.S)#提取m3u8的下载地址
m3u8_url=obj.search(resp.text).group("m3u8_url")
print(m3u8_url)
resp.close()
#3.下载m3u8文件
resp2=requests.get(m3u8_url)
with open("仙剑1.m3u8","wb")as f:
f.write(resp2.content)
resp2.close()
print("下载完毕")
#4.解析m3u8文件
n=1
with open("仙剑1.m3u8",mode="r",encoding="utf-8")as f:
for line in f:
line=line.strip()#跳过两边的所有空格
if line.startswith("#"):
continue
#下载视频片段
resp3=requests.get(line,headers=headers)
a=open(f"files/仙剑奇侠传/{n}.ts","wb")
a.close()
resp3.close()
n+=1
最后总结,我没有将结果做出来,主要原因是服务器已经将ts文件的url进行了加密,所以当我们请求url的时候,发现返回的内容是空。具体的解决办法应该还不是我现在可以解决的,期待未来学习到了新的知识回顾解决,也曾想过试一下像网易云那节课进行逆向解密,但是步骤繁琐。将问题交给未来吧