精华内容
下载资源
问答
  • B站弹幕爬虫

    千次阅读 2020-02-03 18:48:41
    作者:Huangwei AI 来源:Python与机器学习之路前言B站作为弹幕文化的代表,有着非常丰富的弹幕资源。今天我们尝试对B站弹幕进行爬虫并且绘制词云图展示爬虫...

         作者:Huangwei AI

         来源:Python与机器学习之路

    前言

    B站作为弹幕文化的代表,有着非常丰富的弹幕资源。今天我们尝试对B站的弹幕进行爬虫并且绘制词云图展示爬虫结果。

    爬虫方式

    01

    PART

    众所周知,B站的内容非常丰富:

    要想找到一个视频中的弹幕,我们其实有很多种方法。

    给大家介绍Github上一个B站爬虫数据接口大全:

    https://github.com/Vespa314/bilibili-api/blob/master/api.md

    在这次爬虫中,我们使用【读取Up视频列表】的方式:

    02

    PART

    基本信息

    我们选取一位叫做【小时姑娘】的Up主来爬取:

    注意上面网址中的id=99239148,这是个核心信息。

    由于我们是数据接口是列表的形式,所以原则上可以爬取该Up主的所有视频信息。

    但是,这次我们专注于一个视频。

    没错,就是上面图片中第三个视频,播放量为80.3万的现场版【爱殇】。

    这个视频来自于bilibili晚会。弹幕和播放量都够我们爬的。

    爬虫代码

    03

    PART

    我们爬虫的代码主要参考知乎的一个回答:

    https://www.zhihu.com/question/56924570/answer/236892766

    只需要根据Up主id信息以及视频在列表中位置就可以顺利爬虫:

    import requests
    import re
    import os
    import sys
    import json
    
    
    # B站API详情 https://github.com/Vespa314/bilibili-api/blob/master/api.md
    
    
    # 视频AV号列表
    aid_list = []
    
    
    # 评论用户及其信息
    info_list = []
    
    
    # 获取指定UP的所有视频的AV号 mid:用户编号 size:单次拉取数目 page:页数
    def getAllAVList(mid, size, page):
        for n in range(1,page+1): 
            url = "http://space.bilibili.com/ajax/member/getSubmitVideos?mid=" + str(mid) + "&pagesize=" + str(size) + "&page=" + str(n)
            r = requests.get(url) 
            text = r.text 
            json_text = json.loads(text) 
            print (json_text)
            # 遍历JSON格式信息,获取视频aid 
            for item in json_text["data"]["vlist"]: 
                aid_list.append(item["aid"]) 
        print(aid_list)
    # 获取一个AV号视频下所有评论 
    def getAllCommentList(item): 
        url = "http://api.bilibili.com/x/reply?type=1&oid=" + str(item) + "&pn=1&nohot=1&sort=0" 
        r = requests.get(url) 
        numtext = r.text 
        json_text = json.loads(numtext) 
        commentsNum = json_text["data"]["page"]["count"] 
        page = commentsNum // 20 + 1 
        for n in range(1,page): 
            url = "https://api.bilibili.com/x/v2/reply?jsonp=jsonp&pn="+str(n)+"&type=1&oid="+str(item)+"&sort=1&nohot=1" 
            req = requests.get(url) 
            text = req.text 
            json_text_list = json.loads(text) 
            for i in json_text_list["data"]["replies"]: 
                info_list.append([i["member"]["uname"],i["content"]["message"]]) 
        # print(info_list)
    
    
    # 保存评论文件为txt 
    def saveTxt(filename,filecontent): 
        filename = str(filename) + ".txt" 
        for content in filecontent: 
            with open(filename, "a", encoding='utf-8') as txt: 
                txt.write(content[0] +' '+content[1].replace('\n','') + '\n\n') 
            print("文件写入中")
    
    
    if __name__ == "__main__": 
        # 爬取小时姑娘 只爬取第一页的第一个 
        getAllAVList(99239148,3,1) 
        for item in aid_list: 
            info_list.clear() 
            getAllCommentList(item) 
            saveTxt(item,info_list)
    

    04

    PART

    词云图

    我们将结果通过词云图的方式展示出来:

    可以看出来,弹幕还是非常丰富多彩的。

    有夸唱的好听的,有提到小时姑娘名字的,还有卧槽,哈哈哈。

    值得注意的是里面有很多提到了东宫,查了一下资料才发现这首歌原来已经出现很久了:

    大家感兴趣的话,可以去爬自己喜欢的视频哦。

    ·END·
     

    ◆ ◆ ◆  ◆ ◆
    
    长按二维码关注我们
    数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。
    
    管理员二维码:
    
    
    猜你喜欢
    ● 笑死人不偿命的知乎沙雕问题排行榜● 用Python扒出B站那些“惊为天人”的阿婆主!● 互联网大佬学历&背景大揭秘,看看是你的老乡还是校友● 上万条数据撕开微博热搜的真相!● 你相信逛B站也能学编程吗? 
    
    展开全文
  • 今天小姐姐就教你做一个简单的B站弹幕爬虫,让你在没有观看视频的情况下就能预先知道大家都在弹幕里面评论了什么,并且什么是大家说的最多的词语。话不多说,现在我们就开始学习B站弹幕的python爬虫吧! 【效果预览...

    hello大家好,我是你们的可爱丸,大家平时在B站看视频时有没有开弹幕的习惯呢?如果不把视频从头看到尾,那么多弹幕,我们怎么快速的知道大家都说了些什么并且持有什么观点呢?
    在这里插入图片描述
    今天小姐姐就教你做一个简单的B站弹幕爬虫,让你在没有观看视频的情况下就能预先知道大家都在弹幕里面评论了什么,并且什么是大家说的最多的词语。话不多说,现在我们就开始学习B站弹幕的python爬虫吧!
    【效果预览】
    在这里插入图片描述
    在这里插入图片描述
    【详细教程】
    首先,我们需要确定想爬取的目标网页,因为最近罗翔老师说刑法的相关视频实在是太有意思了,所以这里可爱丸小姐姐选取了罗翔老师的最新视频:【罗翔】我们为什么要读书?进行弹幕分析,网址如下:https://www.bilibili.com/video/BV1BK411L7DJ
    在这里插入图片描述
    确定了要爬取的URL之后,我们需要点击右键进入检查模式,然后找到Network选项卡,再点击浏览器左上角的刷新按钮,接着一个个点击浏览左下角的数据查找弹幕信息存储的位置。经过一番查找,小姐姐发现弹幕信息原来储存在:list.so?oid=177974677这个位置。
    在这里插入图片描述
    接下来我们将list.so?oid=177974677这个数据点开,就可以看到如下的信息,原来我们所有的弹幕信息都存储在这个网页中,那么我们的要分析的URL地址就是:https://api.bilibili.com/x/v1/dm/list.so?oid=177974677啦。
    在这里插入图片描述
    接着我们编写如下代码并运行,就可以成功的将弹幕信息爬下来啦,是不是很简单呢?

    #导入我们要用到的模块
    import requests
    import re
    
    #设置想要爬取的网页地址
    url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=177974677'
    #设置请求头,让爬虫伪装成浏览器访问
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'}
    
    def get_damu(url):
        response = requests.get(url, headers)
        response = response.content.decode('utf-8')
        #通过正则表达式获取两个<d>标签内包含的弹幕信息
        data = re.compile('<d.*?>(.*?)</d>')
        #对目标网页使用正则表达式,获取所有匹配的内容
        danmu = data.findall(response)
        #打印一下看看有没有成功获取到弹幕
        print(danmu)
    
    get_damu(url)
    

    在这里插入图片描述
    但是想要对弹幕进行数据分析还没有那么简单哦,我们需要对弹幕进行分词,也就是把句子分割为一个个词语,然后再用空格将每个词语连接起来,需要补充的代码如下:

    danmu_word = jieba.lcut(" ".join(danmu))
    #将分词结果再次用空格连接,并转化成制作词云需要的字符串形式
    print(danmu_word)
    

    在这里插入图片描述
    虽然我们已经做好了分词处理,但是词云只能处理字符串形式的内容,所以这里我们需要再将处理好的分词转化为字符串形式,需要补充的代码如下:

    #将分词结果再次用空格连接,并转化成制作词云需要的字符串形式
    danmu_str = " ".join(danmu_word)
    print(danmu_str)
    

    在这里插入图片描述
    弹幕数据处理成可以被词云使用的字符串数据之后,我们就可以使用词云模块对数据进行词云分析啦,代码如下:

    # 微信公众号:chimuyhs 【可爱丸学python】 关注并回复:源码  即可获取源代码
    # QQ学习交流群:983460742
    
    #导入我们要用到的模块
    import requests
    import re
    import jieba
    import wordcloud
    #设置想要爬取的网页地址
    url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=177974677'
    #设置请求头,让爬虫伪装成浏览器访问
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'}
    
    def get_damu(url):
        response = requests.get(url, headers)
        response = response.content.decode('utf-8')
        #通过正则表达式获取两个<d>标签内包含的弹幕信息
        data = re.compile('<d.*?>(.*?)</d>')
        #对目标网页使用正则表达式,获取所有匹配的内容
        danmu = data.findall(response)
        #使用jieba模块的lcut()精确模式进行分词,并用空格连接词语
        danmu_word = jieba.lcut(" ".join(danmu))
        #将分词结果再次用空格连接,并转化成制作词云需要的字符串形式
        danmu_str = " ".join(danmu_word)
        #构造词云对象,字体为微软雅黑,背景颜色为白色
        w = wordcloud.WordCloud(font_path="msyh.ttc",background_color='white')
        #将处理好的分词弹幕加载到词云中
        w.generate(danmu_str)
        #将生成的词云保存为danmu.png图片
        w.to_file('danmu.png')
    
    if __name__ == '__main__':
        get_damu(url)
    

    做好以上的处理之后,我们的词云图片就存储在和源代码同级的文件夹下啦,其中词语最大的就是在弹幕中出现次数最多的词语哦,从这个弹幕词云我们可以看出同学们说的最多的就是“谢谢老师”,看来我们的罗翔老师真的很受大家喜爱呢,给罗翔老师点赞!
    在这里插入图片描述
    如果大家觉得系统默认生成的词云图片太小的话,还可以对词云图片的长和宽进行设置哦,这样我们就可以得到自己想要的图片大小啦,设置方法如下:

    #构造词云对象,字体为微软雅黑,背景颜色为白色
    #设置宽度为1000高度为500,通过mask设置图片形状
    w = wordcloud.WordCloud(font_path="msyh.ttc",background_color='white',width=1000,height=500)
    

    在这里插入图片描述
    如果你想生成更具特色的词云,还可以对词云的形状进行设置哦,这里可爱丸小姐姐想把词云设置成五角星的形状,所以就在网上找了一张五角星的图片,并通过修改mask,把五角星图片设置为词云的形状,代码如下:

    # 微信公众号:chimuyhs 【可爱丸学python】 关注并回复:源码  即可获取源代码
    # QQ学习交流群:983460742
    
    #导入我们要用到的模块
    import requests
    import re
    import jieba
    import wordcloud
    import imageio
    #选择同一个文件夹下的luoxiang.jpg图片
    mask = imageio.imread('xing.jpg')
    
    #设置想要爬取的网页地址
    url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=177974677'
    #设置请求头,让爬虫伪装成浏览器访问
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'}
    
    def get_damu(url):
        response = requests.get(url, headers)
        response = response.content.decode('utf-8')
        #通过正则表达式获取两个<d>标签内包含的弹幕信息
        data = re.compile('<d.*?>(.*?)</d>')
        #对目标网页使用正则表达式,获取所有匹配的内容
        danmu = data.findall(response)
        #使用jieba模块的lcut()精确模式进行分词,并用空格连接词语
        danmu_word = jieba.lcut(" ".join(danmu))
        #将分词结果再次用空格连接,并转化成制作词云需要的字符串形式
        danmu_str = " ".join(danmu_word)
        #构造词云对象,字体为微软雅黑,背景颜色为白色
        #设置宽度为1000高度为500,通过mask设置图片形状
        w = wordcloud.WordCloud(font_path="msyh.ttc",background_color='white',width=1000,height=500,mask=mask)
        #将处理好的分词弹幕加载到词云中
        w.generate(danmu_str)
        #将生成的词云保存为danmu.png图片
        w.to_file('danmu.png')
    
    if __name__ == '__main__':
        get_damu(url)
    

    在这里插入图片描述
    怎么样,这样生成的词云是不是“美貌与智慧”并存呢?哈哈。

    看到这里大家是不是以为本期的教程就要结束了呢?才没有呢!我们还差了最后一步哦。大家有没有发现,这样写的爬虫只能爬取设置好的默认视频弹幕,如果下次我们想要分析另一个视频的弹幕岂不是要把代码重新写一遍?这可不是我们聪明人的风格哦。所以我们要对这个爬虫增加一个可交互的功能,让他能够爬取任意我们想要爬取的B站视频,并且不用修改代码,方法如下:

    # 微信公众号:chimuyhs 【可爱丸学python】 关注并回复:源码  即可获取源代码
    # QQ学习交流群:983460742
    
    #导入我们要用到的模块
    import requests
    import re
    import jieba
    import wordcloud
    import imageio
    #选择同一个文件夹下的luoxiang.jpg图片
    mask = imageio.imread('xing.jpg')
    
    #设置想要爬取的网页地址
    url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=177974677'
    #设置请求头,让爬虫伪装成浏览器访问
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'}
    
    def get_damu(url):
        response = requests.get(url, headers)
        response = response.content.decode('utf-8')
        #通过正则表达式获取两个<d>标签内包含的弹幕信息
        data = re.compile('<d.*?>(.*?)</d>')
        #对目标网页使用正则表达式,获取所有匹配的内容
        danmu = data.findall(response)
        #使用jieba模块的lcut()精确模式进行分词,并用空格连接词语
        danmu_word = jieba.lcut(" ".join(danmu))
        #将分词结果再次用空格连接,并转化成制作词云需要的字符串形式
        danmu_str = " ".join(danmu_word)
        #构造词云对象,字体为微软雅黑,背景颜色为白色
        #设置宽度为1000高度为500,通过mask设置图片形状
        w = wordcloud.WordCloud(font_path="msyh.ttc",background_color='white',width=1000,height=500,mask=mask)
        #将处理好的分词弹幕加载到词云中
        w.generate(danmu_str)
        #将生成的词云保存为danmu.png图片
        w.to_file('danmu.png')
    
    if __name__ == '__main__':
        s = input("输入要爬取的弹幕地址:")
        # 将用户输入的弹幕地址去掉空格并加载到get_danmu()中
        get_damu(s.strip())
    

    将代码改进之后,我们就可以实现对任意视频的B站弹幕分析啦!是不是很棒呢?
    在这里插入图片描述
    好啦,本次的爬虫案例分享到这里就结束啦,如果你还想学习更多有关python的知识,记得关注我哦,我将持续与大家分享python自学之路上的学习干货!

    如果你觉得本教程写得不错的话,记得给小姐姐评论以及点赞哦,你们的支持就是我坚持的动力!拜拜,我们下期再见!

    展开全文
  • 【python--爬虫】b站弹幕爬虫

    千次阅读 2020-08-03 19:34:42
    获取bilibili直播间弹幕 房间号从url上获取。 例如直播间url为:https://live.bilibili.com/21584153?visit_id=2vnqkd7xmr28 房间号就为:21584153 获取不同房间的弹幕:修改第26行的roomid的值为对应的房间号 "...
    # -*- coding:utf-8 -*-
    # 时间:2020/8/3
    # 作者:猫先生的早茶
    """
        获取bilibili直播间弹幕
        房间号从网页源代码中获取
        打开直播画面后,按ctrl+u 打开网页源代码,按ctrl+f 搜索 room_id
        搜到的"room_id":1016中,1016就是房间号 
        获取不同房间的弹幕:修改代码第26行的roomid的值为对应的房间号
    """
    
    import requests;
    import time;
    
    class Danmu():
        def __init__(self):
            # 弹幕url
            self.url = 'https://api.live.bilibili.com/xlive/web-room/v1/dM/gethistory';
            # 请求头
            self.headers = {
                'Host':'api.live.bilibili.com',
                'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0',
            }
            # 定义POST传递的参数
            self.data = {
                'roomid':'1016',
                'csrf_token':'',
                'csrf':'',
                'visit_id':'',
            }
            # 日志写对象
            self.log_file_write = open('danmu.log',mode='a',encoding='utf-8');
            # 读取日志
            log_file_read = open('danmu.log',mode='r',encoding='utf-8');
            self.log = log_file_read.readlines();
            
        def get_danmu(self):
            # 获取直播间弹幕
            html = requests.post(url=self.url,headers=self.headers,data=self.data).json();
            # 解析弹幕列表
            for content in html['data']['room']:
                # 获取昵称
                nickname = content['nickname'];
                # 获取发言
                text = content['text'];
                # 获取发言时间
                timeline = content['timeline'];
                # 记录发言
                msg = timeline+' '+nickname+': '+text;
                # 判断对应消息是否存在于日志,如果和最后一条相同则打印并保存
                if msg+'\n' not in self.log:
                    # 打印消息
                    print (msg);
                    # 保存日志
                    self.log_file_write.write(msg+'\n');
                    # 添加到日志列表
                    self.log.append(msg+'\n');
                # 清空变量缓存
                nickname = '';
                text = '';
                timeline = '';
                msg = '';
                
            
    
    # 创建bDanmu实例
    bDanmu = Danmu();
    while True:
        # 暂停0.5防止cpu占用过高
        time.sleep(0.5);
        # 获取弹幕
        bDanmu.get_danmu();        
    
    展开全文
  • [Python] [Bilibili] B站历史弹幕爬虫

    千次阅读 2020-02-26 16:39:57
    b站历史弹幕爬虫,以b站弹幕最多的天鹅臂视频为例。

    b站弹幕最多的天鹅臂视频为例,可视化效果见哪位艺人的老婆们最有毅力?b站弹幕爬虫及可视化

    1. 最新弹幕

    最新弹幕可以通过NetWork中的list.so...获取,具体操作可参考历史弹幕的爬取。
    在这里插入图片描述
    但是最新弹幕只能最多获取3000条,如果视频的弹幕超过3000条,则需要通过别的方式获取。
    在这里插入图片描述

    2. 历史弹幕

    2.1 探索

    观察弹幕列表可以发现,b站提供了历史弹幕的查看途径。
    在这里插入图片描述
    点击不同的日期,可以发现不断有以history?开头的资源加载进来。
    在这里插入图片描述
    从预览中可以看到,其实就是对应日期最新的3000条弹幕。观察一下url,有关的参数是typeoiddateoid就是视频对应的id,date则是日期,type暂时不知道干哈的。

    https://api.bilibili.com/x/v2/dm/history?type=1&oid=5627945&date=2020-03-02
    

    再把这个网址放到没有登录b站账号的浏览器打开,显示账号未登录,也就是需要登录才能获取数据,可以考虑用模拟登录解决。
    在这里插入图片描述

    2.2 数据获取

    2.2.1 模拟登录

    用的是selenium搭配谷歌浏览器,需要先配置一下和浏览器版本匹配的驱动,可自行百度或参考这里的第五点

    # 导入需要的包
    from bs4 import BeautifulSoup as bs
    import pandas as pd
    import re
    from selenium import webdriver
    import time, datetime
    
    # 模拟登录
    ## 登录界面链接
    url = 'https://passport.bilibili.com/login'
    ## 模拟登录启动
    driver = webdriver.Chrome()
    driver.get(url)
    ## 接下来就是在打开的谷歌浏览器里手动登录一下自己的账号,
    ## 	* 因为b站登录需要验证,这一步自动化的代价比较大,所以手动了。
    

    2.2.2 获取每一天的数据

    探索部分,看看即可:

    # 以2019-01-01为例
    date = '2019-01-01'
    url = 'https://api.bilibili.com/x/v2/dm/history?type=1&oid=5627945&date=%s'%date
    
    # 转入历史弹幕的页面
    driver.get(url)
    
    # 获取数据部分的html
    html = driver.find_element_by_tag_name('i').get_attribute('innerHTML')
    
    # 解析
    soup = bs(html, 'lxml')
    
    # 先康康第一条
    print(soup.find('d'))
    # 弹幕内容
    print(soup.find('d').text)
    # 弹幕其他信息
    print(soup.find('d').get('p'))
    
    # 经过一番探索,以逗号分割,第一个参数是视频时间(秒),第五个参数是时间戳,第七个参数是用户id,其他反正暂时不重要,不探索了
    # 整理成DataFrame
    data = pd.DataFrame([i.get('p').split(',') + [i.text] for i in soup.findAll('d')], \
                        columns=['second', 'b', 'c', 'd', 'timestamp', 'f', 'user', 'h', 'text'])
    data.head(2)
    

    在这里插入图片描述
    封装成函数后:

    def get_per_day(date):
        # url
        url = 'https://api.bilibili.com/x/v2/dm/history?type=1&oid=5627945&date=%s'%date
        # 转入历史弹幕的页面
        driver.get(url)
        # 获取并解析
        soup = bs(driver.find_element_by_tag_name('i').get_attribute('innerHTML'), 'lxml')
        # 整理成DataFrame
        data = pd.DataFrame([i.get('p').split(',') + [i.text] for i in soup.findAll('d')], \
                        columns=['second', 'b', 'c', 'd', 'timestamp', 'f', 'user', 'h', 'text'])
        # 只取有用的列
        data = data[['timestamp', 'text']]
        return data
    

    2.2.3 获取一段时间的数据

    探索部分,看看即可:

    # 设定开始和结束日期
    start = '2019-01-01'
    end = '2019-02-01'
    
    # 创建空DataFrame方便后面放数据
    data = pd.DataFrame()
    
    # 转成日期形式方便加天数
    start = pd.datetime.strptime(start, '%Y-%m-%d')
    end = pd.datetime.strptime(end, '%Y-%m-%d')
    
    # 循环
    while start <= end:
        date = pd.datetime.strftime(start, '%Y-%m-%d')
        print(date,end=', ')
        data = data.append(get_per_day(date))
        start = start + datetime.timedelta(days=1)
    

    封装成函数后:

    def get_period(start, end):
        # 创建空DataFrame方便后面放数据
        data = pd.DataFrame()
    
        # 转成日期形式方便加天数
        start = pd.datetime.strptime(start, '%Y-%m-%d')
        end = pd.datetime.strptime(end, '%Y-%m-%d')
    
        # 循环
        while start <= end:
            date = pd.datetime.strftime(start, '%Y-%m-%d')
            print(date,end=', ')
            data = data.append(get_per_day(date))
            # 去重(因为如果当天弹幕量不到3000会获取到前一天的弹幕,导致数据大量重复)
            data.drop_duplicates(inplace=True)
            start = start + datetime.timedelta(days=1)
            
        return data
    

    于是就可以通过设定开始和结束的时间爬取一段时间的弹幕。

    data = get_period('2019-01-01', '2019-01-31')
    

    2.2.4 代码整理

    如果不想看上面的部分,直接复制下面这段。

    def get_per_day(date, driver):
    	'''
    	获取一天的数据
    	date: 	str, %Y-%m-%d
    	'''
        # url
        url = 'https://api.bilibili.com/x/v2/dm/history?type=1&oid=5627945&date=%s'%date
        # 转入历史弹幕的页面
        driver.get(url)
        # 获取并解析
        soup = bs(driver.find_element_by_tag_name('i').get_attribute('innerHTML'), 'lxml')
        # 整理成DataFrame
        data = pd.DataFrame([i.get('p').split(',') + [i.text] for i in soup.findAll('d')], \
                        columns=['second', 'b', 'c', 'd', 'timestamp', 'f', 'user', 'h', 'text'])
        # 只取有用的列
        data = data[['timestamp', 'text']]
        return data
    
    def get_period(start, end):
    	'''
    	先登录,然后获取数据。
    	start: 	str, %Y-%m-%d
    	end:	str, %Y-%m-%d
    	'''
    	# 登录
    	url = 'https://passport.bilibili.com/login'
    	driver = webdriver.Chrome()
    	driver.get(url)
    	input('请在浏览器登录账号后回车')
    	
        # 创建空DataFrame方便后面放数据
        data = pd.DataFrame()
    
        # 转成日期形式方便加天数
        start = pd.datetime.strptime(start, '%Y-%m-%d')
        end = pd.datetime.strptime(end, '%Y-%m-%d')
    
        # 循环
        while start <= end:
            date = pd.datetime.strftime(start, '%Y-%m-%d')
            # 时不时打印一下方便追踪进度
            if start.day == 1:
            	print(date,end=', ')
           	# 拼接数据
            data = data.append(get_per_day(date, driver))
            # 去重
            data.drop_duplicates(inplace=True)
            # 下一天
            start = start + datetime.timedelta(days=1)
            
        return data
    
    data = get_period('2019-01-01', '2019-12-31')
    

    2.3 数据处理

    2.3.1 计算弹幕发送时间

    把获取的时间由时间戳专成字符串或整型。

    # 转成字符串
    #data['time'] = data['timestamp'].apply(lambda x: time.strftime("%Y%m%d", time.localtime(int(x))))
    # 转成整型方便后面计算
    data['time'] = data['timestamp'].apply(lambda x: int(time.strftime("%Y%m%d", time.localtime(int(x)))))
    

    2.3.2 从弹幕中提取各种粉丝类型和明星名字

    有很多种方法,规则的学习成本最低所以用规则,具体不讲了,主要就是正则匹配。

    def clean(text):
        for i in ['前面的', '前面', \
                  '前边儿的', '前边儿', '前边', '你的', '讨厌', '感觉'\
                  '我是', '小姐姐', '挥着翅膀', '这位', '这个动作', \
                  '我以后养', '大姨妈', '来姨妈', '姨妈', '第四天', '第五天', '第三天', '第二天', \
                  '坠机', '哈哈', '广场舞大妈', '做到这里', '已经', '安利', '我的妈', '一半', \
                  '没有', '要做', '撞妈', '心疼', '鸡翼', '要成为', '好多', '未来']:
            text = text.replace(i, '')
        
        pattern = r'([^,.,。 !!??()\t0-9吗呜了啊的🟢着呦他说我你是·]{2,})'
        return text, pattern
    
    def find_relation(text, names):
        text, pattern = clean(text)
        for i in names:
            pa = re.compile(pattern+i)
            if len(pa.findall(text)) != 0:
                return pa.findall(text)[0]
        return None
    
    wife = ['的大老婆', '大老婆', \
            '的小老婆', '小老婆', \
            '的老婆', '老婆', \
            '的真老婆', '真老婆', \
            '的脑婆', '脑婆', \
            '的夫人', '夫人', \
            '的妻子', '妻子']
    girlfriend  = ['的女朋友', '女朋友', \
                   '的女票', '女票', \
                   '的对象', '脑婆', \
                   '的女盆友', '女盆友', \
                   '的女友', '女友']
    mon = ['的麻麻', '麻麻', \
          '的妈妈', '妈妈', \
          '的妈', '妈', \
          '的亲妈', '亲妈', \
          '的亲麻', '亲麻', \
          '的母亲', '母亲', \
          '的马麻', '马麻', \
          '的妈粉', '妈粉']
    women = ['的女人', '女人']
    girl = ['的女孩', '女孩']
    daughter = ['的女儿', '女儿']
    sister = ['的姐姐', '姐姐', \
             '的妹妹', '妹妹']
    
    relation_dic = {'wife': '老婆', 'girlfriend': '女朋友', 'mon': '妈妈', \
                   'women': '女人', 'girl': '女孩', 'daughter': '女儿', \
                   'sister': '姐妹'}
    
    data['wife'] = data['text'].apply(lambda x: find_relation(x, wife))
    data['girlfriend'] = data['text'].apply(lambda x: find_relation(x, girlfriend))
    data['mon'] = data['text'].apply(lambda x: find_relation(x, mon))
    data['women'] = data['text'].apply(lambda x: find_relation(x, women))
    data['girl'] = data['text'].apply(lambda x: find_relation(x, girl))
    data['daughter'] = data['text'].apply(lambda x: find_relation(x, daughter))
    data['sister'] = data['text'].apply(lambda x: find_relation(x, sister))
    

    在这里插入图片描述

    2.3.3 汇总每一天

    relation_count = pd.DataFrame()
    for k,v in relation_dic.items():
        df = pd.DataFrame(data.groupby(['time', k]).size())
        df.reset_index(inplace=True)
        df.columns = ['date', 'name', 'value']
        df['type'] = v
        relation_count = relation_count.append(df)
    

    在这里插入图片描述

    2.3.4 计算累计值

    dates = data['time'].unique()
    relation_sum = pd.DataFrame()
    for i in dates:
        df = pd.DataFrame(relation_count[relation_count['date'] <= i].groupby(['name', 'type']).sum()['value'])
        df.reset_index(inplace=True)
        df['date'] = '%s-%s-%s'%(str(i)[:4], str(i)[4:6], str(i)[6:])
        df.sort_values('value', ascending=False, inplace=True)
        relation_sum = relation_sum.append(df.iloc[:30])
    relation_sum['name'] = relation_sum.apply(lambda x: str(x['name'])+'的'+x['type'], axis=1)
    

    在这里插入图片描述

    展开全文
  • java爬B站弹幕加java生成词云java爬B站弹幕加java生成词云先添加依赖 然后直接用就行了org.apache.httpcomponentshttpclient4.5.12com.kennycasonkumo-core1.27com.kennycasonkumo-tokenizers1.27package com.yang;...
  • 准备工作 下载安装python https://www.python.org/ 下载python并安装,本文章基于python 3.8.1 idea安装python插件 idea找到settings,进入并搜索python插件安装。...B站弹幕爬虫 ...至于B站弹幕爬虫,我们...
  • 最近有朋友在群上面说做个b站某视频的弹幕统计列表,筛选出弹幕最多的那条!那么如何解决这个问题呢?首先肯定是要获取弹幕的列表吧,然后再进行分析吧。筛选出弹幕最多的那条,这个好办用collections可以解决,那么...
  • B站视频弹幕爬虫相关操作如何寻找oid完整代码文件截图 相关操作 如何寻找oid 按F12,点击展开 点击查看历史弹幕,点击日期 找到含有oid的url 完整代码 #!/usr/bin/env python # coding: utf-8 import ...
  • 爬虫】简单十行代码爬取B站B站弹幕
  • 弹幕爬虫

    2020-12-18 14:03:25
    1.爬取 oid import re import requests # av_id:视频编号 av_id = 'BV1cy4y1k7A2' print("爬取视频编号为:{}".format(av_id)) ...# 用正则表达式匹配到对应的oid(弹幕id) match_rule = r'cid=(.*?)&a

空空如也

空空如也

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

b站弹幕爬虫

爬虫 订阅