同样,我们使用浏览器的开发者工具观察页面视频加载过程中出现了哪些值得关注的网络请求,然后分析这些请求之间的关联关系。
{
"errno": 0,
"error": "ok",
"result": {
"discuss": {
"unikey": "cIPmaWPqUBT5TC"
},
"share": {
"title": "歼20亮相珠海航展",
"url":
"desc": "歼20亮相珠海航展",
"pic":
},
"midbar": {
"h5":
"playNumber": "22.4万",
"date": "2016-11-01"
},
"topbar": {
"title": "歼20亮相珠海航展",
"type": [
"歼20",
"亮相"
],
"bread": [
{
"text": "360影视",
"url":
},
"现场"
]
},
"video": {
"recommend": [
{
"title": "网爆何炅小腿骨折受伤入院",
"cover":
"url":
},
{
"title": "相恋结婚9年 丈夫竟然变妻子?",
"cover":
"url":
},
{
"title": "反转!曝马蓉将告宋喆强奸",
"cover":
"url":
},
{
"title": "爆笑!盘点那些奇葩的开门方式",
"cover":
"url":
},
{
"title": "网曝两女子和狗围攻老人 老人被打倒在地猛踹",
"cover":
"url":
"date": "2016110101"
},
{
"title": "印度村庄现神秘“笑脸蛇”",
"cover":
"url":
}
],
"relate": [
{
"title": "歼20亮相珠海航展",
"id": "cIPmaWPqUBT5TC",
"cover":
"url":
"duration": "00:42",
"playNum": "22.4万"
},
{
"title": "男女偷情被抓双双遭暴打 女子衣服惨被扒光",
"id": "c4TocmPoShX7TC",
"cover":
"url":
"duration": "02:12",
"playNum": "3.2万"
},
{
"title": "实拍小偷行窃当街被抓 上演“铁头功”连撞公交站台",
"id": "cIfqcWLrThD1TS",
"cover":
"url":
"duration": "02:55",
"playNum": "15.2万"
},
{
"title": "实拍奇葩男子冒雨碰瓷 先敬个礼再摔倒",
"id": "corjaWPqUBL4TC",
"cover":
"url":
"duration": "01:32",
"playNum": "5.4万"
},
{
"title": "实拍生产化机器杀猪过程 批量从活猪到猪肉让屠夫都看傻眼了",
"id": "b4XlbWPqUBn3SS",
"cover":
"url":
"duration": "04:55",
"playNum": "4.6万"
},
{
"title": "贵圈真乱!游戏嫩模自曝拍完照与摄影师发生关系",
"id": "cYLrbmPqURf6UC",
"cover":
"url":
"duration": "00:58",
"playNum": 1991
},
{
"title": "太魔性了!来自妈妈的爱 劝你穿秋裤时操老心了",
"id": "b4Xna2PqURf6US",
"cover":
"url":
"duration": "00:48",
"playNum": 1408
},
{
"title": "外围女花巨资整容陪吸毒月入80万 00后最吃香",
"id": "c4Lla2PqURf7Sy",
"cover":
"url":
"duration": "01:26",
"playNum": 1540
},
{
"title": "男子带瓶眼镜蛇坐火车 安检喊你喝一口",
"id": "bofmcWPqURf7TC",
"cover":
"url":
"duration": "00:58",
"playNum": 1367
},
{
"title": "3D还原重庆煤矿瓦斯爆炸“气流扑来像龙卷风”",
"id": "dofmamPqURj0TS",
"cover":
"url":
"duration": "02:15",
"playNum": 860
},
{
"title": "毛骨悚然!实拍成群浣熊伸手寻找食物 上演现实版鬼片",
"id": "cYTpamPqURj2SS",
"cover":
"url":
"duration": "01:11",
"playNum": 1342
},
{
"title": "这不是电影!罕见纪实影像揭秘二战战场残酷历史瞬间",
"id": "cYTlcmPqURj6UC",
"cover":
"url":
"duration": "03:26",
"playNum": 646
},
{
"title": "2016马云现场对话李连杰和马化腾,全场笑声一波接一波!",
"id": "b4bmaWPqURj7UC",
"cover":
"url":
"duration": "17:32",
"playNum": 1400
},
{
"title": "皮条客揭外围圈内幕:花巨资整容 00后最吃香",
"id": "doXobGPqURn0SC",
"cover":
"url":
"duration": "02:08",
"playNum": "3.1万"
},
{
"title": "圆状UFO飞进日本村庄 被公路上的监控拍了下来\n",
"id": "boPkcWPrSBD4SC",
"cover":
"url":
"duration": "02:42",
"playNum": 771
},
{
"title": "萌cry!馋嘴的小贝壳 偷偷伸出舌头偷盐吃",
"id": "cYLmaWPrSBD4SS",
"cover":
"url":
"duration": "00:38",
"playNum": 280
},
{
"title": "姐弟俩为争房产 互向对方租客泼屎尿",
"id": "c4Tsa2PrSBD4Sy",
"cover":
"url":
"duration": "01:34",
"playNum": 626
},
{
"title": "贵圈真乱!游戏嫩模自曝拍完照与摄影师发生关系",
"id": "c4TjbGPrSBD6UC",
"cover":
"url":
"duration": "01:02",
"playNum": "2.8万"
},
{
"title": "惊心动魄!夫妻酒店泳池嬉戏遭鳄鱼闯入袭击 丈夫第一时间逃离",
"id": "dYTmaWPrSBL5US",
"cover":
"url":
"duration": "01:10",
"playNum": 110
},
{
"title": "罗马尼亚老师掌掴5岁学童 夸张画面让人不忍直视",
"id": "doblbGPrSBL6Si",
"cover":
"url":
"duration": "01:14",
"playNum": 576
}
]
},
"guess": [
{
"title": "男子微信摇来女网友 不想对方竟是男儿身",
"id": "dYjqb2PqURf7SS",
"cover":
"url":
"duration": "00:40",
"playNum": 976
},
{
"title": "外围女花巨资整容陪吸毒月入80万 00后最吃香",
"id": "c4Lla2PqURf7Sy",
"cover":
"url":
"duration": "01:26",
"playNum": 1540
},
{
"title": "男子带瓶眼镜蛇坐火车 安检喊你喝一口",
"id": "bofmcWPqURf7TC",
"cover":
"url":
"duration": "00:58",
"playNum": 1367
},
{
"title": "这不是电影!罕见纪实影像揭秘二战战场残酷历史瞬间",
"id": "cYTlcmPqURj6UC",
"cover":
"url":
"duration": "03:26",
"playNum": 646
},
{
"title": "2016马云现场对话李连杰和马化腾,全场笑声一波接一波!",
"id": "b4bmaWPqURj7UC",
"cover":
"url":
"duration": "17:32",
"playNum": 1400
},
{
"title": "圆状UFO飞进日本村庄 被公路上的监控拍了下来\n",
"id": "boPkcWPrSBD4SC",
"cover":
"url":
"duration": "02:42",
"playNum": 771
},
{
"title": "少女晚上跟爸爸哥哥同住一屋 竟发生了可怕的事",
"id": "bYbmb2PrSBD4Si",
"cover":
"url":
"duration": "04:37",
"playNum": 1358
},
{
"title": "实拍丰田违停4男子猛砸宝马车 宝马车气不过连续猛撞丰田",
"id": "dYjmaWPrSBD6Ty",
"cover":
"url":
"duration": "02:02",
"playNum": 2540
},
{
"title": "惊心动魄!夫妻酒店泳池嬉戏遭鳄鱼闯入袭击 丈夫第一时间逃离",
"id": "dYTmaWPrSBL5US",
"cover":
"url":
"duration": "01:10",
"playNum": 110
},
{
"title": "实拍恩施一奇葩男子冒雨碰瓷有礼貌 先敬个礼再摔倒",
"id": "cYrnbWPrSBL6TS",
"cover":
"url":
"duration": "01:35",
"playNum": 985
}
],
"todayHot": [
{
"title": "张雨绮称老公未婚",
"desc": "但有人却晒了他的结婚照",
"cover":
"url":
},
{
"title": "印度村庄现神秘“笑脸蛇”",
"cover":
"url":
},
{
"title": "贾静雯全家过万圣节",
"desc": "咘咘梧桐妹大眼软萌",
"cover":
"url":
},
{
"title": "心疼!何炅急送医院手术 疑因金属异物插入小腿",
"desc": "何炅意外被异物扎伤 不愿轻易下火线 被赞中国好主持!",
"cover":
"url":
},
{
"title": "董明珠因进门没掌声怒骂股东",
"cover":
"url":
},
{
"title": "萌娃扮无脸男酷到没朋友 网友:妈妈下手太重了",
"cover":
"url":
"date": "2016103104"
},
{
"title": "杨幂嗲音被批恶心",
"desc": "回应:严重鼻炎",
"cover":
"url":
},
{
"title": "土豪怒甩50万现金砸碎店里iPhone",
"cover":
"url":
},
{
"title": "惨!实拍公路桥被车重压垮塌",
"cover":
"url":
},
{
"title": "新买iPhone7相册存陌生人照片",
"cover":
"url":
},
{
"title": "20岁林允曝性感照",
"desc": "晒美胸美背好诱人",
"cover":
"url":
},
{
"title": "摩的司机占道不听劝亮刀打交警",
"cover":
"url":
},
{
"title": "爆笑!盘点那些奇葩的开门方式",
"cover":
"url":
},
{
"title": "奇葩男子冒雨碰瓷 先敬礼再摔倒",
"cover":
"url":
},
{
"title": "网曝两女子和狗围攻老人 老人被打倒在地猛踹",
"cover":
"url":
"date": "2016110101"
},
{
"title": "相恋结婚9年 丈夫竟然变妻子?",
"cover":
"url":
}
],
"wemedia": {
"wmid": "c4LiQHkwQWn58g",
"wm_url":
"name": "车祸实拍",
"head_img":
"video_count": "2",
"fans_count": "12",
"upload_time": "2016-10-28 19:25",
"desc": "歼20亮相珠海航展",
"tags": [
"歼20",
"亮相"
],
"judgeAttention": -1
},
"log": {
"vid": 678474,
"catid": "1700",
"sub_catid": null
}
}
}
该接口请求中的id参数值可以从播放页地址中提取得到。从返回的JSON数据中,我们发现相关视频(result/video/relate)列表中的第一项就是要找的视频信息。其中的id正好是播放页地址中的id,url就是接下来要请求的东西。
{
"errno": 0,
"error": "ok",
"result": {
"vid": "1b190d3186c3d889102d9eebcd2274e1",
"site": "360shipin",
"duration": 42,
"title": "682804",
"pic":
"currqua": {
"key": "xd",
"value": "超清"
},
"quality": [
{
"key": "xd",
"value": "超清"
},
{
"key": "hd",
"value": "高清"
},
{
"key": "sd",
"value": "标清"
}
],
"vrtype": {
"key": 0,
"value": "普通视频"
},
"drmtype": "non",
"stype": "m3u8",
"usep2p": 0,
"sid": "fanqie_web",
"videos": [
{
"duration": 42,
"url":
}
]
}
}
从这串JSON数据可以推知,currqua是当前清晰度的意思,quality列表表示该视频有哪些清晰度。重点在于videos列表中的url,请求该地址,得到的是一个m3u8文件内容:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-ALLOW-CACHE:YES
#EXT-X-QIHU-RUID:900b2f1b2d2f99a16353e5d4abda38d6
#EXT-X-TARGETDURATION:10
#EXT-X-QIHU-SZ:1639736
#EXTINF:8.166,
#EXT-X-QIHU-SZ:1143792
#EXTINF:6.250,
#EXT-X-QIHU-SZ:882284
#EXTINF:6.250,
#EXT-X-QIHU-SZ:1175564
#EXTINF:6.250,
#EXT-X-QIHU-SZ:962560
#EXTINF:6.250,
#EXT-X-QIHU-SZ:861980
#EXTINF:4.750,
#EXT-X-QIHU-SZ:521136
#EXTINF:4.000,
#EXT-X-ENDLIST
从m3u8文件中提取出各个视频分段的地址,分别下载完成后合并成完整视频即可。
Python代码示例
import re
import requests
import json
url =
vid = re.search('/(\w+).html', url).group(1)
r = % vid)
data = json.loads(r.content)
relate_videos = data['result']['video']['relate']
for v in relate_videos:
if v['id'] == vid:
r = requests.get(v['url'])
data = json.loads(r.content)
m3u8_url = data['result']['videos'][0]['url']
r = requests.get(m3u8_url)
segments = re.findall(r'^[^#][^\r][^\n]*', r.content, re.MULTILINE)
for seg in segments:
print seg
break