网页视频抓取脚本(之前写《使用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文件的内容了,不多写了。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线