之前做浏览器插件的时候,发现有部分网站视频链接下载提取不了,有很多都是像m3u8这种分开来下一段一段.ts的,这种也还好解决,只是不想把单纯的下载链接提取插件复杂化,也就没有后续展开。
之后不记得怎么的就扯到B站的视频上,初步看下来分成了很多.m4s文件(有部分不是),对这个不是很了解。
看了下浏览器后台,http headers一直在变,尝试合并后也并不能播放,初步判断下载M4S文件并合并转码为MP4要花很多功夫,先试试看其它办法,这个以后有时间再试着弄。
先来说一下我的解决思路,算是马克一下,以后再遇到问题看看能不能找些灵感。
思路
在PC端尝试遇到阻力,一系列的m4s片段的获取和合并解析有点麻烦(关键是不知道请求down下来的东西是不是有效的)。
现在,换个思路,尝试在移动端Web试一试。(还有试试app接口也是一种备用方案)
可以看见这部分可以直接提取出mp4视频链接。如果不考虑视频清晰度的话,那么任务可以算是完成了。
代码实现
重点在构造浏览器Header :User-Agent。如果考虑到爬虫不支持js,可以构造移动端访问链接直接访问。
例如 头部:
Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Mobile Safari/537.36
例如 链接: https://m.bilibili.com/video/av52738.html
关键代码如下:
//访问链接设置
String url = String.format("https://m.bilibili.com/video/%s.html", avId);
/**
* 该Header配置用于移动端视频下载/网页访问
*/
public HashMap<String, String> getBiliMHeaders() {
headerMap.put("Accept",
"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
headerMap.put("Accept-Encoding", "gzip, deflate, sdch, br");
headerMap.put("Accept-Language", "zh-CN,zh;q=0.8");
headerMap.put("Connection", "keep-alive");
headerMap.put("Cache-Control", "max-age=0");
headerMap.put("Host", "m.bilibili.com");
headerMap.put("User-Agent",
"Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Mobile Safari/537.36");
return headerMap;
}