当前位置:   article > 正文

blob的真实地址怎么获得_使用Python抓取m3u8加密视频 续:获得index.m3u8 地址

index.m3u8

之前写《使用Python抓取m3u8加密视频》笔记的原因,是自己有几个视频想保存,但对于m3u8, .ts 文件拼接不熟悉,就尝试写个脚本练手。

今天看了回复,有同学想知道如何从视频网站上获得 index.m3u8 主文件的链接。正好有空,找了个网站看了下,分享笔记如下

使用包

  1. import requests, re
  2. 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
与神同行主演过的电影_电视剧全集 - 电影123​www.dy2046.net

使用网站顶部的站内搜索功能,随便输入电影名称,观察返回结果网页,可以看到

1、搜索是使用普通的get请求(注意uril转成了gbk编码,必须做相应转码,否则失败)

2、分析结果网页,搜索结果是保存在<ul class="piclist"></ul>标签中

测试代码如下

  1. def get_videourl(name):
  2. # 拼接搜索链接并转码
  3. searchurl = requests.utils.quote(f'http://www.dy2046.net/search.asp?searchword={name}',safe=':/.?=&', encoding='gbk')
  4. print(searchurl)
  5. page = requests.get(searchurl)
  6. page = etree.HTML(page.content)
  7. videourl = page.xpath('//ul[@class="piclist"]/li/a')[0].get('href')
  8. return f'{siteurl}{videourl}'

分析视频主页,获得播放链接

打开视频主页 http://www.dy2046.net/juqing/yushentongxing/ ,找到播放链接。

  1. def get_index(videourl):
  2. page = requests.get(videourl)
  3. page = etree.HTML(page)
  4. page = page.xpath('/html/body/div//div[@id="jishu"]/div//ul/li/a')
  5. playlist = [f'{siteurl}{i.get("href")}' for i in page]
  6. return playlist

分析播放页面

打开播放链接 http://www.dy2046.net/juqing/yushentongxing/play-0-0.html

发现有点麻烦,播放时使用了iframe加载,这种情况requests一般很难获取到iframe内部的链接,需要使用 selenium 包来模拟浏览器,但 seleniume 加载较慢 ,是不得以时的选择。

e57d368c462067eff92d12c9e41400ae.png

再观察一下,发现图中在 <iframe> 标签前加载了一段 .js 脚本,打开来看看

  1. var VideoListJson=[
  2. ['云播放',
  3. [
  4. 'BDu97E9u8BEDu9AD8u6E05$https://youku.cdn1-letv.com/share/3613ef1ee5b75945c042bfb124275a0b$kuyun',
  5. 'BDu7CA4u8BEDu9AD8u6E05$https://youku.cdn1-letv.com/share/869b61d6a909d51d982bae4dfd341f0a$kuyun'
  6. ]
  7. ],
  8. ['云点播',
  9. [
  10. 'BDu97E9u8BEDu9AD8u6E05$https://youku.cdn1-letv.com/20180403/9033_500a12c4/index.m3u8$m3u8',
  11. 'BDu7CA4u8BEDu9AD8u6E05$https://youku.cdn1-letv.com/20180403/9032_72f7d579/index.m3u8$m3u8'
  12. ]
  13. ]
  14. ],urlinfo='http://'+document.domain+'/juqing/yushentongxing/play-<from>-<pos>.html';


对比在浏览器中找到的 index.m3u8地址 https://youku.cdn1-letv.com/20180403/9033_500a12c4/1000k/hls/index.m3u8 ,发现很像啊

a585f30c3adea4a8e3f9eeede70c915b.png

打开.js脚本中的 index.m3u8 ,内容如下

'#EXTM3Un#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=800000,RESOLUTION=1080x608n1000k/hls/index.m3u8'

至此,已经可以确定 .js脚本中就保存了 index.m3u8的地址,做个简单的拼接即可得到真正的 index.m3u8地址。

  1. def get_index(playurl):
  2. # 获得.js脚本 的链接
  3. page = requests.get(playurl)
  4. page = etree.HTML(page.content)
  5. indexurl = page.xpath('//div[@id="bofang-box"]/script')[0].values()[1]
  6. # 拼接.js脚本的链接, 并删除?后面的参数
  7. indexurl = f'{siteurl}{indexurl[:indexurl.find("?")]}'
  8. # 获得.js脚本内容,并提取中 index.m3u8 的链接
  9. page = requests.get(indexurl)
  10. indexurl = re.findall(r"https://[w-.$/]+.m3u8",page.text)[0]
  11. tmp = requests.get(indexurl)
  12. tmp = tmp.text[tmp.text.rfind('n')+1:]
  13. indexurl = indexurl.replace('index.m3u8', tmp)
  14. return indexurl

好了,剩下就是下载和解析 index.m3u8 文件内容了,不多写了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/154697
推荐阅读
相关标签
  

闽ICP备14008679号