最近迷上了指环王加霍比特人,今天终于看完了。然后挺好其弹幕内容。然后爬取弹幕内容并进行分析
我们发现多有的弹幕都在一个这个里面
这就是一个cid了 cid可以在源代码中找到
emmm。到啦这里你们是不是想到了什么
对,是的只要找到cid就可以获取到弹幕内容了。很聪明
看代码
代码是
#_*_coding:utf-8_*_
#作者 : Deth
#创建时间 : 2020/4/9 23:27
#文件 : BV号弹幕. py
# IDE : PyCharm
#_*_coding:utf-8_*_
#作者 : Deth
#创建时间 : 2020/4/9 20:41
#文件 : demo. py
# IDE : PyCharm
import requests
import re
import lxml
from bs4 import BeautifulSoup
import jieba
from pyecharts.charts import *
import pyecharts.options as opt
class Bidanmu(object):
def __init__(self):
self.url = 'http://comment.bilibili.com/{}.xml'
self.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36(KHTML, like Gecko) '
'Chrome/52.0.2743.116 Safari/537.36'}
def get_cid(self,urlbv):
"""
根据你传入的urlbv获取你的cid的值
:param urlbv:
:return:
"""
r = requests.get(url=urlbv, headers=self.headers) #请求网址进行源码查找cid
pattern_cid = '\"bvid\":\".*?\",\"cid\":(\d+),' #匹配cid
pattern_title = 'title=\"(.*?)\"' #匹配文章标题
self.cid = re.search(pattern_cid, r.text).group(1)
self.title = re.search(pattern_title,r.text).group(1)
print(self.title,self.cid)
self.getinfo()
return
def getinfo(self):
"""
获取弹幕内容
"""
data = requests.get(url=self.url.format(self.cid))
data.encoding = 'utf-8'
soup = BeautifulSoup(data.text,'lxml')
infos = soup.find_all('d')
self.comments = [info.text for info in infos]
self.save()
return
def save(self):
"""
保存弹幕内容
:return:
"""
# comments = self.getinfo()
with open('./txt/{}.txt'.format(self.title),'a+',encoding='utf-8') as f:
for i in self.comments:
f.write(i)
f.write('\n')
self.danmufenxi()
def danmufenxi(self):
"""
进行弹幕分析
:return:
"""
dict = {}
text = open('./txt/{}.txt'.format(self.title),'r',encoding='utf-8').read()
txt = jieba.lcut(text,cut_all=False) # 利用jieba进行分词
#对分好词进行筛选 大于五的不要
for word in txt:
if len(word) >=5:
continue
else:
dict[word] = dict.get(word,0) +1
li = list(dict.items())
# print(li)
li.sort(key=lambda x:x[1],reverse=True) #进行排序
x_data,y_data = [],[]
for i in li[:20]:
x_data.append(i[0])
y_data.append(i[1])
# print(x_data,y_data)
print(li)
#绘制柱状图
bar = (
Bar()
.add_xaxis(x_data)
.add_yaxis('次数',y_data)
.set_global_opts(title_opts=opt.TitleOpts(title='{}词频统计柱状图'.format(self.title[:10])),
datazoom_opts=opt.DataZoomOpts(range_start=0))
# .render('{}词频统计.html'.format(self.title))
)
#绘制词云图
ciyun = (
WordCloud()
.add(series_name='',data_pair=li[:50],word_size_range=[6,66])
.set_global_opts(title_opts=opt.TitleOpts(title='{}词频统计词云图'.format(self.title[:10])))
)
#进行图标组合
page = Page(layout=Page.DraggablePageLayout)
page.add(
bar,
ciyun,
)
# 生成html文件
page.render('./html/{}.html'.format(self.title))
if __name__ == '__main__':
bv = input('请输入bv号:')
urlbv = 'https://www.bilibili.com/{}'.format(bv)
# urlbv = " " # 如果不知道bv号就直接输入网址把上面的取消
bd = Bidanmu()
bd.get_cid(urlbv)
程序路径
输出
柱状图
词云图
关于bv号