作者:下里巴人

来自南京审计大学

前言:

这是一份数据采集的个人作业,是关于爬取b站弹幕并绘制词云图。称为保姆级是因为这份代码已经竭尽所能的让人容易理解啦(*^▽^*)

爬取对象

本次爬取对象是-《梅西-改变世界二十大进球》中的弹幕信息。

首先,我们需要知道一个知识:对于B站弹幕而言,弹幕所在位置是有固定格式的:
http://comment.bilibili.com/+cid+.xml
所以我们当务之急,是要获取我们想要爬取视频的弹幕的cid

如何获取cid?

如上图所示,我们首先打开我们想要爬取的那个视频页面,右击审查,选择网络。这时,里面应该是空的,所以我们此时刷新页面,就会显示出来啦!。接着在搜索框中搜索cid,接着,在响应的文件中找到负载,你应该就可以找到cid啦!

代码展示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import requests
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
from wordcloud import WordCloud
from PIL import Image
import jieba
import matplotlib.pyplot as plt
import re


#获取响应信息
def get_contents(cid):
#用于伪装的请求头
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.56'}
#弹幕url凭借
url = "https://comment.bilibili.com/"+str(cid)+".xml"
#发送请求
req = requests.get(url=url,headers=header)
#获取内容响应的内容
html_byte = req.content
#将byte转为str
html_str = str(html_byte,"utf-8")
#解析
soup = BeautifulSoup(html_str,'html.parser')
#找到html文件里的<d>标签
results = soup.find_all('d')
#提取标签中的文本
contents = [x.text for x in results]

return contents

#创建一个xlsx文件
def creat_xlsx(xlsx_filename):

file_xlsx = open(str(xlsx_filename) + '.xlsx','w')

file_xlsx.close()

#创建一个文本文件
def creat_txt(txt_filename):

file_txt = open(str(txt_filename) + '.txt','w')

file_txt.close()

#写入excel表格
def download_excel(contents,xlsx_filename):
#构建字典
dic ={"contents" : contents}

df = pd.DataFrame(dic)
#写入数据
df["contents"].to_excel(str(xlsx_filename)+".xlsx")

#将弹幕内容写入文本文件并且读取
def download_open_txt(contents,txt_filename):
#使用with open()新建对象f
with open(str(txt_filename)+".txt", 'w', encoding='utf-8') as f:
# 将列表中的数据循环写入到文本文件中
for i in contents:
#写入数据
f.write(i+"\n")
#读取写入的文本文件
with open(str(txt_filename)+".txt",encoding="utf-8") as f:

s = f.read()

return s
#清洗文字
def washword(s):

#中文分词
text = ' '.join(jieba.cut(s))

#清洗弹幕,只要字符串中的中文
data = re.findall('[\u4e00-\u9fa5]+', text)

text1 = ' '.join(data)

return text1

#生成词云
def wordcloud(text1,img_filename,img_format):
#生成对象
#将图片转换为数组
mask_imag=np.array(Image.open(str(img_filename)+str(img_format)))
#装载停用词
stopwords = ["我","你","她","的","是","了","在","也","和","就","都","这","啊","真的","不","看球"]
wc = WordCloud(font_path="msyh.ttc",
mask=mask_imag,
width = 1000,
height = 700,
background_color='white', #设置底色
max_words=200,
stopwords=stopwords).generate(text1)
return wc




if __name__ == '__main__':

cid = int(input("请输入你想要爬取的cid号:"))

xlsx_filename = str(input("请输入你想写入的表格名(例如:作业):"))

txt_filename = str(input("请输入你想要写入的文本文件名(例如:作业):"))

img_filename = str(input("请输入你的图片名称(例如:底图):"))

img_format = str(input("请输入你的图片格式(例如.jpg):"))

creat_xlsx(xlsx_filename)

creat_txt(txt_filename)

contents = get_contents(cid)

download_excel(contents,xlsx_filename)

s = download_open_txt(contents,txt_filename)

text1 =washword(s)

wc = wordcloud(text1,img_filename,img_format)
# 显示词云
plt.imshow(wc, interpolation='bilinear')# 用plt显示图片
plt.axis("off") # 不显示坐标轴
plt.show() # 显示图片

# 保存到文件
wc.to_file("《梅西-改变世界二十大进球》弹幕.png")

食用方法

复制这段代码,放入一个文件夹中,接着在这个文件夹中放入你想作为背景图的图片。
注意!这里默认图片背景为白色,所以你的背景图的背景也应该为白色。可以自己修改,代码第95行可以指定颜色。
接着,用编译器打开这个文件夹,直接运行,按照终端输出的提示依次输入所需信息,就可以完成啦!

成果展示

初始界面

运行成功的界面(注意终端的输入)