继上篇的图片篇(http://blog.csdn.net/suqi356/article/details/78579167)和文字篇(http://blog.csdn.net/suqi356/article/details/78547137)后,我们今天来讲讲视频,这里主要是对视频的地址抓包为主,其次利用jsoup获取地址,然后利用JAVA的IO技术来下载处理视频就可以了。
这里使用的Fiddler,这个在第二讲的图片篇里介绍过,这里还是继续拿CSDN微信公众号推荐的那篇python 3简单入门爬虫(http://mp.weixin.qq.com/s/lGenb6F-r8YyoE2ZO0cVSw)里的视频来讲一下Fiddler。
爱奇艺的VIP视频只有会员能看,普通用户只能看前6分钟。比如加勒比海盗5的URL:http://www.iqiyi.com/v_19rr7qhfg0.html#vfrm=19-9-0-1
http://api.xfsub.com/index.php?url=[播放地址或视频id]
比如
http://api.xfsub.com/index.php?url=http://www.iqiyi.com/v_19rr7qhfg0.html#vfrm=19-9-0-1
我们现在用Fidder来抓包处理:
先访问你需要的解析地址,然后利用Fidder同步抓包
我们可以看到,有用的请求并不多,我们逐条分析。看到一个POST的请求里面有个字段比较怪。
这个POST请求有四个参数,分别为time、key、url、type。记住这个有用的信息,我们在抓包结果中,找一下这个请求,看看这个POST请求做了什么。
很显然,这个就是我们要找的POST请求,我们可以看到POST请求的参数以及返回的json格式的数据。其中url存放的参数如下
xfsub_api\/url.php?key=b84da86e6fff5deedf866c4cbd632eb4&time=1510818645&url=http%3A%2F%2Fwww.iqiyi.com%2Fv_19rr7qhfg0.html&type=iqiyi&xml=1
http://api.xfsub.com/xfsub_api/url.php?key=b84da86e6fff5deedf866c4cbd632eb4&time=1510818645&url=http://www.iqiyi.com/v_19rr7qhfg0.html&type=&xml=1
有个video下的file标签里有个地址,那我们在看看这个地址是不是影片存放的真实地址呢?拿出来在访问一下。
发现果真如此,那么这个地址就是真实地址了,我们既然已经分析到真实地址了,那我们的代码就好写了,我们的IO下载也方便了。
附一个简单的代码:
public static void get_html(String headurl , String url) {
String urls = headurl+url;
Map map = new HashMap();
try {
Document doc = Jsoup.connect(urls)
.userAgent("Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; MALC)")
.timeout(999999999)
.header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
.header("Accept-Encoding", "gzip, deflate")
.header("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3")
.header("Connection", "keep-alive")
.header("Host", "www.xfsub.com")
.header("Referer", "http://api.xfsub.com/")
//是忽略请求类型
.ignoreContentType(true)
.get();
Elements elements = doc.getElementsByTag("script").eq(5);
for (Element element : elements) {
String[] data = element.data().toString().split("function");
for (String variable : data) {
if (variable.contains("url.php")) {
String[] variables = variable.toString().split("hp\",");
for (String str : variables) {
if (str.contains("time") || str.contains("key")) {
String strs = str.substring(2, str.length()-8);
String[] kvp = strs.split(",");
for(String value: kvp){
String[] values = value.split("\"");
map.put(values[1].trim(), values[3].trim());
}
}
}
}
}
}
String openUrl =
"http://api.xfsub.com/xfsub_api/url.php?key="+map.get("key")+"&time="+map.get("time")+"&url="+url+"&type=&xml=1";
Document docs = Jsoup.connect(openUrl)
.userAgent("Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; MALC)")
.timeout(999999999)
.header("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
.header("Accept-Encoding", "gzip, deflate")
.header("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3")
.header("Connection", "keep-alive")
.header("Host", "www.xfsub.com")
.header("Referer", urls)
//是忽略请求类型
.ignoreContentType(true)
.get();
System.out.println(docs);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
String headurl = "http://api.xfsub.com/xfsub_api/?url=";
String url="http://www.iqiyi.com/v_19rr7qhfg0.html#vfrm=19-9-0-1";
get_html(headurl , url);
}