赞
踩
之前写《使用Python抓取m3u8加密视频》笔记的原因,是自己有几个视频想保存,但对于m3u8, .ts 文件拼接不熟悉,就尝试写个脚本练手。
今天看了回复,有同学想知道如何从视频网站上获得 index.m3u8 主文件的链接。正好有空,找了个网站看了下,分享笔记如下
使用包
- import requests, re
- from lxml import etree # 最近爱上xpath,速度比BeautifulSoup快一点,而且xpath的语法通用
http://www.dy2046.net/index.html
每个网站的HTML结构不一样,这个是随便找的,用了动态JS和BLOB。blob我没有了解过,不知道怎么解析。不过这个网站有别的办法可以解析出 index.m3u8 地址。
http://www.dy2046.net/search.asp?searchword=%D3%EB%C9%F1%CD%AC%D0%D0
使用网站顶部的站内搜索功能,随便输入电影名称,观察返回结果网页,可以看到
1、搜索是使用普通的get请求(注意uril转成了gbk编码,必须做相应转码,否则失败)
2、分析结果网页,搜索结果是保存在<ul class="piclist"></ul>标签中
测试代码如下
- 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}'
打开视频主页 http://www.dy2046.net/juqing/yushentongxing/ ,找到播放链接。
- 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
打开播放链接 http://www.dy2046.net/juqing/yushentongxing/play-0-0.html
发现有点麻烦,播放时使用了iframe加载,这种情况requests一般很难获取到iframe内部的链接,需要使用 selenium 包来模拟浏览器,但 seleniume 加载较慢 ,是不得以时的选择。
再观察一下,发现图中在 <iframe> 标签前加载了一段 .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_500a12c4/index.m3u8$m3u8',
- 'BDu7CA4u8BEDu9AD8u6E05$https://youku.cdn1-letv.com/20180403/9032_72f7d579/index.m3u8$m3u8'
- ]
- ]
- ],urlinfo='http://'+document.domain+'/juqing/yushentongxing/play-<from>-<pos>.html';
对比在浏览器中找到的 index.m3u8地址 https://youku.cdn1-letv.com/20180403/9033_500a12c4/1000k/hls/index.m3u8 ,发现很像啊
打开.js脚本中的 index.m3u8 ,内容如下
'#EXTM3Un#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=800000,RESOLUTION=1080x608n1000k/hls/index.m3u8'
至此,已经可以确定 .js脚本中就保存了 index.m3u8的地址,做个简单的拼接即可得到真正的 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 文件内容了,不多写了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。