受妹子之托,需要抓取b站的视频的弹幕,目前还不知道反爬虫的程度.
所以一切先一功能为主.
首先就是随意打开哔哩哔哩的一个视频,然后在右侧可以看到弹幕列表,恩,找到类名,=叫啥啥来着
然后放到类选择器上,恩
果然抓不到,意料之中使用异步加载的.
然后打开网络监控,b站的异步请求是真的多,但是我们可以通过大小来排序,快速找到我们需要的异步请求.
emmmmm
经过了一番寻找之后.
我们发现b站的一个api的请求的数据很可疑.
当时我在网上查了一下,但是b站的接口改了,所以需要重新找,这里有一个问题,就是chrome的问题.
这里可以看到,这个很可疑的东西预览上是没有的,所以我又换成了火狐,然后看到了里面的内容
不过是没有换行的,我们可以复制一下地址,然后放到浏览器里看,
然后打开之后就可以看到了,这个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
『大家大家合在一起就是百人大家族』
『团子老爷爷慈祥地眯着眼睛』
哇我好想哭!!!
『相亲相爱的团子手牵手围成一个大大的圆圈』
洋啊洋啊啊啊,洋崽啊!!!^q^
『在团子星球上建起家园大家相视会心微笑』
『天上圆圆的月亮里小兔子在朝着我们挥手』
哇爆哭,师姐姐夫要好好的啊!!
夫人好漂亮!!!
每天一刷
『一切开心的伤心的事情全部包起来』
『相亲相爱的团子手牵手围成一个大大的圆圈』
啊啊啊啊啊啊啊啊啊啊啊啊啊好可爱!!!都是些什么绝世大宝贝啊!看得我好想哭
啊啊啊小时候好可爱
姐夫!
『天上圆圆的月亮里小兔子在朝着我们挥』
『在团子星球上建起家园大家相视会心微笑』
『一切开心的伤心的事情全部包起来』
『lalalala...』
『lalalala...』
『团子团子团子团子』
哭了哇嘤嘤嘤
『团子团子大家族』
『团子团子团子团子』
『团子团子大家族』
提取数据的话很简单,只要得到这个d标签就可以了.
https://api.bilibili.com/x/v1/dm/list.so?oid=56618920
然后我们需要知道这个参数 oid=56618920是咋来的.
然后对着av的原网页一通搜索,
emmm,结果也没有找到很好发现的地方,不过他还通过这个接口得到了一下这个av的数据.
不过其实没有什么关系,这个cid就是我们需要的oid.
然后接着找,除去推荐里面的一些别的cid,我们在一个分享模块里面可以找到一个唯一的oid…
虽然不知道他们的js代码是咋得到的,啊
是通过得到一个列表里面的第一个,不过那样不适合我们正则匹配,
所以最后我还是选择了分享那里有一个地址,然后正则匹配
" class="icon share-icon qq bili-share">qqbaidu
将视频贴到博客或论坛
微信扫一扫分享
这个神奇的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好像也自带一个请求的方法,我还没有用过,这次正好尝试一下,应该比自己写的好用的多.
额然后简单的尝试之后发现并不好用.
…