python爬虫爬取B站视频字幕,词频统计,使用pyecharts画词云(wordcloud)


我们使用beatifulsop爬取到B站视频的字幕:https://www.cnblogs.com/becks/p/14540355.html

然后将爬取的字幕,使用pandas处理后写到CSV文件中:https://www.cnblogs.com/becks/p/14738496.html

 

本篇,实现将字幕分词处理后词云化显示,可更加直观的了解字幕的核心词汇都有哪些

思路,爬到字幕后,将字幕分词处理,统计词频(所有词的出现频率),然后根据出现频率设置词的显示大小

 

需要用到以下库

from bs4 import BeautifulSoup#爬虫
import requests
import pandas as pd#数据处理
import jieba#分词
from collections import Counter#分词后词频统计
from pyecharts.charts import WordCloud#词云

如果出现下图中no module named‘pandas’,提示,即缺少上面需要的库,可通过cmd执行pip install xxx(这里是pandas)来安装

 

 

 

安装pyecharts时需要注意,本案例使用的是1.9.0版本,0.x.x版本与1.9.0版本差别很大互不兼容,可能会出现很多错误或者方法不可用,请注意版本

 

 

爬取和数据提取在前面两篇文章已经介绍过了,直接贴代码部分

#获取弹幕
url = 'http://comment.bilibili.com/309778762.xml'
html = requests.get(url)
html.encoding='utf8'
soup = BeautifulSoup(html.text,'lxml')
results = soup.find_all('d')

#对弹幕数据进行处理,主要是提取弹幕内容,去掉标签和其他html符号
comments = [comment.text for comment in results]#从爬取的数据中取出弹幕数据,返回文本内容

 

 分词和统计词频,中间的步骤如果需要了解的话,建议每一步后面print一下定义的变量,这样才可以更加直观的看到数据在所有步骤中是如何转换的

#分词及统计词频
text = ''.join(comments)#对获取的comments数据进行处理,去除中间的‘,’,具体参考https://blog.csdn.net/weixin_42986099/article/details/83447926
words = list(jieba.cut(text))#jieba分词
ex_sw_words = []
for word in words:
    if len(word)>1:#去掉字数不足2个的词
        ex_sw_words.append(word)
c = Counter()
c = Counter(ex_sw_words)#统计分词后所有词语出现的频率
wc_data = pd.DataFrame({'word':list(c.keys()), 'counts':list(c.values())}).sort_values(by='counts', ascending=False).head(100)
#重建数据,具体参考https://www.cnblogs.com/andrew-address/p/13040035.html

a = wc_data['word'].values.tolist() b = wc_data['counts'].values.tolist() name_tulpe = list(zip(a,b))#创建集合,使数据满足wordcloud对传入数据的要求

 重建数据及创建集合的另外一种写法

c = Counter()
c = Counter(ex_sw_words)#统计分词后所有词语出现的频率

list_1=[]
list_2=[]
for i in c.keys():
    list_1.append(i)
for h in c.values():
    list_2.append(h)
name_tulpe = list(zip(list_1,list_2))

 

生成词云,wordcloud 对传入参数有严格的要求,具体参考文内的链接

#wordcloud对传入参数的要求参考
# https://gallery.pyecharts.org/#/WordCloud/wordcloud_custom_mask_image
# https://pyecharts.org/#/zh-cn/basic_charts?id=wordcloud:词云图

#将分词和统计词频后的内容用词云显示出来
wordcloud = WordCloud()
wordcloud.add("",name_tulpe,word_size_range=[15, 80])
wordcloud.render('wordcloud.html')

 

执行脚本后生成的词云效果

 

附全部脚本

# -*- coding: utf-8 -*-

from bs4 import BeautifulSoup#爬虫
import requests
import pandas as pd#数据处理
import jieba#分词
from collections import Counter#分词后词频统计
from pyecharts.charts import WordCloud#词云

#获取弹幕
url = 'http://comment.bilibili.com/309778762.xml'
html = requests.get(url)
html.encoding='utf8'
soup = BeautifulSoup(html.text,'lxml')
results = soup.find_all('d')

#对弹幕数据进行处理,主要是提取弹幕内容,去掉标签和其他html符号
comments = [comment.text for comment in results]#从爬取的数据中取出弹幕数据,返回文本内容

#分词及统计词频
text = ''.join(comments)#对获取的comments数据进行处理,去除中间的‘,’,具体参考https://blog.csdn.net/weixin_42986099/article/details/83447926
words = list(jieba.cut(text))#jieba分词
ex_sw_words = []
for word in words:
    if len(word)>1:#去掉字数不足2个的词
        ex_sw_words.append(word)
c = Counter()
c = Counter(ex_sw_words)#统计分词后所有词语出现的频率
wc_data = pd.DataFrame({'word':list(c.keys()), 'counts':list(c.values())}).sort_values(by='counts', ascending=False).head(100)#重建数据,具体参考https://www.cnblogs.com/andrew-address/p/13040035.html
a = wc_data['word'].values.tolist()
b = wc_data['counts'].values.tolist()
name_tulpe = list(zip(a,b))#创建集合,使数据满足wordcloud对传入数据的要求

#wordcloud对传入参数的要求参考
# https://gallery.pyecharts.org/#/WordCloud/wordcloud_custom_mask_image
# https://pyecharts.org/#/zh-cn/basic_charts?id=wordcloud:词云图

#将分词和统计词频后的内容用词云显示出来
wordcloud = WordCloud()
wordcloud.add("",name_tulpe,word_size_range=[15, 80])
wordcloud.render('c:/wordcloud.html')

 

 

关于词云绘制的另外一个案例,文内没有词频操作,但是可以自定义词云的显示样式,相对来说较简单

https://www.cnblogs.com/wkfvawl/p/11585986.html


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM