今天跟大家分享的爬取B站视频的弹幕并绘制出词云图
本次爬虫所有代码在本文结尾贴出
准备工作
昨天是五四青年节,我在B站看了一个名为《哔哩哔哩献给新一代的演讲——后浪》,给我看的热血澎湃😆。所以我决定就以它作为试验对象爬取弹幕,绘制词云图。
爬虫爬取前的分析是必不可少的,我们首先要找到弹幕在什么地方,要“有的放矢”。在我一番查找之后,我把目标定在了一个list标签上,具体步骤如下所示:
找到这个URL后,复制它到新的页面打开:
我们可以发现这个URL打开的页面就是所有的弹幕✌,到此,准备工作就完成啦!
撸代码
在写代码之前,我们需要安装一些第三方库,如果有就不需要安装啦。
- requests
- imageio
- jieba
- 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')
转载:https://blog.csdn.net/qq_44032277/article/details/105927983
查看评论