背景介绍
本人一般喜欢看电影,一般不怎么看电视剧,但最近优酷里出现了一部让我惊呼的电视剧--《长安十二时辰》,这部剧在剧情,在细节的处理上,在配乐,都让我惊呼。剧情虽是虚构,但是剧中大多历史人物都可以与历史人物一一对应,比如神童李泌,贺知章,以及杨太真(杨玉环)。剧情虽虚构,但确实是建立在特定的历史环境下的,更让我震惊的是,剧中片尾曲以诗仙太白传世名作《清平调》谱曲而成,真的是古风满满,令人惊呼,这部剧我给了9分。
长安十二时辰剧中提到了一个词,叫做“大案犊术”,这个术可以通过对真实数据的分析,从而推测出事情的发展。我仔细想想,这不就是我们的大数据技术吗。为此突发奇想,写了这篇博客,本文主要通过爬取优酷《长安十二时辰》-第二十三集的弹幕,在通过jieba分词生成wordcloud图。再根据弹幕的内容进行情感分析统计,分析这一集的情感倾向。
爬取优酷弹幕部分
第二十三集地址:第二十三集地址
进入地址后,首先我们找找看弹幕的网络请求:复制一条弹幕,在network里搜索(在network里按ctrl+f,进入搜索模式),找到相应的网络请求;
搜索弹幕请求import os
import time
import json
import random
import pylab
import jieba
import requests
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from cloudword.pt import jsonp_func_to_json_obj
url = 'https://service.danmu.youku.com/list?jsoncallback=jQuery111205559353742668822_1563440799774&mat=0&mcount=1&ct=1001&iid=1067446903&aid=322943&cid=97&lid=0&ouid=0&_=1563440799777'
header = {'user-agent': 'Mozilla/5.0',
'Referer': 'https://v.youku.com/v_show/id_XNDI2OTc4NzYxMg==.html?spm=a2ha1.12675304.m_2556_c_8261.d_1&s=efbfbd78efbfbd5cefbf&scm=20140719.manual.2556.show_efbfbd78efbfbd5cefbf'}
try:
r = requests.get(url, headers=header)
#发送请求
r.raise_for_status()
#检验是否成功
r_json_obj = jsonp_func_to_json_obj(r.text)
r_json_result = r_json_obj['result']
#转成json
for r_json_danmu in r_json_result:
print(r_json_danmu['content'])
#打印
except:
print('爬取失败')
运行结果
我们总共爬到了360条数据,这对一集这么热门的电视剧难免有些少啊,我们分析一下请求的url,看看是不是有些什么变化,搜索另外一条弹幕看看
第一条 'https://service.danmu.youku.com/list?jsoncallback=jQuery111205559353742668822_1563440799774&mat=0&mcount=1&ct=1001&iid=1067446903&aid=322943&cid=97&lid=0&ouid=0&_=1563440799777'
第二条:https://service.danmu.youku.com/list?jsoncallback=jQuery111205559353742668822_1563440799774&mat=14&mcount=1&ct=1001&iid=1067446903&aid=322943&cid=97&lid=0&ouid=0&_=1563440799795
我们可以惊奇的发现,mat值不一样,仔细分析一手,原来mat传回来的就是每分钟的弹幕,原来优酷每分钟发送一个请求,返回每分钟的弹幕,下一分钟再发。
发现这个规则后,我们开始写python模拟时间请求,我们通过请求中的conut
Count代表返回的条数我们把原先写的内容封装成一个函数,
import os
import time
import json
import random
import pylab
import jieba
import requests
import matplotlib.pyplot as plt
from wordcloud import WordCloud
from cloudword.pt import jsonp_func_to_json_obj
# 词云字体
WC_FONT_PATH = './fonts/simhei.ttf'
# 弹幕数据保存文件
DANMU_FILE_PATH = 'xx.txt'
def spider_danmu(page):
url = 'https://service.danmu.youku.com/list?jsoncallback=jQuery111205559353742668822_1563440799774&mat=%s&mcount=1&ct=1001&iid=1067446903&aid=322943&cid=97&lid=0&ouid=0&_=1563440799777' %(page)
header = {'user-agent': 'Mozilla/5.0',
'Referer': 'https://v.youku.com/v_show/id_XNDI2OTc4NzYxMg==.html?spm=a2ha1.12675304.m_2556_c_8261.d_1&s=efbfbd78efbfbd5cefbf&scm=20140719.manual.2556.show_efbfbd78efbfbd5cefbf'}
try:
r = requests.get(url, headers=header)
r.raise_for_status()
except:
print('爬取失败')
return 0
# 提取json数据并转为json对象
r_json_obj = jsonp_func_to_json_obj(r.text)
# 如果请求的总数count=0则说明这集的弹幕爬取完成
if not r_json_obj['count']:
return 0
# 获取弹幕列表数据
r_json_result = r_json_obj['result']
# 遍历评论对象列表
for r_json_danmu in r_json_result:
# 以追加模式换行写入每条评价
with open(DANMU_FILE_PATH, 'a+',encoding='utf-8') as file:
file.write(r_json_danmu['content'] + '\n')
# 打印弹幕对象中的评论内容
# print(r_json_danmu['content'])
return 1
i = 0
while spider_danmu(i):
# 模拟用户浏览,设置一个爬虫间隔,防止ip被封
time.sleep(random.random() * 5)
i += 1
print('爬取完毕')
运行,数据就已经到手了。注意txt文件要改成utf8的形式
弹幕数据制作wordcloud
首先用jieba分词
def cut_word():
"""
对数据分词
:return: 分词后的数据
"""
with open(DANMU_FILE_PATH, encoding='utf-8', errors='ignore') as file:
comment_txt = file.read()
wordlist = jieba.cut(comment_txt, cut_all=False)
wl = " ".join(wordlist)
print(wl)
return wl
生成分词结果
根据分词生成词云:
def create_word_cloud():
"""
wc = WordCloud(background_color="white", max_words=900, width=940, height=400, scale=10,
max_font_size=50, random_state=42,font_path=WC_FONT_PATH)
# 生成词云
wc.generate(cut_word())
wc.to_file('1.png')
生成的结果如图,
第一次分词结果这里面有很多词是垃圾词,我们把他们去掉。
def create_word_cloud():
"""
生成词云
:return:
"""
# 数据清洗词列表
stop_words = ["贺电",'发来','书生','出来','现在','有点','可以','哈哈', '哈哈哈', '哈哈哈哈', '啊啊啊', '什么', '为什么', '不是', '就是', '还是', '真是', '这是', '是不是',
'应该', '不能', '这个', '电视','电视剧', '怎么',
'这么', '那么', '那个', '没有', '不能', '不知', '知道',"脑子","这剧","告诉",'我们',"打卡","导演"]
wc = WordCloud(background_color="white", max_words=900, width=940, height=400, scale=10,
max_font_size=50, random_state=42, stopwords=stop_words, font_path=WC_FONT_PATH)
# 生成词云
wc.generate(cut_word())
wc.to_file('1.png')
# 在只设置mask的情况下,你将会得到一个拥有图片形状的词云
# pylab.imshow(wc, interpolation="bilinear")
# pylab.axis("off")
# pylab.figure()
# pylab.show()
create_word_cloud()
最后结果
从这些词中,我们可以看到崔器,长安出现是很多的。也可以猜到剧情。
情感分析
请关注我的下一篇博客,将会对这些数据进行情感倾向的分析,并进行统计,分析出,这一集是喜剧还是悲剧,观众对这一集的看法。
网友评论