精华内容
下载资源
问答
  • b站弹幕

    千次阅读 2018-06-23 17:09:23
    谷歌浏览器:import requests import time cookie={'Cookie':'l=v; LIVE_BUVID=AUTO9115296677131525; Hm_lvt_8a6e55dbd2870f0f5bc9194cddf32a02=1529667823,1529678970,... finger=7b4f413b; buvid3=8933D0B8-60...

    谷歌浏览器:

    import requests
    import time
    
    cookie={'Cookie':'l=v; LIVE_BUVID=AUTO9115296677131525; Hm_lvt_8a6e55dbd2870f0f5bc9194cddf32a02=1529667823,1529678970,1529719880; finger=7b4f413b; buvid3=8933D0B8-6007-4CE8-86BA-C93029CCD26416479infoc; sid=luecjskq; fts=1529669115; DedeUserID=311817936; DedeUserID__ckMd5=cca4969724abe2bb; SESSDATA=03bf401f%2C1532261056%2C82174446; bili_jct=5f9e891cfd70c2c6a703fd494bf69dc7; Hm_lpvt_8a6e55dbd2870f0f5bc9194cddf32a02=1529722625; _dfcaptcha=0691ef63ed3afa8e000cc79433fa186b; UM_distinctid=1642a729295c8-0408a57676b7d6-143e7140-fa000-1642a7292961'}
    sendurl='https://api.live.bilibili.com/msg/send'
    sendform={
    'color':'16777215',
    'csrf_token':'5f9e891cfd70c2c6a703fd494bf69dc7',
    'fontsize':'25',
    'mode':'1',
    'msg':'hello you',
    'rnd':'1529669186',
    'roomid':'1355059'
    }
    
    r=requests.post(sendurl,data=sendform,cookies=cookie)
    headers = {
        'Host': 'api.live.bilibili.com',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
        'Accept-Encoding': 'gzip, deflate',
        'Referer': 'http://www.baidu.com',
        'Connection': 'keep-alive',
        'Cache-Control': 'max-age=0',
    }
    url='https://api.live.bilibili.com/AppRoom/msg?room_id=1355059'
    resp=requests.get(url,headers=headers)
    data=resp.json()
    print(data)
    print(type(data))
    for i in data['data']['room']:
        print(i['text'])

    火狐浏览器:

    import time
    import random
    import requests
    
    class danMu(object):
    
        def __init__(self,roomid):
            self.roomid=roomid
            self.cookie={'Cookie':'l=v; LIVE_BUVID=AUTO9115296677131525; Hm_lvt_8a6e55dbd2870f0f5bc9194cddf32a02=1529667823,1529678970,1529719880; finger=7b4f413b; buvid3=8933D0B8-6007-4CE8-86BA-C93029CCD26416479infoc; sid=luecjskq; fts=1529669115; DedeUserID=311817936; DedeUserID__ckMd5=cca4969724abe2bb; SESSDATA=03bf401f%2C1532261056%2C82174446; bili_jct=5f9e891cfd70c2c6a703fd494bf69dc7; Hm_lpvt_8a6e55dbd2870f0f5bc9194cddf32a02=1529722625; _dfcaptcha=0691ef63ed3afa8e000cc79433fa186b; UM_distinctid=1642a729295c8-0408a57676b7d6-143e7140-fa000-1642a7292961'}
            self.geturl='https://api.live.bilibili.com/ajax/msg'
            #提交的参数
            self.getform={
                'csrf_token':'5f9e891cfd70c2c6a703fd494bf69dc7',
                'data_behavior_id':'127508b9ff3e630',
                'data_source_id':'system',
                'roomid':self.roomid,
                'visit_id':'6u82bcskv1ts'
            }
            self.sendurl='https://api.live.bilibili.com/msg/send'
            self.sendform = {
                'color': '16777215',
                'csrf_token': '5f9e891cfd70c2c6a703fd494bf69dc7',
                'fontsize': '25',
                'mode': '1',
                'msg': '烦',
                'rnd': '1529669186',
                'roomid': self.roomid
            }
    
        def getDanMu(self):
            self.gethtml=requests.post(self.geturl,self.getform)
            self.danMuList=list(map(lambda i:self.gethtml.json()['data']['room'][i]['text'],range(len(self.gethtml.json()['data']['room']))))
            self.mese=self.danMuList[random.randrange(1,10)]
            print(len(self.gethtml.json()['data']['room']))
            for i in self.danMuList:
                print(i)
            print(self.gethtml)
            print(self.gethtml.json())
            print(type(self.gethtml.json()))
    
        def sendDanMu(self):
            self.sendhtml=requests.post(self.sendurl,data=self.sendform,cookies=self.cookie)
            print(self.sendhtml.json())
    
    
    if __name__=='__main__':
        #实例化
    
        danmu = danMu('1355059').sendDanMu()
    
        danmu=danMu('1355059').getDanMu()
    

    展开全文
  • B站弹幕助手-易语言

    2021-06-12 15:02:36
    B站弹幕助手
  • b站弹幕.ipynb

    2020-08-23 15:58:28
    python爬取b站弹幕信息,并保存,绘制词云图,做情感分析,并将时间戳转换,通过弹幕发表时间,分析b站用户活跃时段。
  • YPERLINK " od弹幕实现:基于B站弹幕开源系统1) Android弹幕实现:基于B站弹幕开源系统( 如今的视频播放流行在视频上飘弹幕这里面做的相对比较成熟稳定使用量较多的弹幕系统当推站的弹幕系统,站的弹幕系统已经作为开源...
  • 类似B站弹幕播放器,可以发弹幕有单独数据库,可以设置禁发关键词,还可以设置暂停广告等,功能多全开源,可进行二次开发
  • 卧槽!原来爬取B站弹幕这么简单

    万次阅读 多人点赞 2020-11-07 11:58:00
    公众号后台回复“图书“,了解更多号主新书内容作者:叶庭云,https://blog.csdn.net/fyfugoyfa一、分析网页二、获取弹幕数据三、绘制词云图视频链接:https:...

    公众号后台回复“图书“,了解更多号主新书内容

     作者:叶庭云,https://blog.csdn.net/fyfugoyfa

    • 一、分析网页

    • 二、获取弹幕数据

    • 三、绘制词云图

    视频链接:https://www.bilibili.com/video/BV1zE411Y7JY

    一、分析网页

    点击弹幕列表,查看历史弹幕,并选择任意一天的历史弹幕,此时就能找到存储该日期弹幕的ajax数据包,所有弹幕数据放在一个i标签里。

    查看请求的相关信息可以发现Request URL关键就是 oid 和 date 两个参数,date很明显是日期,换日期可以实现翻页爬取弹幕,oid应该是视频标识之类的东西,换个oid可以访问其他视频弹幕页面。

    在这里插入图片描述

    二、获取弹幕数据

    本文爬取该视频1月1日到8月6日的历史弹幕数据,需构造出时间序列:

    import pandas as pd
    
    start = '20200101'
    end = '20200806'
    # 生成时间序列
    date_list = [x for x in pd.date_range(start, end).strftime('%Y-%m-%d')]
    print(date_list)
    

    运行结果如下:

    ['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04', '2020-01-05', '2020-01-06', ... '2020-08-06']
    
    Process finished with exit code 0
    

    爬虫代码如下:

    # -*- coding: UTF-8 -*-
    """
    @File    :spider.py
    @Author  :叶庭云
    @CSDN    :https://yetingyun.blog.csdn.net/
    """
    
    import requests
    import pandas as pd
    import re
    import time
    import random
    from concurrent.futures import ThreadPoolExecutor
    import datetime
    
    user_agent = [
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
        "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
        "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
        "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
        ]
    start_time = datetime.datetime.now()
    
    
    def  Grab_barrage(date):
        # 伪装请求头
        headers = {
            "sec-fetch-dest": "empty",
            "sec-fetch-mode": "cors",
            "sec-fetch-site": "same-site",
            "origin": "https://www.bilibili.com",
            "referer": "https://www.bilibili.com/video/BV1Z5411Y7or?from=search&seid=8575656932289970537",
            "cookie": "_uuid=0EBFC9C8-19C3-66CC-4C2B-6A5D8003261093748infoc; buvid3=4169BA78-DEBD-44E2-9780-B790212CCE76155837infoc; sid=ae7q4ujj; DedeUserID=501048197; DedeUserID__ckMd5=1d04317f8f8f1021; SESSDATA=e05321c1%2C1607514515%2C52633*61; bili_jct=98edef7bf9e5f2af6fb39b7f5140474a; CURRENT_FNVAL=16; rpdid=|(JJmlY|YukR0J'ulmumY~u~m; LIVE_BUVID=AUTO4315952457375679; CURRENT_QUALITY=80; bp_video_offset_501048197=417696779406748720; bp_t_offset_501048197=417696779406748720; PVID=2",
            "user-agent": random.choice(user_agent),
        }
        # 构造url访问   需要用到的参数
        params = {
            'type': 1,
            'oid': '128777652',
            'date': date
        }
        # 发送请求  获取响应
        response = requests.get(url, params=params, headers=headers)
        # print(response.encoding)   重新设置编码
        response.encoding = 'utf-8'
        # print(response.text)
        # 正则匹配提取数据
        comment = re.findall('<d p=".*?">(.*?)</d>', response.text)
        # 将每条弹幕数据写入txt
        with open('barrages.txt', 'a+') as f:
            for con in comment:
                f.write(con + '\n')
        time.sleep(random.randint(1, 3))   # 休眠
    
    
    def main():
        # 开多线程爬取   提高爬取效率
        with ThreadPoolExecutor(max_workers=4) as executor:
            executor.map(Grab_barrage, date_list)
        # 计算所用时间
        delta = (datetime.datetime.now() - start_time).total_seconds()
        print(f'用时:{delta}s')
    
    
    if __name__ == '__main__':
        # 目标url
        url = "https://api.bilibili.com/x/v2/dm/history"
        start = '20200101'
        end = '20200806'
        # 生成时间序列
        date_list = [x for x in pd.date_range(start, end).strftime('%Y-%m-%d')]
        count = 0
        # 调用主函数
        main()
    
    

    程序运行,成功爬取下弹幕数据并保存到txt。

    用时:32.040222s
    
    Process finished with exit code 0
    

    三、绘制词云图

    1. 读取txt中弹幕数据

    with open('barrages.txt') as f:
        data = f.readlines()
        print(f'弹幕数据:{len(data)}条')
    

    运行结果如下:

    弹幕数据:52708条
    
    Process finished with exit code 0
    
    

    2. Pyecharts 绘制词云

    import jieba
    import collections
    import re
    from pyecharts.charts import WordCloud
    from pyecharts.globals import SymbolType
    from pyecharts import options as opts
    from pyecharts.globals import ThemeType, CurrentConfig
    
    CurrentConfig.ONLINE_HOST = 'D:/python/pyecharts-assets-master/assets/'
    
    with open('barrages.txt') as f:
        data = f.read()
    
    # 文本预处理  去除一些无用的字符   只提取出中文出来
    new_data = re.findall('[\u4e00-\u9fa5]+', data, re.S)  # 只要字符串中的中文
    new_data = " ".join(new_data)
    
    # 文本分词--精确模式分词
    seg_list_exact = jieba.cut(new_data, cut_all=True)
    
    result_list = []
    with open('stop_words.txt', encoding='utf-8') as f:
        con = f.readlines()
        stop_words = set()
        for i in con:
            i = i.replace("\n", "")   # 去掉读取每一行数据的\n
            stop_words.add(i)
    
    for word in seg_list_exact:
        # 设置停用词并去除单个词
        if word not in stop_words and len(word) > 1:
            result_list.append(word)
    print(result_list)
    
    # 筛选后统计
    word_counts = collections.Counter(result_list)
    # 获取前100最高频的词
    word_counts_top100 = word_counts.most_common(100)
    # 可以打印出来看看统计的词频
    print(word_counts_top100)
    
    word1 = WordCloud(init_opts=opts.InitOpts(width='1350px', height='750px', theme=ThemeType.MACARONS))
    word1.add('词频', data_pair=word_counts_top100,
              word_size_range=[15, 108], textstyle_opts=opts.TextStyleOpts(font_family='cursive'),
              shape=SymbolType.DIAMOND)
    word1.set_global_opts(title_opts=opts.TitleOpts('弹幕词云图'),
                          toolbox_opts=opts.ToolboxOpts(is_show=True, orient='vertical'),
                          tooltip_opts=opts.TooltipOpts(is_show=True, background_color='red', border_color='yellow'))
    # 渲染在html页面上
    word1.render("弹幕词云图.html")
    

    运行效果如下:

    3. stylecloud 绘制词云

    # -*- coding: UTF-8 -*-
    """
    @File    :stylecloud_词云图.py
    @Author  :叶庭云
    @CSDN    :https://yetingyun.blog.csdn.net/
    """
    from stylecloud import gen_stylecloud
    import jieba
    import re
    
    
    # 读取数据
    with open('barrages.txt') as f:
        data = f.read()
    
    # 文本预处理  去除一些无用的字符   只提取出中文出来
    new_data = re.findall('[\u4e00-\u9fa5]+', data, re.S)
    new_data = " ".join(new_data)
    
    # 文本分词
    seg_list_exact = jieba.cut(new_data, cut_all=False)
    
    result_list = []
    with open('stop_words.txt', encoding='utf-8') as f:
        con = f.readlines()
        stop_words = set()
        for i in con:
            i = i.replace("\n", "")   # 去掉读取每一行数据的\n
            stop_words.add(i)
    
    for word in seg_list_exact:
        # 设置停用词并去除单个词
        if word not in stop_words and len(word) > 1:
            result_list.append(word)
    print(result_list)
    
    # stylecloud绘制词云
    gen_stylecloud(
        text=' '.join(result_list),    # 输入文本
        size=600,                      # 词云图大小
        collocations=False,            # 词语搭配
        font_path=r'C:\Windows\Fonts\msyh.ttc',   # 字体
        output_name='词云图.png',                 # stylecloud 的输出文本名
        icon_name='fas fa-apple-alt',             # 蒙版图片
        palette='cartocolors.qualitative.Bold_5'  # palettable调色方案
    )
    
    

    运行效果如下:

    ◆ ◆ ◆  ◆ ◆
    麟哥新书已经在京东上架了,我写了本书:《拿下Offer-数据分析师求职面试指南》,目前京东正在举行100-40活动,大家可以用相当于原价5折的预购价格购买,还是非常划算的:
    
    
    数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。
    
    管理员二维码:
    
    
    猜你喜欢
    
    ● 麟哥拼了!!!亲自出镜推荐自己新书《数据分析师求职面试指南》● 厉害了!麟哥新书登顶京东销量排行榜!● 笑死人不偿命的知乎沙雕问题排行榜
    ● 用Python扒出B站那些“惊为天人”的阿婆主!● 你相信逛B站也能学编程吗
    
    展开全文
  • B站弹幕数据分析与可视化, 自动化提取网站弹幕。输入网站地址即可提取。 弹幕数量 词云分析 情感分析 使用分析
  • 【kimol君的无聊小发明】—用python爬取B站弹幕(无数量限制)前言一、弹幕抓取(有数量限制)二、弹幕抓取(无数量限制)写在最后 前言 某个夜深人静的夜晚,夜微凉风微扬,月光照进我的书房~ 当我打开文件夹以...

    【kimol君的无聊小发明】—用python爬取B站弹幕(无数量限制)

    前言

    某个夜深人静的夜晚,夜微凉风微扬,月光照进我的书房~
    当我打开文件夹以回顾往事之余,惊现许多看似杂乱的无聊代码。我拍腿正坐,一个想法油然而生:“生活已然很无聊,不如再无聊些叭”。
    于是,我决定开一个专题,便称之为kimol君的无聊小发明
    妙…啊~~~

    想必小破站大家都很熟悉叭,里面充满了各种神奇的视频,其中的弹幕成为了许多人的快乐源泉。关于它的爬虫也有很多,但大部分都受限于弹幕池的数量,只能爬取到其中很少一部分的弹幕。

    那么,有没有办法可以爬取到B站更多的弹幕呢?

    一、弹幕抓取(有数量限制)

    首先,我们需要找到B站视频弹幕的接口,通过浏览器的F12调试工具抓包可以发现,其接口为:

    https://api.bilibili.com/x/v1/dm/list.so?oid={oid/cid}
    

    其实,除了这个接口之外,还有另外一个接口同样是可以获取到弹幕的:

    https://comment.bilibili.com/{oid/cid}.xml
    

    其中oidcid是iB站给每个视频分配的一个id号,但是通常我们在浏览器地址看到的是bvid,因此需要做个转换:
    在这里插入图片描述
    这里相关的接口有很多,可以定义如下函数:

    def get_cid(bvid):
        '''
        通过视频的bvid获得视频的cid
        输入:视频的bvid
        输出:视频的cid
        '''
        url = 'https://api.bilibili.com/x/player/pagelist?bvid=%s&jsonp=jsonp'%bvid
        res = requests.get(url)
        data = res.json()
        return data['data'][0]['cid']
    

    有了cid之后,我们便可以通过刚才发现的弹幕接口爬取弹幕了,代码如下:

    oid = get_cid(bvid) # 这里的cid和oid是一样的
    url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=%d'%oid
    res = requests.get(url)
    res.encoding = 'utf-8'
    text = res.text
    

    注意:这里需要指定res的编码方式为utf-8,否则会出现乱码现象。

    我们得到的请求为一个xml文件,其格式大致如下:
    在这里插入图片描述
    因此,需要将其中的信息提取出来,p标签对应的字段分别为:

    位置 含义
    第1个 弹幕在视频中的出现时间
    第2个 弹幕的模式
    第3个 弹幕字体大小
    第4个 弹幕颜色的十进制代码
    第5个 弹幕发送时间
    第6个 弹幕池
    第7个 用户ID(经过CRC32校验后)
    第8个 rowID,可认为是标识弹幕的ID

    那么,利用正则可以它们都提前出来:

    def parse_dm(text):
        '''
        解析视频弹幕
        输入:视频弹幕的原数据
        输出:弹幕的解析结果
        '''
        result = [] # 用于存储解析结果
        data = re.findall('<d p="(.*?)">(.*?)</d>',text)
        for d in data:
            item = {} # 每条弹幕数据
            dm = d[0].split(',') # 弹幕的相关详细,如出现时间,用户等
            item['出现时间'] = float(dm[0])
            item['模式'] = int(dm[1])
            item['字号'] = int(dm[2])
            item['颜色'] = int(dm[3])
            item['评论时间'] = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(int(dm[4])))
            item['弹幕池'] = int(dm[5])
            item['用户ID'] = dm[6] # 并非真实用户ID,而是CRC32检验后的十六进制结果
            item['rowID'] = dm[7] # 弹幕在数据库中的ID,用于“历史弹幕”功能
            item['弹幕内容'] = d[1]
            result.append(item)    
        return result
    

    通过解析requests的请求,便能得到相应的弹幕:

    dms = parse_dm(text) # 解析弹幕
    

    但是,这里受到弹幕池的限制,每次只能抓取一小部分,当弹幕数量很多时,显然这个办法行不通。

    那么,我们得另寻它路了~

    二、弹幕抓取(无数量限制)

    通过分析,我们可以找到另外一个接口,用于获取每天的弹幕历史数据:

    https://api.bilibili.com/x/v2/dm/history?type=1&oid={oid/cid}&date=xx-xx
    

    date为日期,通过遍历日期便可获得更多的弹幕。需要注意的是,这个接口需要登陆,因此在请求的时候必须得加入cookies,可以定义如下函数:

    def get_history(bvid,date): 
        '''
        获取视频历史弹幕
        输入:视频bvid,日期
        输出:视频某一日期开始的弹幕
        '''
        oid = get_cid(bvid)
        url = 'https://api.bilibili.com/x/v2/dm/history?type=1&oid=%d&date=%s'%(oid,date)
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0',
                   'Accept': '*/*',
                   'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
                   'Origin': 'https://www.bilibili.com',
                   'Connection': 'keep-alive',
                   'Referer': 'https://www.bilibili.com/video/BV1k54y1U79J',
                   'TE': 'Trailers'}
        # 此接口需要登陆,因此需要cookies
        cookies = {}
        res = requests.get(url,headers=headers,cookies=cookies)
        res.encoding = 'utf-8'
        text = res.text
        dms = parse_dm(text) # 解析弹幕
        return dms
    

    想要获得更多的弹幕,遍历每一天的弹幕数据即可,但是这样存在两个问题:效率太低数据重复。因为,每次获取通常可以得到跨越几天的数据,所以我们无需每天都去访问,而是根据结果逐步往前推即可:

    def get_dms(bvid):
        '''
        获取视频弹幕(此方法获取的弹幕数量更多)
        输入:视频的bvid
        输出:视频的弹幕
        '''
        print('视频解析中...')
        info = get_info(bvid)
        print('视频解析完成!')
        print('【视频标题】: %s\n【视频播放量】:%d\n【弹幕数量】:  %d\n【上传日期】:  %s'%(info[0],info[1],info[2],info[3]))
        dms = get_dm(bvid) # 存储弹幕
        if len(dms) >= info[2]: # 如果弹幕数量已抓满
            return dms
        else:
            dms = []
            date = time.strftime('%Y-%m-%d',time.localtime(time.time())) # 从今天开始
            while True:
                dm = get_history(bvid,date)
                dms.extend(dm)
                print('"%s"弹幕爬取完成!(%d条)'%(date,len(dm)))
                if len(dm) == 0: # 如果为空
                    break
                end = dm[-1]['评论时间'].split()[0] # 取最后一条弹幕的日期
                if end == date: # 如果最后一条仍为当天,则往下推一天
                    end = (datetime.datetime.strptime(end,'%Y-%m-%d')-datetime.timedelta(days=1)).strftime('%Y-%m-%d')
                if end == info[3]: # 如果已经到达上传那天
                    break
                else:
                    date = end
            dm = get_history(bvid,info[3]) # 避免忽略上传那天的部分数据
            dms.extend(dm)
            print('弹幕爬取完成!(共%d条)'%len(dms))
            print('数据去重中...')
            dms = del_repeat(dms,'rowID') # 按rowID给弹幕去重
            print('数据去重完成!(共%d条)'%len(dms))
            return dms
    

    运行主函数:

    if __name__ == '__main__':
        dms = get_dms('BV1HJ411L7DP')
        dms = pd.DataFrame(dms)
        dms.to_csv('一路向北.csv',index=False)
    

    爬取过程如下:
    在这里插入图片描述
    可以看到,一共11471条弹幕,我们获取到了11000条,占比已经很高了,而且csv文件已经安静地躺在了我的电脑中,打开它:
    在这里插入图片描述
    至此,大功告成,舒坦了~~

    写在最后

    最后,感谢各位大大的耐心阅读,咋们下次再会~

    如果需要完整代码可以关注下方公众号,后台回复“B站弹幕”即可获取,kimol君期待着您的光临~
    在这里插入图片描述

    创作不易,大侠请留步… 动起可爱的双手,来个赞再走呗 (๑◕ܫ←๑)

    展开全文
  • 爬取b站弹幕

    千次阅读 2020-02-08 21:59:18
    爬取b站弹幕 前段时间爬取了b站的弹幕,现在记录一下心得体会 前期准备 HTML解析 找到弹幕所在的json响应文件,发现里面有1000多条实时弹幕 分析参数: 只有视频的主键标识 oid 变法找到 oid 抓取下来(我是想着...

    爬取b站弹幕

    前段时间爬取了b站的弹幕,现在记录一下心得体会
    视频展示:https://www.bilibili.com/video/av90844407?from=search&seid=10052208744177748724

    前期准备

    HTML解析

    在这里插入图片描述
    在这里插入图片描述
    找到弹幕所在的json响应文件,发现里面有1000多条实时弹幕
    分析参数:
    在这里插入图片描述
    只有视频的主键标识 oid
    变法找到 oid 抓取下来(我是想着抓取一个up主的所有视频,所以要抓取全部的oid)
    看到每个视频的url是固定的格式:https://www.bilibili.com/video/av+vid
    从主界面抓取了所有的vid,然后通过xpath抓取了所有的oid
    至此,所有的oid抓取完毕

    下面进入代码抓取弹幕,解析数据

    先进行一个小测试,测试下抓取单个视频的弹幕:

    url="https://api.bilibili.com/x/v1/dm/list.so?oid=144896116"
    headers={
            "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0"
             }
    # query_list={"oid":"144896116"}
    response=requests.get(url,headers=headers)
    html_str=response.content
    html=etree.HTML(html_str)
    d_list=html.xpath('//d')
    content_list=[]
    
    a=d_list[0].xpath('//text()')
    items={}
    items["danmu"]=a
    content_list.append(items)
    with open("blbl.txt","w",encoding="utf-8") as f:
        for content in content_list:
            f.write(json.dumps(content,ensure_ascii=False))
            f.write("\n")
    

    果然抓取成功

    然后抓取全部的弹幕,解析,存入数据库

    import pymysql
    import json
    import io
    import sys
    
    con = pymysql.connect(
    
        host='127.0.0.1',
    
        port=3306,
    
        user='root',
    
        password='root',
    
        db='test',
    
        charset='utf8mb4'
    
    )
    cur = con.cursor()
    cur.execute("insert into danmu(dm) value('测试')")
    con.commit()
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='gb18030')
    with open("danmu.json", "r", encoding="utf-8") as f:
        danmu_str = json.load(f)
        # print(danmu_str["dm"][0]["danmu"])
        j = 0
        for j in range(0, 1002):
            for item in danmu_str["dm"][j]["danmu"]:
    
                # sql_str="insert into danmu(dm) value( \""+item+"\")"
    
                for stuff in dirty_stuff:
                    item = item.replace(stuff, "")
                print(item)
                length = item.__len__()
               
                for l in range(1, length - 1):
                    if (item_list[0]==item_list[l]):
                        item=item_list[0]
                sql_str = "insert into danmu(dm) value( \"" + item + "\")"
                cur.execute(sql_str)
                con.commit()
    
    
    

    在这里插入图片描述
    解析数据,进行弹幕排行:

    
    select count(*) as count,dm as danmu
    from danmu
    group by dm
    order by count desc;
    
    

    排行结果:
    在这里插入图片描述
    我是抓去了敬汉卿的100万条弹幕,排行结果优点意外,什么0 啊,f啊,一啊的…

    展开全文
  • 说明 :利用算法解析B站弹幕发送者的uid。 ' Copyright 2020 Liv. ' Author:Liv ' email:1319923129@qq.com ' 本项目遵循GPL开源协yi,请勿商用与闭源。
  • Python爬取B站弹幕方法介绍

    千次阅读 多人点赞 2020-08-04 21:47:46
    Python爬取B站弹幕方法介绍 文章目录Python爬取B站弹幕方法介绍前言寻找弹幕数据编写爬虫B站弹幕数量新技术介绍参考文章 前言 最近同学要做东西,需要用 B 站的视频对应的弹幕数据做分析,于是请我帮忙爬取 B 站视频...
  • Android弹幕实现:基于B站弹幕开源系统(1)

    万次阅读 热门讨论 2017-03-29 17:07:42
    Android弹幕实现:基于B站弹幕开源系统(1)如今的视频播放,流行在视频上飘弹幕。这里面做的相对比较成熟、稳定、使用量较多的弹幕系统,当推B站的弹幕系统,B站的弹幕系统已经作为开源项目在github上,其项目...
  • B站弹幕姬是针对b站视频提供的一款弹幕编辑工具。软件简单实用,B站弹幕姬可以帮你设置弹幕出现时间及出现的位置,如此简单实用的工具受到了众多B站人士的喜爱,成为了B站粉丝们的专用工具了。 软件功能 侧边栏...
  • Python爬取B站弹幕数据并获取弹幕数量最多数据网站分析最终代码 我们以郑老师申论课为例子进行分析 网站分析 郑老师的申论课的网址为 https://www.bilibili.com/video/BV1W7411t7fy 我们爬取106节课程并存储弹幕到...
  • b站弹幕更改API

    2020-12-27 04:16:04
    b站弹幕已经在不惜牺牲旧客户端的情况下改了接口。 我本来想自己试试修一下弹幕姬直接提交PR了,但是我发现我怎么都没办法自己build成功,有点过于头疼就来发issue了。 总之代码应该是改这里:...
  • 计算机基础课的大作业,简易的B站弹幕分析工具,通过GUI界面的形式可以做出词云图,统计出高频词汇并做出柱状图,除此之外还有很多功能。
  • B站弹幕接口

    千次阅读 多人点赞 2019-01-26 17:57:26
    一、B站弹幕的api接口 1.'https://comment.bilibili.com/' + cid + '.xml' 2.'https://api.bilibili.com/x/v1/dm/list.so?oid=' + cid e.g: cid = 72540443...
  • 【爬虫】简单十行代码爬取B站的B站弹幕
  • 使用Python获取B站弹幕

    千次阅读 2020-03-22 21:08:47
    爬取某个视频的b站弹幕
  • Android弹幕实现:基于B站弹幕开源系统(7)QQ、微信聊天气泡样式的弹幕在附录文章得基础上,改进普通文本弹幕,实现一种特殊效果的文本弹幕,像QQ、微信一样的带有气泡背景的弹幕。实现的重点是在...
  • Java爬取B站弹幕 弹幕的存储位置 如何通过B站视频AV号找到弹幕对应的xml文件号 首先爬取视频网页,将对应视频网页源码获得 就可以找到该视频的av号aid=8678034 还有弹幕序号,cid=14295428 弹幕存放...
  • 弹幕在直播中是一个比较重要的功能,而开源的B站弹幕可以让我们轻松的实现这个功能。 其实现原理大概就是在页面的上方盖了一层全透明的View,然后再View中添加需要的弹幕效果。 上图: 1、首先,在项目中添加依赖:...
  • Android弹幕实现:基于B站弹幕开源系统(2)在附录1的基础上,模拟实现一种实际开发的应用场景:从网络中不间断的周期取弹幕数据,这些弹幕数据往往是批量的,然后把这些从网络中取到的批量数据逐个的显示出来。...
  • B站弹幕评论抓取

    2021-04-28 21:18:16
    B站弹幕评论抓取 #!/usr/bin/env python # -*- coding:utf-8 -*- # @Author: Minions # @Date: 2021-04-28 10:59:25 # @Last Modified by: Minions # @Last Modified time: 2021-04-28 21:15:36 import requests ...
  • 目录关于《后浪》的B站弹幕分析总结(一)——爬取B站视频的上万条弹幕的方法一、先尝试爬取1000条1 .1 查找弹幕所在地址1.2 代码实现二、1000条不够我想要更多怎么办?三、B站弹幕文件里的其他信息有用吗? 关于...
  • 使用Python爬取B站弹幕

    2019-09-15 11:58:51
    爬取B站弹幕说着简单实现难,你不仅仅要找到弹幕视频的api接口 还要掌握一系列的表达式及编程语法 但是 我并不慌,身为一名没多少进ICU的996患者(误) 让我们开始coding吧! 使用语言:...
  • 自助b 站弹幕服务器连接器主程序负责保持与弹幕服务器的连接和解析弹幕数据,其他功能由插件提供。 自动加载plugins 文件夹下的js 文件,插件导出一个类,所有插件在程序启动时进行初始化,传入一个ebus,ebus 目前...
  • Android弹幕实现:基于B站弹幕开源系统(3)本文在附录1,2的基础上再次对异步获取弹幕并显示弹幕完善逻辑和代码,集中在上层Java代码部分:package zhangphil.danmaku; import android.app.Activity; import ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,671
精华内容 668
关键字:

b站弹幕