基于SpringBoot的哔哩哔哩动态爬取网站

原理:通过b站的动态api获取动态的json,从json中获取动态的作者与图片信息,并持久化到数据库。

b站的动态链接格式为 https://t.bilibili.com/xxx其中xxx为动态的id,通过b站的api接口:https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/get_dynamic_detail?dynamic_id=xxx 即可获取到此动态的json数据。

关键功能实现:

首先通过工具类从用户提交的完整网址中提取动态id

public class UrlUtil {
    public static String getApiId(String str){
        if(str.length()>49) {
            str = str.substring(0, 50);
        }
        if(str.contains("b23.tv")){
            str = shortLink.getLink(str);
        }
        str=str.trim();
        String str2="";
        if(!"".equals(str)){
            for(int i=0;i<str.length();i++){
                if(str.charAt(i)>=48 && str.charAt(i)<=57){
                    str2+=str.charAt(i);
                }
            }
        }
        if(str2.length()>=18){
            return str2.substring(0,18);
        }else
            return null;
    }
}

但是手机端用户复制下来的动态链接为短链接,为了减少用户使用的时间成本,可以通过工具类将短链接转换为长连接

public class shortLink {

    public static String getLink(String shortLink){
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url(shortLink).build();
        try {
            Response response = client.newCall(request).execute();
            HttpUrl realUrl = response.request().url();
            response.close();
            return String.valueOf(realUrl);
        } catch (IOException e) {
            return null;
        }
    }

}

至此后台就可以通过用户上传的动态链接来获取到动态的id

之后通过fastjson来获取json里的各项数据

public class GetPicJson {
    public static List<String> upload(String link) throws IOException {
        link = UrlUtil.getApiId(link);
        String str = GetHttpData.getData("https://api.vc.bilibili.com/dynamic_svr/v1/dynamic_svr/get_dynamic_detail?dynamic_id="+link);
        JSONObject nameJson = JSON.parseObject(str);
        String name = nameJson.getJSONObject("data").getJSONObject("card").getJSONObject("card").getJSONObject("user").getString("name");
        String uid = nameJson.getJSONObject("data").getJSONObject("card").getJSONObject("desc").getString("uid");
        String time = nameJson.getJSONObject("data").getJSONObject("card").getJSONObject("desc").getString("timestamp");
        JSONArray tags;
        StringBuilder tag= new StringBuilder();
        if (nameJson.getJSONObject(
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值