软件工程师的"大案犊术"-爬取长安十二时辰弹幕+wordcloud展示

背景介绍

本人一般喜欢看电影,一般不怎么看电视剧,但最近优酷里出现了一部让我惊呼的电视剧--《长安十二时辰》,这部剧在剧情,在细节的处理上,在配乐,都让我惊呼。剧情虽是虚构,但是剧中大多历史人物都可以与历史人物一一对应,比如神童李泌,贺知章,以及杨太真(杨玉环)。剧情虽虚构,但确实是建立在特定的历史环境下的,更让我震惊的是,剧中片尾曲以诗仙太白传世名作《清平调》谱曲而成,真的是古风满满,令人惊呼,这部剧我给了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()
最后结果

从这些词中,我们可以看到崔器,长安出现是很多的。也可以猜到剧情。

情感分析

请关注我的下一篇博客,将会对这些数据进行情感倾向的分析,并进行统计,分析出,这一集是喜剧还是悲剧,观众对这一集的看法。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容