先看下最终实现的效果
具体实现思路是
1.爬取带有弹幕信息的网页
2.处理爬取得到的内容并提取所需要的弹幕信息,然后写入文本中
3.通过词云库将文本处理成想要的图片
所需要用到的库
importrequestsfrom bs4 importBeautifulSoupimportpandas as pdimportreimportjiebafrom wordcloud importWordCloudfrom scipy.misc importimreadimport matplotlib.pyplot as plt
首先爬取想要的信息
ps(哔哩哔哩的弹幕全部保存在 http://comment.bilibili.com/122512779.xml 中,红色字体为该视频的cid,可以在当前视频页通过:查看网页源代码—ctrl+f查找cid-出现的第一个9位cid,来获取)
url = 'http://comment.bilibili.com/.xml' #对方的url
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}
res= requests.get(url=url, headers=header) #向对方网页发送请求
res.encoding = res.apparent_encoding #将编码设置为对方网页的编码,确保不会出现乱码
data = res.text #获取文本
soup = BeautifulSoup(data, 'lxml') #进行过滤操作,需要用到lxml包,无需导入。pip install lxml
d_list = soup.find_all('d') #获取所有的d标签中的内容
然后提取其中的弹幕,将其放入文本中,最后通过jieba库处理成词语
dlst =[]for d in d_list: #循环拿出所有的d标签
danmu ={}
danmu['弹幕'] = d.text #获取文本信息
#danmu['时间'] = datetime.datetime.now()
#danmu['路径'] = url
dlst.append(danmu)
df= pd.DataFrame(dlst) #转换成二维数组,类似于execl表格
f= open('sign.txt', 'w', encoding='utf-8') #打开文件
for i in df['弹幕'].values: #循环所有的文本信息
pat = re.compile(r'[一-龥]+') #定义过滤数据的规则,所有的汉字
filter_data = re.findall(pattern=pat, string=i) #执行过滤操作
f.write("".join(filter_data)) #写入文本
f.close()
f= open('sign.txt', 'r', encoding='utf8')
data=f.read()
result= " ".join(jieba.lcut(data))
f.close()
最后通过wordcloud库提供的方法将其转化为图片
color_mask = imread('th.png')
wc=WordCloud(
font_path=r'C:\Windows\Fonts\STKAITI.TTF',
width=1000,
height=800,
mask=color_mask,
background_color='black')
wc.generate(result) #读取文本数据
wc.to_file('bili.jpg') #输出图片
plt.imshow(wc)
plt.show()