zoukankan      html  css  js  c++  java
  • C# B站的弹幕提取

    要知道B站的弹幕位置

    如果只考虑视频,B站的链接格式为:https://www.bilibili.com/video/av34042815。把av后面的数字看做是唯一标记即可。

    既然能够把弹幕加载出来,那说明一定有相关的弹幕接口。这个时候需要万能的F12了~~

    于是就发现了这样一个链接:https://api.bilibili.com/x/v1/dm/list.so?oid=59624026。把oid后面的数字也看做是标记吧。当然这个接口肯定不是一直不变的,可能在不久之后就变了。

    弹幕文件如何匹配

    我们的重点是那这个数字到底对应https://www.bilibili.com/video/av34042815的哪个元素呢?

    查看源码,找到了这样一列。当然这查找方式也不可能是唯一的。下面两个图说明番剧和普通视频的cid还是有不同之处的。(https://www.bilibili.com/video/av34566552)

    于是我决定写了两个匹配

    Match match = Regex.Match(input, "cid=(\d+)");
    string result = "";
    if (match.Success)
    {
        result = match.Groups[1].Value;
    }
    else
    {
        Match match1 = Regex.Match(input, ""cid":(\d+)");
        result = match1.Groups[1].Value;
    }

    其实还需要两个链接

    第一个str对应av号码,第二个arg对应cid号。cid号的查询已经在上面给出了。

    string requestUri = string.Format("https://www.bilibili.com/video/{0}", str);
    string requestUri = string.Format("https://api.bilibili.com/x/v1/dm/list.so?oid={0}", arg);

    现在我们需要av号的过滤,再来一个规则匹配

    Match match = Regex.Match(str, "av\d+", RegexOptions.IgnoreCase);
    if (!match.Success)
    {
        throw new ArgumentException("地址格式不合法");
    }

    怎么去提取弹幕

    使用HttpClient可能会简单一点点。

    var httpClient = new HttpClient(new HttpClientHandler
    {
        Proxy = null,
        AutomaticDecompression = DecompressionMethods.GZip,
        AllowAutoRedirect = true,
    });
    var httpClient = new HttpClient(new HttpClientHandler
    {
        Proxy = null,
        AutomaticDecompression = DecompressionMethods.Deflate,
        AllowAutoRedirect = true,
    });

    为什么要使用两个基本相同的代码,仅仅只是 DecompressionMethods 不同而已。

    这个时候需要看一看F12中的这个东西了

    里面这个Headers我们需要带入,不然可能会出现430错误

    httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml");
    httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate");
    httpClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0");

    其实上面也有另外的写法

    httpClient.DefaultRequestHeaders.Add();

    接下来就要解释为什么要加入 DecompressionMethods.Deflate了

    因为gzip和deflate的原因。如果不加入,获取的弹幕文件就是这样子的(具体原因自己查资料):

    最后结果

    至于为什么没有全部的代码,因为现在写的太乱了,等整理之后再发吧~

  • 相关阅读:
    java 中 this 和 super 说明及在构造器中super()和this()相互调用执行顺序
    Java中get()方法和set()方法如何使用?
    java中如何在键盘中输入一串数字然后存入数组中?
    修改阿里云服务器主机名称
    flask第一个页面
    爬取汽车之家新闻的数据
    冒泡排序
    爬取简书
    Mac Flask-Migrate 安装出现错误
    C++__ 判断和循环
  • 原文地址:https://www.cnblogs.com/yinghualuowu/p/9855595.html
Copyright © 2011-2022 走看看