美文网首页
软件工程师的"大案犊术"-爬取长安十二时辰弹幕+wordclou

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

作者: 青漾 | 来源:发表于2019-07-18 19:44 被阅读0次

    背景介绍

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

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

    情感分析

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

    相关文章

      网友评论

          本文标题:软件工程师的"大案犊术"-爬取长安十二时辰弹幕+wordclou

          本文链接:https://www.haomeiwen.com/subject/bhollctx.html