抓取bilibili的弹幕

受妹子之托,需要抓取b站的视频的弹幕,目前还不知道反爬虫的程度.

所以一切先一功能为主.

首先就是随意打开哔哩哔哩的一个视频,然后在右侧可以看到弹幕列表,恩,找到类名,=叫啥啥来着

然后放到类选择器上,恩

果然抓不到,意料之中使用异步加载的.

然后打开网络监控,b站的异步请求是真的多,但是我们可以通过大小来排序,快速找到我们需要的异步请求.

emmmmm

经过了一番寻找之后.

我们发现b站的一个api的请求的数据很可疑.

当时我在网上查了一下,但是b站的接口改了,所以需要重新找,这里有一个问题,就是chrome的问题.

抓取bilibili的弹幕_第1张图片

这里可以看到,这个很可疑的东西预览上是没有的,所以我又换成了火狐,然后看到了里面的内容

如下:
抓取bilibili的弹幕_第2张图片

不过是没有换行的,我们可以复制一下地址,然后放到浏览器里看,

然后打开之后就可以看到了,这个list的接口就是av视频的弹幕文件

啊是xml格式utf8编码的.

This XML file does not appear to have any style information associated with it. The document tree is shown below.

chat.bilibili.com
56618920
0
1000
0
0
k-v
『大家大家合在一起就是百人大家族』
『团子老爷爷慈祥地眯着眼睛』
哇我好想哭!!!
『相亲相爱的团子手牵手围成一个大大的圆圈』
洋啊洋啊啊啊,洋崽啊!!!^q^
『在团子星球上建起家园大家相视会心微笑』
『天上圆圆的月亮里小兔子在朝着我们挥手』
哇爆哭,师姐姐夫要好好的啊!!
夫人好漂亮!!!
每天一刷
『一切开心的伤心的事情全部包起来』
『相亲相爱的团子手牵手围成一个大大的圆圈』
啊啊啊啊啊啊啊啊啊啊啊啊啊好可爱!!!都是些什么绝世大宝贝啊!看得我好想哭
啊啊啊小时候好可爱
姐夫!
『天上圆圆的月亮里小兔子在朝着我们挥』
『在团子星球上建起家园大家相视会心微笑』
『一切开心的伤心的事情全部包起来』
『lalalala...』
『lalalala...』
『团子团子团子团子』
哭了哇嘤嘤嘤
『团子团子大家族』
『团子团子团子团子』
『团子团子大家族』

提取数据的话很简单,只要得到这个d标签就可以了.

https://api.bilibili.com/x/v1/dm/list.so?oid=56618920
然后我们需要知道这个参数 oid=56618920是咋来的.

然后对着av的原网页一通搜索,

emmm,结果也没有找到很好发现的地方,不过他还通过这个接口得到了一下这个av的数据.

抓取bilibili的弹幕_第3张图片

不过其实没有什么关系,这个cid就是我们需要的oid.

然后接着找,除去推荐里面的一些别的cid,我们在一个分享模块里面可以找到一个唯一的oid…

虽然不知道他们的js代码是咋得到的,啊
是通过得到一个列表里面的第一个,不过那样不适合我们正则匹配,

所以最后我还是选择了分享那里有一个地址,然后正则匹配

" class="icon share-icon qq bili-share">qq
收藏0

这个神奇的Content-Encoding就被我发现了

额这个deflate百度了一下之后,知道了是一个中压缩格式,另外还有gzip,

这两种方法都是需要单独处理的,不过gzip好像和这个还不大一样

然后我们处理一下这个问题

需要取出回复头里面的这个属性,然后根据对应的类型使用相应的编码的inputStream

String encoding = con.getContentEncoding();
            if (encoding != null && encoding.contains("gzip")) {//首先判断服务器返回的数据是否支持gzip压缩,                
                ins = new GZIPInputStream(con.getInputStream());
            }
            if (encoding != null && encoding.contains("deflate")) {
                ins = new DeflateInputStream(con.getInputStream());
            }

这个地方都有支持的相应的类,还是比较方便的,然后编码正确了之后,输出!

啊这次的数据就没有问题,然后使用jsoup转换一下,直接得到d标签的text就行.

说道jsoup,jsoup好像也自带一个请求的方法,我还没有用过,这次正好尝试一下,应该比自己写的好用的多.

额然后简单的尝试之后发现并不好用.

你可能感兴趣的:(java)