hello大家好,我是你们的可爱丸,大家平时在B站看视频时有没有开弹幕的习惯呢?如果不把视频从头看到尾,那么多弹幕,我们怎么快速的知道大家都说了些什么并且持有什么观点呢?
今天小姐姐就教你做一个简单的B站弹幕爬虫,让你在没有观看视频的情况下就能预先知道大家都在弹幕里面评论了什么,并且什么是大家说的最多的词语。话不多说,现在我们就开始学习B站弹幕的python爬虫吧!
【效果预览】
【详细教程】
首先,我们需要确定想爬取的目标网页,因为最近罗翔老师说刑法的相关视频实在是太有意思了,所以这里可爱丸小姐姐选取了罗翔老师的最新视频:【罗翔】我们为什么要读书?进行弹幕分析,网址如下:/video/BV1BK411L7DJ
确定了要爬取的URL之后,我们需要点击右键进入检查模式,然后找到Network选项卡,再点击浏览器左上角的刷新按钮,接着一个个点击浏览左下角的数据查找弹幕信息存储的位置。经过一番查找,小姐姐发现弹幕信息原来储存在:list.so?oid=177974677这个位置。
接下来我们将list.so?oid=177974677这个数据点开,就可以看到如下的信息,原来我们所有的弹幕信息都存储在这个网页中,那么我们的要分析的URL地址就是:/x/v1/dm/list.so?oid=177974677啦。
接着我们编写如下代码并运行,就可以成功的将弹幕信息爬下来啦,是不是很简单呢?
#导入我们要用到的模块import requestsimport re#设置想要爬取的网页地址url = '/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 = pile('<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 requestsimport reimport jiebaimport wordcloud#设置想要爬取的网页地址url = '/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 = pile('<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 requestsimport reimport jiebaimport wordcloudimport imageio#选择同一个文件夹下的luoxiang.jpg图片mask = imageio.imread('xing.jpg')#设置想要爬取的网页地址url = '/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 = pile('<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 requestsimport reimport jiebaimport wordcloudimport imageio#选择同一个文件夹下的luoxiang.jpg图片mask = imageio.imread('xing.jpg')#设置想要爬取的网页地址url = '/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 = pile('<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自学之路上的学习干货!
如果你觉得本教程写得不错的话,记得给小姐姐评论以及点赞哦,你们的支持就是我坚持的动力!拜拜,我们下期再见!