爬虫百战(三):爬取B站视频弹幕绘制词云图

今天跟大家分享的爬取B站视频的弹幕并绘制出词云图

本次爬虫所有代码在本文结尾贴出

爬取B站视频弹幕绘制词云图

准备工作

昨天是五四青年节,我在B站看了一个名为《哔哩哔哩献给新一代的演讲——后浪》,给我看的热血澎湃😆。所以我决定就以它作为试验对象爬取弹幕,绘制词云图。

爬虫爬取前的分析是必不可少的,我们首先要找到弹幕在什么地方,要“有的放矢”。在我一番查找之后,我把目标定在了一个list标签上,具体步骤如下所示:
在这里插入图片描述
找到这个URL后,复制它到新的页面打开:
在这里插入图片描述
在这里插入图片描述

我们可以发现这个URL打开的页面就是所有的弹幕✌,到此,准备工作就完成啦!

撸代码

在写代码之前,我们需要安装一些第三方库,如果有就不需要安装啦。

  1. requests
  2. imageio
  3. jieba
  4. wordcloud

如果在导入这些包的时候,编译器报错说明你没有安装。你可以按住win+R键,输入以下命令进行安装:

pip install requests
pip install imageio
pip install jieba
pip install wordcloud

确保本次实验所需的库都安装好了以后,我们就可以写代码了:

  • 导包
import imageio as imageio   #加载图片
import requests             #发出请求
import re                   #内置库 用于匹配正则表达式
import csv                  #文件格式
import jieba                #中文分词
import wordcloud            #绘制词云
  • 目标网站(即我们获取到的URL)
url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=186803402'
  • 设置请求头 伪装浏览器
headers = {
     "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36"
 }
  • 发起请求 获得响应
response = requests.get(url,headers=headers)

html_doc = response.content.decode('utf-8')
  • 解析数据
    在这里插入图片描述

我们可以观察到这些弹幕内容都是被封装在< d ></ d>标签里

#正则表达式的匹配模式
res = re.compile('<d.*?>(.*?)</d>')
#根据模式提取网页数据
danmu = re.findall(res,html_doc)
  • 保存数据
for i in danmu:
    with open('b站弹幕.csv','a',newline='',encoding='utf-8-sig') as file:
        writer = csv.writer(file)
        danmu = []
        danmu.append(i)
        writer.writerow(danmu)
  • 很据得到的弹幕数据绘制词云图
f = open('b站弹幕.csv',encoding='utf-8')

txt = f.read()
txt_list = jieba.lcut(txt)
# print(txt_list)
string = ' '.join((txt_list))
print(string)



w = wordcloud.WordCloud(width=1000,
                        height=700,
                        background_color='white',
                        font_path='C:/Windows/SIMLI.TTF',

                        scale=15,
                        stopwords={' '},
                        contour_width=5,
                        contour_color='red'
                        )

w.generate(string)
w.to_file('wordcloud.png')
  • 效果展示

在这里插入图片描述

  • 补充:如果你不想要这种方方正正的形状,你可以从网上找一个你喜欢的形状,这里我就以在网上找的爱心图片为例:
    在这里插入图片描述

将这个图片放到你写代码的项目目录下,将展示词云图部分的代码改一下:

f = open('b站弹幕.csv',encoding='utf-8')

txt = f.read()
txt_list = jieba.lcut(txt)
# print(txt_list)
string = ' '.join((txt_list))
print(string)

mk = imageio.imread(r'images.png')

w = wordcloud.WordCloud(width=1000,
                        height=700,
                        background_color='white',
                        font_path='C:/Windows/SIMLI.TTF',
                        mask=mk,
                        scale=15,
                        stopwords={' '},
                        contour_width=5,
                        contour_color='red'
                        )

w.generate(string)
w.to_file('axwordcloud.png')
  • 效果展示

在这里插入图片描述
到此,所有工作全部完成啦!!!

完整代码

import imageio as imageio   #加载图片
import requests             #发出请求
import re                   #内置库 用于匹配正则表达式
import csv                  #文件格式
import jieba                #中文分词
import wordcloud            #绘制词云


url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=186803402'

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36"
}

response = requests.get(url,headers=headers)
# print(response.content.decode('utf-8'))
html_doc = response.content.decode('utf-8')

res = re.compile('<d.*?>(.*?)</d>')
danmu = re.findall(res,html_doc)
# print(danmu)

for i in danmu:
    with open('b站弹幕.csv','a',newline='',encoding='utf-8-sig') as file:
        writer = csv.writer(file)
        danmu = []
        danmu.append(i)
        writer.writerow(danmu)

# 显示数据

f = open('b站弹幕.csv',encoding='utf-8')

txt = f.read()
txt_list = jieba.lcut(txt)
# print(txt_list)
string = ' '.join((txt_list))
print(string)

mk = imageio.imread(r'images.png')

w = wordcloud.WordCloud(width=1000,
                        height=700,
                        background_color='white',
                        font_path='C:/Windows/SIMLI.TTF',
                        mask=mk,
                        scale=15,
                        stopwords={' '},
                        contour_width=5,
                        contour_color='red'
                        )

w.generate(string)
w.to_file('axwordcloud.png')
  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值