今日头条的视频地址解析方法
来源:互联网 发布:php异步请求$.post 编辑:程序博客网 时间:2024/05/21 07:48
以今日头条视频播放页URL http://www.toutiao.com/a6296462662335201793/ 为例,来说说是如何得到视频的真实地址的。
在Chrome浏览器中打开上面的链接,然后审查播放器区域的元素,发现是这样的:
<video id="vjs_video_3_html5_api" class="vjs-tech" preload="auto" autoplay="" src="http://v6.pstatp.com/video/c/c62f4d4320ea43469b490e54240653ab/?Signature=D2cYsGzKaEXraZQnOf72xgJ94%2Bs%3D&Expires=1469172376&KSSAccessKeyId=qh0h9TdcEMrm1VlR2ad/"><source type="video/mp4" src="http://v6.pstatp.com/video/c/c62f4d4320ea43469b490e54240653ab/?Signature=D2cYsGzKaEXraZQnOf72xgJ94%2Bs%3D&Expires=1469172376&KSSAccessKeyId=qh0h9TdcEMrm1VlR2ad/"></video>
原来是使用了HTML5的video标签,该标签的src属性值就是视频的真实地址。是不是很简单?如果我们想写个脚本来自动解析视频的真实地址,会发现情况不一样。
说明:以下代码片段均使用Python语言。
import requestsfrom pyquery import PyQuery as pqr = requests.get('http://www.toutiao.com/a6296462662335201793/')d = pq(r.content)d('video') # video元素不存在d('#video') # id是video的元素是存在的
当我们把播放页下载下来,并且尝试提取video元素的时候,发现下载下来的播放页中根本就没有video元素。这说明video元素可能是js脚本动态生成的,该想想其它办法了。
通过观察加载播放页页面时的网络请求,我们发现如下相关的请求:
http://v7.pstatp.com/b97adb57aaa351e485ed69c5e4852211/5791c279/video/c/c62f4d4320ea43469b490e54240653ab/http://i.snssdk.com/video/urls/v/1/toutiao/mp4/9583cca5fceb4c6b9ca749c214fd1f90?r=18723666135963302&s=3807690062&callback=tt_playerzfndr
其中,第1个请求就是视频真实地址,第2个请求返回的是一个JSON字符串,内容如下:
{ "code": 0, "message": "success", "total": 3, "data": { "status": 10, "video_duration": 0, "video_id": "9583cca5fceb4c6b9ca749c214fd1f90", "user_id": "toutiao", "video_list": { "video_3": { "definition": "720p", "vtype": "mp4", "main_url": "aHR0cDovL3Y3LnBzdGF0cC5jb20vZmJiZmE2Yjc4ZjM4MThhM2M0OTVhMmRkYjAyOWY5NTAvNTc5\nMWMzODAvdmlkZW8vYy8zNDMwNzcxZjMyNmY0ZDUxOTRiNTYyMzdhNmEyMzFmYy8=\n", "vwidth": 720, "backup_url_1": "aHR0cDovL3Y2LnBzdGF0cC5jb20vdmlkZW8vYy8zNDMwNzcxZjMyNmY0ZDUxOTRiNTYyMzdhNmEy\nMzFmYy8/U2lnbmF0dXJlPTMwd25YNHVBYzJ1JTJGdSUyRlNvNjhDM010U1VRVW8lM0QmRXhwaXJl\ncz0xNDY5MTc0MTYwJktTU0FjY2Vzc0tleUlkPXFoMGg5VGRjRU1ybTFWbFIyYWQv\n", "bitrate": 0, "vheight": 576, "size": 0 }, "video_2": { "definition": "480p", "vtype": "mp4", "main_url": "aHR0cDovL3Y0LnBzdGF0cC5jb20vM2ZiYTI0YzVhYzE1NGVlNmIxMGQ4ZTAyZThhNGQxZDMvNTc5\nMWMzODAvdmlkZW8vYy9jNjJmNGQ0MzIwZWE0MzQ2OWI0OTBlNTQyNDA2NTNhYi8=\n", "vwidth": 600, "backup_url_1": "aHR0cDovL3Y0LnBzdGF0cC5jb20vM2ZiYTI0YzVhYzE1NGVlNmIxMGQ4ZTAyZThhNGQxZDMvNTc5\nMWMzODAvdmlkZW8vYy9jNjJmNGQ0MzIwZWE0MzQ2OWI0OTBlNTQyNDA2NTNhYi8=\n", "bitrate": 0, "vheight": 480, "size": 0 }, "video_1": { "definition": "360p", "vtype": "mp4", "main_url": "aHR0cDovL3Y2LnBzdGF0cC5jb20vdmlkZW8vYy9iODgwZmI1YzM1NjE0NzJlOThlNGU0Y2U5N2My\nYzg5ZS8/U2lnbmF0dXJlPXBlTWhoNFdLcyUyRkNmRW9pYm4wTVNKUU5tR1lnJTNEJkV4cGlyZXM9\nMTQ2OTE3NDE2MCZLU1NBY2Nlc3NLZXlJZD1xaDBoOVRkY0VNcm0xVmxSMmFkLw==\n", "vwidth": 450, "backup_url_1": "aHR0cDovL3Y3LnBzdGF0cC5jb20vNjFhYTJlN2RlN2YxZTgzNGJiNjg3ZDZmMDZjZGFmNzMvNTc5\nMWMzODAvdmlkZW8vYy9iODgwZmI1YzM1NjE0NzJlOThlNGU0Y2U5N2MyYzg5ZS8=\n", "bitrate": 0, "vheight": 360, "size": 0 } } }}
看看JSON内容,可以看到共有3种清晰度视频,分别是超清、高清和标清。definition表示清晰度,main_url应该就是视频真实地址了。main_url的值看起来就是base64编码后的结果,用base64解码main_url,得到的就是视频真实地址。
import base64main_url = "aHR0cDovL3Y3LnBzdGF0cC5jb20vZmJiZmE2Yjc4ZjM4MThhM2M0OTVhMmRkYjAyOWY5NTAvNTc5\nMWMzODAvdmlkZW8vYy8zNDMwNzcxZjMyNmY0ZDUxOTRiNTYyMzdhNmEyMzFmYy8=\n"base64.standard_b64decode(main_url) # output: http://v7.pstatp.com/fbbfa6b78f3818a3c495a2ddb029f950/5791c380/video/c/3430771f326f4d5194b56237a6a231fc/
那么接下来的问题就是探究上面的第2个请求http://i.snssdk.com/video/urls/v/1/toutiao/mp4/9583cca5fceb4c6b9ca749c214fd1f90?r=18723666135963302&s=3807690062&callback=tt_playerzfndr 是如何构造的。
在用Chrome的开发者工具监视网络请求的时候可以看到该请求是js脚本发出的,该js脚本是 http://s3.pstatp.com/tt_player/player/tt2-player.js?r=customer1
把该js下载下来,prettify一下,使用你最爱的编辑器看看该js到底做了些什么。
通过研究该js脚本,发现请求http://i.snssdk.com/video/urls/v/1/toutiao/mp4/9583cca5fceb4c6b9ca749c214fd1f90?r=18723666135963302&s=3807690062&callback=tt_playerzfndr 中的一些参数的含义如下:
- 9583cca5fceb4c6b9ca749c214fd1f90:这是视频的唯一ID
- 18723666135963302:这是一个随机数
- 3807690062:这是CRC32校验值无符号右移0位
视频的唯一ID可以在播放页HTML源码中找到,即id为video的元素的tt-videoid属性值。
import requestsfrom pyquery import PyQuery as pqr = requests.get('http://www.toutiao.com/a6296462662335201793/')d = pq(r.content)vid = d('#video').attr('tt-videoid')
参数r的构造如下:
import randomr = str(random.random())[2:]
参数s的构造如下:
import urlparsedef right_shift(val, n): return val >> n if val >= 0 else (val + 0x100000000) >> nurl = 'http://i.snssdk.com/video/urls/v/1/toutiao/mp4/%s' % vidn = urlparse.urlparse(url).path + '?r=' + rc = binascii.crc32(n)s = right_shift(c, 0)
参数callback就不管了吧。到此,获取JSON内容就简单了:
r = requests.get(url + '?r=%s&s=%s' % (r, s))print r.json()
- 今日头条的视频地址解析方法
- 今日头条的视频地址解析方法
- 今日头条视频采集方法
- 今日头条视频地址提取 谷歌插件
- 获取今日头条西瓜视频下载地址
- 超级简单的下载今日头条和西瓜视频的方法
- 一个高仿今日头条的视频播放器
- 今日头条发布视频重复问题解决的办法
- 仿今日头条视频显示效果
- 仿今日头条视频播放JieCaoVideoPlayer
- 如何下载今日头条视频
- 仿今日头条视频播放JieCaoVideoPlayer
- 仿今日头条视频播放JieCaoVideoPlayer
- 今日头条的首页
- 我们分析了10000条视频,终于知道了今日头条推荐系统的秘密
- IJKPlayer的封装视频播放器封装,Swift编写。仿今日头条视频播放器。
- Android 仿今日头条的视频播放控件(几行代码快速实现)
- Android 仿今日头条的视频播放控件(几行代码快速实现)
- Server.xml配置图片路径
- python platform模块获取系统信息
- java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/
- 关于maven项目报错,但是找不到问题的所在的一个解决办法
- 读书笔记第一章第三节1.3MySQL表存储引擎
- 今日头条的视频地址解析方法
- Java回调函数详解
- Cannot forward after response has been committed问题解决及分析
- 多线程_几种定时器的写法
- 编程修养(二)
- 文章标题
- 扩展欧几里得算法求乘法逆元
- 微信小程序开发干货
- Java线程 锁对象Lock-同步问题比sychronized更完美的处理方式