python爬取b站弹幕并进行数据可视化
1.第一步,爬取b站弹幕
我们随便打开一个b站视频
打开开发者模式,在network下搜索list,可以找到该视频的弹幕文件
打开之后是这个样子的
结构还是比较简单的,我们后续爬取数据也就比较方便
下面是爬取弹幕的代码
// An highlighted block
from bs4 import BeautifulSoup#负责解析网页源码
import requests#负责爬取网页源码
import re#对解析后的文件进行弹幕匹配
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
}
response = requests.get("https://api.bilibili.com/x/v1/dm/list.so?oid=130684654", headers=headers)
html_doc = response.content.decode('utf-8')
format = re.compile("<d.*?>(.*?)</d>")
DanMu = format.findall(html_doc)
#逐个输出弹幕
for i in DanMu:
print(i)
这是实现效果
2.第二步,对弹幕进行文件存储
这里我们需要导入新的库
// An highlighted block
import csv
对第一次的代码进行部分修改
// An highlighted block
for i in DanMu:
with open(r'C:\Users\Administrator\Desktop\b站弹幕.csv',"a", newline='',encoding='utf-8-sig') as csvfile:
writer= csv.writer(csvfile)
danmu = []
danmu.append(i)
writer.writerow(danmu)
以下是实现效果
这样我们就实现了弹幕的存储功能
3.将数据进行可视化
这里我们使用wordcloud库进行最简单的实现
// An highlighted block
import wordcloud
# 从外部.txt文件中读取大段文本,存入变量txt中
f = open('C:/Users/Administrator/Desktop/b站弹幕.csv',encoding='utf-8')
txt = f.read()
# 构建词云对象w,设置词云图片宽、高、字体、背景颜色等参数
w = wordcloud.WordCloud(width=1000,
height=700,
background_color='white',
font_path='msyh.ttc')
# 将txt变量传入w的generate()方法,给词云输入文字
w.generate(txt)
# 将词云图片导出到当前文件夹
w.to_file('C:/Users/Administrator/Desktop/output3.png')
以下是实现效果
当然你也可以对词云进行更加复杂的控制,例如指定形状,设置停词等,以下展示最终的成品代码
// An highlighted block
from bs4 import BeautifulSoup
import requests
import re
import csv
# 导入词云制作库wordcloud和中文分词库jieba
import jieba
import wordcloud
# 导入imageio库中的imread函数,并用这个函数读取本地图片,作为词云形状图片
import imageio
mk = imageio.imread("C:/Users\Administrator\Desktop\code\chinamap.png")
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
}
response = requests.get("https://api.bilibili.com/x/v1/dm/list.so?oid=130684654", headers=headers)
#print(response.text)
html_doc = response.content.decode('utf-8')
#soup = BeautifulSoup(html_doc,'lxml')
format = re.compile("<d.*?>(.*?)</d>")
DanMu = format.findall(html_doc)
for i in DanMu:
with open(r'C:\Users\Administrator\Desktop\b站弹幕.csv',"a", newline='',encoding='utf-8-sig') as csvfile:
writer= csv.writer(csvfile)
danmu = []
danmu.append(i)
writer.writerow(danmu)
# 构建并配置词云对象w,注意要加stopwords集合参数,将不想展示在词云中的词放在stopwords集合里,这里去掉“曹操”和“孔明”两个词
w = wordcloud.WordCloud(width=1000,
height=700,
background_color='white',
font_path='msyh.ttc',
mask=mk,
scale=15,
stopwords={' '},
contour_width=5,
contour_color='red')
# 对来自外部文件的文本进行中文分词,得到string
f = open('C:/Users/Administrator/Desktop/b站弹幕.csv',encoding='utf-8')
txt = f.read()
txtlist = jieba.lcut(txt)
string = " ".join(txtlist)
# 将string变量传入w的generate()方法,给词云输入文字
w.generate(string)
# 将词云图片导出到当前文件夹
w.to_file('C:/Users/Administrator/Desktop/output2-threekingdoms.png')
以下是最终实现效果