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

所以一切先一功能为主.

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

然后放到类选择器上,恩

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

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

emmmmm

经过了一番寻找之后.

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

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

抓取bilibili的弹幕

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

如下:
抓取bilibili的弹幕

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

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

啊是xml格式utf8编码的.

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<i>
<chatserver>chat.bilibili.com</chatserver>
<chatid>56618920</chatid>
<mission>0</mission>
<maxlimit>1000</maxlimit>
<state>0</state>
<real_name>0</real_name>
<source>k-v</source>
<d p="49.09100,4,18,41194,1537772707,0,8ac75c7c,5573460821016580">『大家大家合在一起就是百人大家族』</d>
<d p="67.94600,4,18,41194,1537772790,0,8ac75c7c,5573503935840256">『团子老爷爷慈祥地眯着眼睛』</d>
<d p="202.73900,1,25,16777215,1537772817,0,dd97bcb9,5573518065401856">哇我好想哭!!!</d>
<d p="77.12200,4,18,41194,1537772821,0,8ac75c7c,5573520512253956">『相亲相爱的团子手牵手围成一个大大的圆圈』</d>
<d p="230.12200,1,25,16777215,1537772862,0,b614783,5573542035849220">洋啊洋啊啊啊,洋崽啊!!!^q^</d>
<d p="85.57200,4,18,41194,1537772865,0,8ac75c7c,5573543498088448">『在团子星球上建起家园大家相视会心微笑』</d>
<d p="96.25400,4,18,41194,1537772896,0,8ac75c7c,5573559730569216">『天上圆圆的月亮里小兔子在朝着我们挥手』</d>
<d p="191.94700,1,25,16777215,1537772845,0,dd97bcb9,5573533218897920">哇爆哭,师姐姐夫要好好的啊!!</d>
<d p="32.48400,1,25,41194,1537772960,0,dd97bcb9,5573593158647808">夫人好漂亮!!!</d>
<d p="2.07000,1,25,15138834,1537772918,0,dd97bcb9,5573571502931968">每天一刷</d>
<d p="105.01900,4,18,41194,1537772919,0,8ac75c7c,5573571646062596">『一切开心的伤心的事情全部包起来』</d>
<d p="157.98000,4,18,41194,1537773008,0,8ac75c7c,5573618431426560">『相亲相爱的团子手牵手围成一个大大的圆圈』</d>
<d p="253.39400,1,25,15138834,1537773017,0,f23c8843,5573623278469120">啊啊啊啊啊啊啊啊啊啊啊啊啊好可爱!!!都是些什么绝世大宝贝啊!看得我好想哭</d>
<d p="124.73900,4,18,41194,1537772967,0,8ac75c7c,5573596847538176">啊啊啊小时候好可爱</d>
<d p="45.84300,1,25,16707842,1537772979,0,dd97bcb9,5573603008446464">姐夫!</d>
<d p="177.42000,4,18,41194,1537773092,0,8ac75c7c,5573662363090948">『天上圆圆的月亮里小兔子在朝着我们挥』</d>
<d p="167.96800,4,18,41194,1537773050,0,8ac75c7c,5573640327266308">『在团子星球上建起家园大家相视会心微笑』</d>
<d p="186.49800,4,18,41194,1537773123,0,8ac75c7c,5573678876590080">『一切开心的伤心的事情全部包起来』</d>
<d p="196.15800,4,18,41194,1537773188,0,8ac75c7c,5573712601415684">『lalalala...』</d>
<d p="206.17800,4,18,41194,1537773205,0,8ac75c7c,5573721534758916">『lalalala...』</d>
<d p="234.11500,4,18,41194,1537773278,0,8ac75c7c,5573759816695808">『团子团子团子团子』</d>
<d p="137.54200,1,25,16777215,1537773234,0,cb2ec30f,5573736831909888">哭了哇嘤嘤嘤</d>
<d p="237.73500,4,18,41194,1537773291,0,8ac75c7c,5573766597312514">『团子团子大家族』</d>
<d p="243.12200,4,18,41194,1537773324,0,8ac75c7c,5573784049287168">『团子团子团子团子』</d>
<d p="247.34200,4,18,41194,1537773334,0,8ac75c7c,5573789508698112">『团子团子大家族』</d>

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

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

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

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

抓取bilibili的弹幕

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

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

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

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

" class="icon share-icon qq bili-share">qq</li><li data-share-id="tieba" title="分享到百度贴吧" report-id="share_tieba" class="icon share-icon baidu bili-share">baidu</li></ul></div><div class="share-popup"><div class="share-address"><p class="t">将视频贴到博客或论坛</p><ul><li><span class="name">视频地址</span><input id="link0" type="text" name value="https://www.bilibili.com/video/av32358492/"><span report-id="share_video" class="btn">复制</span></li><li><span class="name">嵌入代码</span><input id="link2" type="text" name value="<iframe src="//player.bilibili.com/player.html?aid=32358492&cid=56618920&page=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>"><span report-id="share_html" class="btn">复制</span></li></ul></div><div class="or-code"><p class="t">微信扫一扫分享</p><div class="or-code-pic"></div></div></div></div><div class="tb-line"></div><div title="收藏人数0" report-id="collect2" class="fav-box"><div class="btn-item"><i class="icon-move f-icon-moved" style="display:none;"></i><b class="icon-move f-icon-move" style="display:;"></b><span class="t">收藏</span><span class="num">0</span></div></div><div title="投硬币枚数--" report-id="coinbtn2" class="coin-box"><div class="btn-item"><i class="icon-move c-icon-moved" style="display:none;"></i><b class="icon-

我匹配的这一段html代码
&amp;cid=.*&amp;page=
然后就得到了这个oid

自行拼接成url之后,我们访问

我通过的URLConnection得到的数据.

然后就发现,byte转成string之后,十分稳定的乱码了,

咦这种情况一般需要编码成utf-8,然后加上utf-8

然后还是乱码…

这咋回事啊小老弟

然后看一下浏览器的回复头

抓取bilibili的弹幕

这个神奇的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好像也自带一个请求的方法,我还没有用过,这次正好尝试一下,应该比自己写的好用的多.

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

相关文章:

  • 2021-04-01
  • 2022-12-23
  • 2021-09-11
  • 2021-11-17
  • 2021-11-15
  • 2021-12-09
  • 2021-10-13
  • 2022-12-23
猜你喜欢
  • 2021-07-09
  • 2021-10-18
  • 2021-11-12
  • 2021-11-16
  • 2021-11-07
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案