NiceLeeのBlog 用爱发电 bilibili~

Java 爬虫练习-bilibili视频下载 (一)

2019-01-22
nIceLee

阅读:


之前做浏览器插件的时候,发现有部分网站视频链接下载提取不了,有很多都是像m3u8这种分开来下一段一段.ts的,这种也还好解决,只是不想把单纯的下载链接提取插件复杂化,也就没有后续展开。
之后不记得怎么的就扯到B站的视频上,初步看下来分成了很多.m4s文件(有部分不是),对这个不是很了解。
看了下浏览器后台,http headers一直在变,尝试合并后也并不能播放,初步判断下载M4S文件并合并转码为MP4要花很多功夫,先试试看其它办法,这个以后有时间再试着弄。
先来说一下我的解决思路,算是马克一下,以后再遇到问题看看能不能找些灵感。

思路

在PC端尝试遇到阻力,一系列的m4s片段的获取和合并解析有点麻烦(关键是不知道请求down下来的东西是不是有效的)。
sources/archive/2019/01/m4s.png
现在,换个思路,尝试在移动端Web试一试。(还有试试app接口也是一种备用方案)
sources/archive/2019/01/mobile-web-bili.png
可以看见这部分可以直接提取出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;
}

源代码


内容
隐藏