爬取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;
}
}

浙公网安备 33010602011771号