由于业务需要,需要抓取解析腾讯视频真实地址、文章中的数据。经过1天的摸索,终于分析出来了,步骤如下:
一、获取发送Https请求文章地址返回的信息,经查看<html><body><div>中无任何文章信息,到这个地方可以确定,腾讯新闻文章是浏览器客户端进行解析数据装配的。此时就需要看js代码,发现里面的数据有unicode编码格式。需要把代码unicode转译一下,我这里使用java语言apache-common-lang包方法转码,信息中有用的就是<script>的window.__initData数据
可以看到content内容是我们所需要的。进而转化为json格式,获取有用数据,java代码如下:
// 示例信息
String returnHtml = "<script>window.__initData = {\"content\": {\"title\": \"河南焦作幼师*屏蔽的关键字*致23名幼儿*屏蔽的关键字*:知情人称因两老师闹矛盾\"}}......</script>";
// 获取可解析的json字符串数据
String str = jsStr.substring(jsStr.indexOf("<script>window.__initData =") + "<script>window.__initData =".length(), jsStr.indexOf(";</script>"));
// unicode转码
str = StringEscapeUtils.unescapeJava(str);
// 部分字符替换转义,防止json解析报错
str = str.replaceAll("\"\\{", "\\{").replaceAll("\\}\"", "\\}");
// 转化为JSON对象处理
JSONObject jsonObject = JSON.parseObject(str);
// 获取所有内容
JSONObject jsonContent = jsonObject.getJSONObject("content");
解析后的json主要数据如下:
{
"content": {
"cnt_attr": {
"IMG_0": {
"img": {
"imgurl0": {
"imgurl": "http://inews.gtimg.com/newsapp_match/0/8386465468/0"
}
}
},
"IMG_1": {
"img": {
"imgurl0": {
"imgurl": "http://inews.gtimg.com/newsapp_match/0/8391248870/0"
}
}
},
"VIDEO_0": {
"img": {
"imgurl1000": {
"imgurl": "http://inews.gtimg.com/newsapp_ls/0/8386704268_640480/0"
}
},
"vid": "s0856no20s6"
}
},
"cnt_html": "<P>焦作市解放区区委相关部门了解到,事发系幼儿园一名教师向当日中班的食物中投入亚硝酸盐,目前,该教师已被警方刑拘。</P>",
"desc": "焦作市解放区区委相关部门了解到,事发系幼儿园一名教师向当日中班的食物中投入亚硝酸盐",
"image_count": 2,
"longtitle": "河南焦作幼师*屏蔽的关键字*致23名幼儿*屏蔽的关键字*:知情人称因两老师闹矛盾",
"pub_time": "2019-04-02 08:19:27",
"pubtime": "2019-04-02",
"source": "新京报",
"title": "河南焦作幼师*屏蔽的关键字*致23名幼儿*屏蔽的关键字*:知情人称因两老师闹矛盾"
}
}
通过数据可以获取到文章的相关信息
这里重点说一下视频解析的相关步骤:
二、获取视频关键参数vid
1、如果是纯视频网站,例如:https://view.inews.qq.com/a/20190311V0HAK600?uid=&cur_vid=s084748qz5b
根据cur_vid的值获取vid
2、如果是文章中嵌入视频:则通过前面获取到的json数据 获取到VIDEO_0中的vid
三、通过vid获取到视频的真实路径地址
发起一个http get请求 地址:http://vv.video.qq.com/getinfo?platform=101001&charge=0&otype=json&defn=shd&vids=vid值
返回信息做一下处理,转化成json格式,主要json格式数据如下:
{
"vl": {
"vi": [
{
"fn": "s0856no20s6.mp4",
"fvkey": "4112E6BB6363A83937E2E5829C6565DDB5839AFF0653754DEFA66AE8780765559E69EEBE139DB246CA80D1F5EAAA0BB8FE6EFCFDAB2C1BB22B64E9BEF9F59CA17D3DBDC068BC23FAD136251E8A7D6C01313E9BA16027D0C661334F7A7DB7934172D535D1AE1486F5",
"ti": "焦作一幼儿园老师投毒致23名幼儿中毒 知情人称因两老师闹矛盾",
"ul": {
"ui": [
{
"url": "http://14.215.93.155/om.tc.qq.com/AgATFdfgDgaHAbqs7mZP-J39GAhMgjQvFUS1dcILxHok/uwMROfz0r5zEYaQXGdGnC2dfDmYZuJ2pY2FAhIKRx44JHPsG/"
},
{
"url": "http://ugcws.video.gtimg.com/uwMROfz0r5zEYaQXGdGnCmdfDmaF5AooPRaJaJ0-CXKTz0g7/"
}
]
}
}
]
}
}
这里需要三个值: fn值,fvkey值,url值(取一个)
四、组装视频真实地址
最终视频地址就是 url+fn+"?"+fvkey=fvkey值
这里是拼接后的地址:
http://ugcws.video.gtimg.com/uwMROfz0r5zEYaQXGdGnCmdfDmaF5AooPRaJaJ0-CXKTz0g7/s0856no20s6.mp4?vkey=4112E6BB6363A83937E2E5829C6565DDB5839AFF0653754DEFA66AE8780765559E69EEBE139DB246CA80D1F5EAAA0BB8FE6EFCFDAB2C1BB22B64E9BEF9F59CA17D3DBDC068BC23FAD136251E8A7D6C01313E9BA16027D0C661334F7A7DB7934172D535D1AE1486F5
直接访问就可以获取到真实的视频地址,也可以直接保存成对应格式文件