Py学习  »  Python

Python爬取15万条《我是余欢水》弹幕,还原一个丧到极致的中年人生

CDA数据分析师 • 4 年前 • 482 次点击  




 CDA数据分析师 出品  

作者:Mika

数据:真达  

后期:泽龙 

【导语】:今天我们聊聊热干面,Python技术部分可以直接看第四部分。公众号后台,回复关键字“余欢水”获取完整数据。

Show me data,用数据说话

今天我们聊聊 《我是余欢水》

点击下方视频,先睹为快:


他来了他来了,正午阳光带着新剧走来了。

 

年初时我们用数据解读了几部热度高,但评分差强人意的国产剧,而最近正午阳光带着两部新剧来了,《我是余欢水》和《清平乐》,截止到目前为止,这两部剧在豆瓣分别为7.5分和7.9分,算是非常高的评分了。

 

今天我们就来跟大家聊一聊其中这部《我是余欢水》。

 


01


这些年 我们追过的

正午阳光作品

 

都说作为“国剧门脸”,正午阳光出品,必属精品,每一部都让人看得废寝忘食。


我们先看到近年来正午阳光出品的作品,举几个例子你就知道了:

 

2019年 都挺好 7.8分

2018年 大江大河 8.8分

2016年 鬼吹灯之精绝古城 8.0分

2016年 欢乐颂 7.4分

2015年 琅琊榜 9.3分

2015年 伪装者 8.5分

 


这些耳熟能详的热门剧集,分数都在7.5分以上,无论是剧情、演技、服化道都十分讲究,真的算得上是国产剧中的良心制作了。

 


02



《我是余欢水》

史上最惨男主的逆袭之路

 

这次《我是余欢水》讲的是个什么故事呢?

 

《余欢水》根据小说《如果没有明天》改编,由《都挺好》编剧王三毛、王磊父子改编。由郭京飞、苗苗、高露、岳旸等主演。

 

余欢水(郭京飞饰)是公司里业绩最差的员工,退让隐忍、得过且过是他的生存法则,直到嫌他窝囊的妻子提出离婚,余欢水仍未做出改变。某日借酒浇愁后,余欢水身体不适查出癌症,万念俱灰的他破罐子破摔,性情大变,还在阴差阳错之下,成了见义勇为的英雄,到达人生巅峰。但阴差阳错的命运仍在继续,危机和挑战接踵而至。


这部剧在播出后备受好评,首先一改普通国产剧动辄五六十集的巨幅,这部余欢水仅仅12集,短小精悍,利落明快。加上主角们的演技都在线,剧情紧凑不拖沓,故事情节环环相扣,让人看得酣畅淋漓,十分过瘾。

 


03



 《我是余欢水》

大家都在怎么看?

 


豆瓣评分:

目前在豆瓣上,《我是余欢水》为7.5分。共有11万的人给出了评分,其中百分之30.8%给出了5星,40%的给出了4星,是非常不错的成绩。

 


知乎问答


我们分析整理了知乎上关于《我是余欢水》的问答,可以看到:

 

我们把回答的角度主要分为故事、角色和剧作三个角度。


 

关于剧作

讨论的角度主要是“网络短剧”的新形式十分有新鲜感,“结构紧凑”。同时还是那熟悉的“正午配方”,许多正午阳光其他剧的演员出现,总让有种“熟脸连连看的”的感觉,很是有趣。

 

关于故事

很多人表示,《我是余欢水》显然讲的是“一个社畜的故事”,余欢水在职场的力不从心与无奈让人同情。剧中把余欢水遭遇车祸、离婚、误诊的窝囊人生悲剧用“喜剧效果”来展现。

 

关于角色

男主余欢水、他的老婆甘虹、以及办公室三人组赵觉民、魏总等人都是讨论的焦点。

 


04



Python分析15万弹幕 

看看大家都在说些什么

 

那么观众们对《余欢水》和剧中主要人物都是怎么看的呢?

 

