网页视频抓取脚本(之前写《使用Python抓取m3u8加密视频》笔记的原因)
优采云 发布时间: 2022-04-14 19:38网页视频抓取脚本(之前写《使用Python抓取m3u8加密视频》笔记的原因)
之所以写笔记“使用Python捕获m3u8加密视频”是因为我有几个视频想要保存,但是对m3u8、.ts文件拼接不熟悉,所以尝试写一个练习脚本。
看了今天的回复,有同学想知道如何从视频网站中获取主文件index.m3u8的链接。正好有空,就找了一个网站看了一下,分享笔记如下
使用包
import requests, re
from lxml import etree # 最近爱上xpath,速度比BeautifulSoup快一点,而且xpath的语法通用
示例网址
每个网站的HTML结构都不一样。这个是随机找到的,使用动态JS和BLOB。我不知道blob,所以我不知道如何解析它。但是这个网站还有另一种方法来解析index.m3u8地址。
分析搜索链接获取视频首页
http://www.dy2046.net/search.asp?searchword=%D3%EB%C9%F1%CD%AC%D0%D0
与神同行_TV全集-电影123主演的电影
使用网站顶部的站内搜索功能,随便输入电影名,观察返回的结果页面,就可以看到
1、使用普通的get请求进行搜索(注意url已经转为gbk编码,必须相应转码,否则会失败)
2、分析结果网页,搜索结果保存在标签中
测试代码如下
def get_videourl(name):
# 拼接搜索链接并转码
searchurl = requests.utils.quote(f'http://www.dy2046.net/search.asp?searchword={name}',safe=':/.?=&', encoding='gbk')
print(searchurl)
page = requests.get(searchurl)
page = etree.HTML(page.content)
videourl = page.xpath('//ul[@class="piclist"]/li/a')[0].get('href')
return f'{siteurl}{videourl}'
分析视频首页,获取播放链接
打开视频首页,找到播放链接。
def get_index(videourl):
page = requests.get(videourl)
page = etree.HTML(page)
page = page.xpath('/html/body/div//div[@id="jishu"]/div//ul/li/a')
playlist = [f'{siteurl}{i.get("href")}' for i in page]
return playlist
分析播放页面
打开播放链接
我觉得有点麻烦。在播放期间使用 iframe 加载。在这种情况下,请求通常很难在 iframe 内获取链接。需要使用 selenium 包来模拟浏览器,但是 selenium 加载速度较慢,所以不是及时的选择。
再看,发现图中标签前加载了一个.js脚本,打开看看
var VideoListJson=[
['云播放',
[
'BDu97E9u8BEDu9AD8u6E05$https://youku.cdn1-letv.com/share/3613ef1ee5b75945c042bfb124275a0b$kuyun',
'BDu7CA4u8BEDu9AD8u6E05$https://youku.cdn1-letv.com/share/869b61d6a909d51d982bae4dfd341f0a$kuyun'
]
],
['云点播',
[
'BDu97E9u8BEDu9AD8u6E05$https://youku.cdn1-letv.com/20180403/9033_500a12*敏*感*词*/index.m3u8$m3u8',
'BDu7CA4u8BEDu9AD8u6E05$https://youku.cdn1-letv.com/20180403/9032_72f7d579/index.m3u8$m3u8'
]
]
],urlinfo='http://'+document.domain+'/juqing/yushentongxing/play--.html';
对比浏览器中找到的index.m3u8地址,发现非常相似
在.js脚本中打开index.m3u8,内容如下
'#EXTM3Un#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=800000,RESOLUTION=1080x608n1000k/hls/index.m3u8'
至此,已经确认index.m3u8的地址保存在.js脚本中,通过简单的拼接就可以得到index.m3u8的真实地址。
def get_index(playurl):
# 获得.js脚本 的链接
page = requests.get(playurl)
page = etree.HTML(page.content)
indexurl = page.xpath('//div[@id="bofang-box"]/script')[0].values()[1]
# 拼接.js脚本的链接, 并删除?后面的参数
indexurl = f'{siteurl}{indexurl[:indexurl.find("?")]}'
# 获得.js脚本内容,并提取中 index.m3u8 的链接
page = requests.get(indexurl)
indexurl = re.findall(r"https://[w-.$/]+.m3u8",page.text)[0]
tmp = requests.get(indexurl)
tmp = tmp.text[tmp.text.rfind('n')+1:]
indexurl = indexurl.replace('index.m3u8', tmp)
return indexurl
好了,剩下的就是下载解析index.m3u8文件的内容了,不多写了。