python 提取灌篮高手视频真实URL过程

背景:

这几天想看灌篮高手的动漫,但是发现爱奇艺,搜狐等视频网站只有灌篮高手标清的,2013年的重制高清版都下架不能看,好像因为版权问题无法播放了,于是百度上搜索,在m.dm530.net/show/4154.html 上还有灌篮高手的重制高清版在线观看,但是在线观看不知是浏览器问题还是什么,无法快进和后退,反正就各种问题,于是就想用Python把该网站的视频直接下载到本地,这样关键的问题就是要找到视频的真实URL。

思路:

首先是想办法先获取第一集视频的URL,于是使用谷歌浏览器打开第一集的播放地址m.dm530.net/v/4154-0-0.html ,按F12,打开Chrome DevTools,选择network选项,去查看网络请求的数据包,看视频链接会不会出现在那里,按文件大小进行排序后,发现有个60M的文件,如下图
python 提取灌篮高手视频真实URL过程
这文件很有可能就是视频链接了,把链接复制下来

http://edge.ivideo.sina.com.cn/118657395.hlv?KID=sina,viask&Expires=1525104000&ssig=qqeUdXnlpO 

发现是新浪的网址,然后去百度了hlv格式,查到了这也是新浪视频的文件格式。这应该就是所要找的视频链接,下载测试发现是能正常播放的,不过是要支持flv文件格式的播放器才行。而且下载的视频也只有6分钟,应该是新浪把视频分段了。获取了不同的视频URL,进行比较,发现URL中 文件名称(也就是118657395.hlv)和ssig参数会变化,域名和KID=sina,viask&Expires=1525104000这两个参数是没有变化的。于是只要找到文件名和ssig参数的数据就可以获取到拼接成视频URL了。
于是继续在chrome浏览器在查看网络请求的数据包,发现了有个XML文件,其中包含着一集视频的所有URL地址和视频信息。不过这获取这XML的链接是有时间限制的,一会后就不能访问了。链接和截图如下所示:

https://player.s1905.com/ipsign/parse.php?url=118656937_sina&sign=98062c84b16523141973ac1e&ran=1525008246&ipsign=83753ccabbae12d1f05053a3a18ec96b1d6962fb802e7585d7101af33f76b43acd270e87&ip=自身IP

python 提取灌篮高手视频真实URL过程
于是思考这XML链接是怎么获取的,继续查看请求的数据包,没发现什么有用的信息了。。。。于是我直接查看网页的源代码,看看源代码是通过什么方式获取该链接的,看到播放页面处就只有下面的js代码。

<script type="text/javascript" src="/playdata/58/4154.js?6195.856"></script><script>var param=getHtmlParas('.html');viewplay(param[0],param[1])</script>

看来网站是通过这js代码获取XML链接的。于是继续查看网站的js文件,看到很多加密的js文件,本来就对js不熟了,更别说混淆加密后的js了,更无从入手了。
于是继续去Chrome DevTools中各种选项看看有没有什么信息遗漏的,突然看到Chrome DevTools的elements选项的HTML代码中还有个iframe标签,之前直接查看源代码中是没有显示着iframe标签的。
python 提取灌篮高手视频真实URL过程
这应该是HTML的一些特性吧,我也不太了解,查看iframe标签的代码,终于发现关键信息了,如下图:
python 提取灌篮高手视频真实URL过程
里面js代码的变量就是XML链接的各种参数

XML网址:https://player.s1905.com/ipsign/parse.php?url=118656937_sina&sign=98062c84b16523141973ac1e&ran=1525008246&ipsign=83753ccabbae12d1f05053a3a18ec96b1d6962fb802e7585d7101af33f76b43acd270e87&ip=自身IP

也就是只要获取到iframe标签的这些JS变量值,我们就可以获取到获取视频地址的XML,从上图中可以看到,url、ran和ip参数都已经给出来了,剩下需要获取的就是只有ipsign和sign这两个参数的值了。
可是ipsign和sign这两个变量使用的JS函数,在混淆加密的JS文件中,根本就看不出来逻辑,如下图:
python 提取灌篮高手视频真实URL过程
手动分析JS代码看来是行不通的了,于是我百度下看到了些思路,还可以模拟浏览器运行,从而获取JS变量值的。
查到Python可以通过selenium库模拟真实浏览器去渲染JavaScript的。

代码实现:

具体实现方式就是Python使用selenium去运行chrome浏览器(要下载chrome浏览器对应的chromedriver),返回JS变量值。因为video变量的值比所需要的XML的网址只是多了两个参数,所以就直接获取video变量的值再截取成XML网址,获取XML后,再使用正则表达式匹配视频URL。

XML网址:https://player.s1905.com/ipsign/parse.php?url=118656937_sina&sign=98062c84b16523141973ac1e&ran=1525008246&ipsign=83753ccabbae12d1f05053a3a18ec96b1d6962fb802e7585d7101af33f76b43acd270e87&ip=自身IP
video变量:var video = 'https://player.s1905.com/ipsign/parse.php?url=' + encodeURIComponent(url) +'&ctype=phone&hd=3&sign=' + sign +'&ran=' + ctime +'&ipsign=' + ipsign +'&ip=' + ip +'';

具体代码:

# _*_ coding: utf-8 _*_
import threading
import os
import re
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
import requests
import time

def getvideo(url,filename):
    #设置浏览器选项
    chrome_options = Options()
    chrome_options.add_argument("--headless") #启动Chrome 浏览器的***面形态
    #对应的chromedriver的放置目录,因为我的chromedriver放进python安装目录的Scripts,所以可以不填
    driver = webdriver.Chrome(chrome_options=chrome_options)
    #浏览器浏览网址
    driver.get(url)
    try:
        driver.switch_to.frame(0)#切换到iframe
        url1 = driver.execute_script("return video") #获取video变量值
    except:
        f=open('realurl.txt','a')
        f.write('\n'+filename+'\n')
        f.write('异常\n')
        f.close()
    vu=url1.replace('&ctype=phone','')#截取成XML网址,hd=3这参数是没影响的,所以留着
    driver.close() #关闭浏览器
    headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
    'Accept-Charset': 'UTF-8,*;q=0.5',
    'Accept-Encoding': 'gzip,deflate,sdch',
    'Accept-Language': 'en-US,en;q=0.8',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0',  
    }
    text=requests.get(vu,headers=headers)
    pattern=re.compile('http://[\w|/|\.|&|?|=|,|%|:]+')#匹配视频URL的正则表达式
    url=pattern.findall(text.text)#获取一集中所有视频URL
    #把URL写进文本
    f=open('realurl.txt','a')
    f.write('\n'+filename+'\n')
    f.write('\n'.join(url))
    f.close()
if __name__=='__main__':
    f=open('dm530.txt','r')
    for line in f:
        v=line.strip().split('\t')
        url=v[0]
        filename=v[1]
        t=threading.Thread(target=getvideo,args=(url,filename))
        t.start()
        t.join() #t线程退出后再执行下一步
        time.sleep(4)
    f.close()
    print('end')

dm530文件通过网页源代码制作而成的,如下图所示:
python 提取灌篮高手视频真实URL过程
最后获取出来的结果realurl.txt(因为有些集数该网站也无法播放,所以也无法获取到),如下图:
python 提取灌篮高手视频真实URL过程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章