C# POST——爬取B站直播时的弹幕

版权声明:本文为博主原创文章,转载请注明源地址 https://blog.csdn.net/qq_15505341/article/details/79212070

打开b站,随便点进个直播,打开chrome自带的开发者工具,抓下包
封包图片
妈耶…这封包还挺多的啊…慢慢的分析一会发现了这个
这里写图片描述
表面上看好像不是我们想要的,点开数据看了一下(⓿_⓿)
这里写图片描述
哎没错了就是这个,开撸代码


负责提交post的函数

        static string Post()
        {
            string postString = "";//要发送的数据
            byte[] postData = Encoding.UTF8.GetBytes(postString);//编码,尤其是汉字,事先要看下抓取网页的编码方式  
            string url = @"";//地址  

            WebClient webClient = new WebClient();
            webClient.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36");
            webClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");//采取POST方式必须加的header,如果改为GET方式的话就去掉这句话即可  
            webClient.Headers.Add("Cookie",
                "填抓取到的cookie"
                );
            byte[] responseData = webClient.UploadData(url, "POST", postData);//得到返回字符流  
            string srcString = Encoding.UTF8.GetString(responseData);//解码  
            return srcString;
        }

这里,我们主要要修改postString(对应Form Data),url(对应Request URL)这两个变量和 webClient.Headers.Add(“Cookie”,“填抓取到的cookie”);的参数(对应Cookie),把抓取的数据对号入座就行


找到postString

这里写图片描述
点开刚刚抓到的msg封包,划到最下面,有一个Form Data,再点击一下view source,就能直接复制了!
这里写图片描述
把这串文本直接复制进刚刚写的代码里,传递给postString

string postString = "roomid=83264&token=&csrf_token=我是图中的马赛克";//要发送的数据

找到url

url在最上面的Genral-Request URL
这里写图片描述
也是直接复制传递给url

string url = @"http://api.live.bilibili.com/ajax/msg";//地址  

找到Cookie

这里写图片描述
一如既往的复制到代码中
(cookie中可能有登陆信息,所以可耻的打了码(o´・ェ・`o))

            webClient.Headers.Add("Cookie",
                "可耻的马赛克"
                );

好了,修改后的代码是这样子的

        static string Post(string room)
        {
            string postString = "roomid="+room+"&token=&csrf_token=我是图中的马赛克";//要发送的数据
            byte[] postData = Encoding.UTF8.GetBytes(postString);//编码,尤其是汉字,事先要看下抓取网页的编码方式  
            string url = @"http://api.live.bilibili.com/ajax/msg";//地址  

            WebClient webClient = new WebClient();
            webClient.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36");
            webClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");//采取POST方式必须加的header,如果改为GET方式的话就去掉这句话即可  
            webClient.Headers.Add("Cookie",
                "可耻的马赛克"
                );
            byte[] responseData = webClient.UploadData(url, "POST", postData);//得到返回字符流  
            string srcString = Encoding.UTF8.GetString(responseData);//解码  
            return srcString;
        }

运行一下
这里写图片描述
不错,数据出来了,拿在线Unicode转换一下发现确实是弹幕信息,现在开始处理这个又臭又长的字符串

        static List<string> GetDanMu(string room)
        {
            string danmu = Post(room);
            List<string> list = new List<string>();
            //正则匹配
            foreach (Match item in Regex.Matches(danmu, "text\":\".*?\""))
            {
                //截取字符串,将unicode码转换为中文
                list.Add(Regex.Unescape(item.Value.Substring(7, item.Value.Length - 8)));
            }
            return list;
        }

搞定
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_15505341/article/details/79212070