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

之前写《使用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
与神同行主演过的电影_电视剧全集 - 电影123​www.dy2046.net

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

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 加载较慢 ,是不得以时的选择。

e57d368c462067eff92d12c9e41400ae.png

再观察一下,发现图中在 <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 ,发现很像啊

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地址。

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 文件内容了,不多写了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值