我们爬取了在腾讯视频上本剧的弹幕,共计150252 条弹幕,每集平均就有 12521 条。

 

先看到主要结论:



大家有多爱发弹幕

再细看到每人弹幕发送的数量:

根据数据,在发送弹幕的人群中,63.7%的人发了一条弹幕,16.9%发了两条,少数比较话痨的人发了10条以上的弹幕,占比3.63%。



哪些弹幕点赞最多?


点赞最高的弹幕也特别有意思,比如:


余欢水——国家一级退堂鼓表演艺术家

记住!这是一瓶改变命运的假酒

你摔倒了,我们很同情马路

对不起,但是真的好想笑


真是让人感叹,这届网友实在是太有才了。余欢水都这么惨了,你们还嘲笑他,真是太坏了。

 


弹幕里大家都在讨论谁?


根据分析我们可以看到,讨论最多的当然是我们的男主了,有3974条弹幕都是关于余欢水的。


讨论最多的第二名是谁?你们绝对想不到,居然是公司三人组,余欢水的上司之一梁安妮,收获了2158条弹幕。比余欢水老婆甘虹的弹幕高出近一倍。

 


人物弹幕画像:

 

我们再根据主要人物的弹幕,整理出各个人物的画像,首先是余欢水,大家提到最多的就是演员郭京飞的演技,吊打一众小鲜肉,妥妥的用实力说话。

 

余欢水


余欢水也被观众戏称为“好惨一男的”,各种“窝囊”、“怂”、“惨”“令人心疼”,从中也看到了人到中年的无奈与现实。除此之外大家也疯狂串戏到了《都挺好》里的“苏明成”,感觉男主这么惨,看来编剧是想让余欢水给苏明成还债呀。

 

甘虹


我们再看到余欢水老婆甘虹的画像,大家提到最多的关键词是“大嫂”,要知道在都挺好里,高露演的是郭京飞的大嫂,这一转眼两人从叔嫂演成了夫妻。


梁安妮

看到收获弹幕第二高的角色——梁安妮。观众们都沉迷于她的演技,“性感”、“撩人”“好看”等都是关键词。认为这个角色是妥妥的魅力担当,演员高叶把这个人物的气质拿捏的死死的,果然漂亮小姐姐大家都喜欢。


 赵觉民


再聊聊正午的金牌配角岳旸。听名字可能不太熟悉,但看脸就知道了,正午的剧里哪哪都有他。《我是余欢水》里,他演的是的领导赵觉明。他在《鬼吹灯之精绝古城》里演的是“大金牙”;到了《欢乐颂》,他演的是樊胜美的哥哥"樊胜英"。在弹幕里这两个角色名也常常被大家提到。



下面看到具体分析过程


此次分析我们获取腾讯视频的弹幕并进行数据数据,数据获取部分的具体思路如下:


  1. 分析网站URL规律,获取弹幕数据URL请求接口和请求方式
  2. 分析弹幕URL规律分析,获取翻页规律


数据获取

分析网站和数据定位



打开腾讯视频《我是余欢水》视频随便选取一集,观察我们需要抓取的弹幕,可以明显看出来弹幕不是在视频上的而是浮动在视频上面,而且弹幕在视频播放之后才滚动加载,所以我们大概能得出弹幕是JS异步加载的。


我们使用谷歌浏览器,右键审查元素,观察Network的请求,播放开始后出现了大量请求,我们在js选项下发现了一个比较特殊的请求 "danmu" ,打开这个请求后发现这就是我们要的弹幕数据。



切换到Headers下获取到弹幕数据的URL地址:

https://mfm.video.qq.com/danmu?otype=json&callback=jQuery19106242753790025646_1587109875909&target_id=5035751775%26vid%3Dy0033grdnk8&session_key=93970%2C2557%2C1587109877&timestamp=195&_=1587109875933


弹幕URL规律分析

首先,我们尝试删掉目标网址中不影响最终结果的部分参数,从而精简出网址如下:

