爬取B站弹幕(Java版本,附带deflate解压)

前几天突发奇想要爬取B站的弹幕,于是简单在网上找到了B站的弹幕API,关于如何获取B站的接口这里不再赘述,本文主要集中解决我在此开发过程中所遇到的难题。(采用okhttp)


开始的时候,我是想直接爬取B站的弹幕内容,然后打印出来,但是很快我就发现事情并没有那么简单,B站的响应(response)采用了deflate压缩算法,okhttp无法直接解析。如下:

import java.io.*;
import java.util.zip.Inflater;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class MyXMLReader {
    public static void main(String arge[]) {
        try {
            //            利用okhttp发送网络请求
            OkHttpClient client = new OkHttpClient().newBuilder()
                    .build();
            Request request = new Request.Builder()
                    .url("https://api.bilibili.com/x/v1/dm/list.so?oid=496428154")
                    .method("GET", null)
                    .build();
            Response response = client.newCall(request).execute();//得到返回的响应数据(经过了deflate压缩)
            System.out.println(response.body().string());
        } catch (Exception e) {
        }
    }

/*乱码报错
���oI�'����e�X��...
*/

         于是我又写了一个方法,用来解压B站返回的数据,大致思想就是--->先把B站返回来的数据转为字节码数据byte[],然后再对字节码数据进行算法解压,最后把字节码数据封装成String对象。

完整代码如下:

import java.io.*;
import java.util.zip.Inflater;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class MyXMLReader {
    public static void main(String arge[]) {
        try {
            //            利用okhttp发送网络请求
            OkHttpClient client = new OkHttpClient().newBuilder()
                    .build();
            Request request = new Request.Builder()
                    .url("https://api.bilibili.com/x/v1/dm/list.so?oid=496428154")
                    .method("GET", null)
                    .build();
            Response response = client.newCall(request).execute();//得到返回的响应数据(经过了deflate压缩)
            byte[] bytes = response.body().bytes();//获取字节码数据
            bytes = decompress(bytes);//解压数据
            String data=new String(bytes);//转为字符串
            System.out.println(data);
        } catch (Exception e) {
        }
    }

    //    解压的方法体
    public static byte[] decompress(byte[] data) throws IOException {
        byte[] decompressData = null;
        Inflater decompressor = new Inflater(true);
        decompressor.reset();
        decompressor.setInput(data);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length);
        try {
            byte[] buf = new byte[1024];
            while (!decompressor.finished()) {
                int i = decompressor.inflate(buf);
                outputStream.write(buf, 0, i);
            }
            decompressData = outputStream.toByteArray();
        } catch (Exception e) {
        } finally {
            outputStream.close();
        }
        decompressor.end();
        return decompressData;
    }
}


 到此结束!

posted @ 2022-11-17 20:27  ThinkStu  阅读(83)  评论(0)    收藏  举报