https://mfm.video.qq.com/danmu?target_id=5035751775&vid=y0033grdnk8&timestamp=15


将第二,三个请求拿出来精简:

https://mfm.video.qq.com/danmu?target_id=5035751775&vid=y0033grdnk8&timestamp=45

https://mfm.video.qq.com/danmu?target_id=5035751775&vid=y0033grdnk8&timestamp=75


对比很容易找到规律,从第一页到第二页,timestamp值从15变到了45,第二页到第三页从45到75,target_id不变。


这个规律我们可以大胆猜测这个 timestamp 值是控制页数的,并且起始值是15每30秒更新一次。


一集视频弹幕有多少页呢?如何获取最后一个timestamp的值。


有一个小技巧,我们在构建URL地址的时候指定一个足够大的结尾步长,然后当获取不到内容时终止循环即可。


不同集之前我们需要寻找target_id的代码规律,此处暂不做赘述。


具体代码如下:


# 导入所需库
import requests
import json
import time
import parsel
import pandas as pd

def get_danmu_one_page(url_dm):
    """
    :param url_dm: 视频弹幕URL地址
    :return: 一页的弹幕数据
    """

    # 添加headers
    headers = {
        'user-agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36',
        'cookie''你的电脑登录后的cookie信息',
        'referer''https://v.qq.com/x/cover/mzc00200bll9mha.html',
    }

    # 发起请求
    try:
        r = requests.get(url_dm, headers=headers, timeout=3)
    except Exception as e:
        time.sleep(3)
        r = requests.get(url_dm, headers=headers, timeout=3)

    # 解析网页
    data = r.json()['comments']

    # 获取评论ID
    comment_id = [i['commentid'for i in data]
    # 获取用户名
    oper_name = [i['opername'for i in data]
    # 获取会员等级
    vip_degree = [i['uservip_degree'for i in data]
    # 获取评论内容
    content = [i['content'for i in data]
    # 获取评论时间点
    time_point = [i['timepoint'for  i in data]
    # 获取评论点赞
    up_count = [i['upcount'for i in data]

    # 存储数据
    df_one = pd.DataFrame({
        'comment_id': comment_id,
        'oper_name': oper_name,
        'vip_degree': vip_degree,
        'content': content,
        'time_point': time_point,
        'up_count': up_count
    })
    return df_one


def get_danmu_all_page(target_id, vid):
    """
    :param target_id: target_id
    :param vid: vid
    :return: 所有页弹幕
    """

    df_all = pd.DataFrame()
    # 记录步数
    step = 1
    for time_stamp in range(1510000030):  # 右侧设置一个足够大的数
        try:  # 异常处理
            # 构建URL
            url_dm = 'https://mfm.video.qq.com/danmu?target_id={}&vid={}&timestamp={}'.format(target_id, vid, time_stamp)
            # 调用函数
            df = get_danmu_one_page(url_dm)
            # 终止条件
            if df.shape[0] == 0:
                break
            else:
                df_all = df_all.append(df, ignore_index=True)
                # 打印进度
                print('我正在获取第{}页的信息'.format(step))
                step += 1
                # 休眠一秒
                time.sleep(1)
        except Exception as e:
            continue

    return df_all


获取到的数据如下所示,共计爬取了 150252 条弹幕(每集平均12521条,每30s的间隔爬取),来看看弹幕下的余欢水。


主要包含了以下信息:集数、评论ID、用户名、vip等级、评论内容、评论时间点和评论点赞。



关注CDA数据分析师公众号
回复关键字“ 余欢水” 
获取详细数据代码

CDA数据分析师 


本文出品:CDA数据分析师(ID: cdacdacda)


📚推荐阅读 READ MORE

(点击下方图片阅读)

全网谁家热干面销量最高?教你用Python轻松获取

为湖北带货,1.2亿人围观!朱广权是怎么凭借播新闻出圈的?

 

📌CDA课程咨询


喜欢本篇内容请点个“在看”哦!❤️

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/62010
 
482 次点击