当前位置: 首页 > 后端技术 > Python

教你用Python抓取分析《向往的生活》弹幕

时间:2023-03-26 18:28:40 Python

教你像Python一样抓包分析。该剧的豆瓣评分也达到了7.9。这档综艺节目以明星艺人体验乡村生活为主线,融入美食、劳动、幽默元素,让人在观看的同时身临其境,仿佛真的进入了“向往的生活”。向往的生活豆瓣评分最近在看节目的时候看到弹幕上的讨论很热闹,突然想能不能把弹幕都爬下来分析一下。一方面探究弹幕数据抓取有没有什么特别之处,另一方面通过弹幕找出这个节目的口碑。下面以上周五刚更新的第五期为例,抓取弹幕数据。代码主要使用requests库,抓取结果存储在csv文件中。网页分析打开芒果TV网页版第五集,等待广告加载,同时打开chrome开发者工具的网络标签。因为要求很多,而且随着时间的推移,会越来越多。于是我采取了放空等待的办法。发现前面加载的图片大部分是图片,自然这不是我们的目的。过了一会儿,我发现了一个可疑的请求,如下图,点击它,果然出现了弹幕内容。间隔是60,猜测可能是表示一个间隔,每隔60s就会有一个新的请求。于是用filter过滤rdb开头的请求,发现这些都是弹幕,后面是60000的倍数,猜测是60000毫秒,也就是60秒。找到弹幕请求链接,过滤弹幕请求接下来,我们需要确认弹幕的翻页逻辑,也就是这些弹幕链接的统一规律。这里推荐一个非常好用的网页请求分析工具postman。不仅可以用来分析网页的请求参数,还可以提供不同语言的请求代码,稍加修改即可使用。将我们刚刚找到的链接粘贴到邮递员中。如图,可以看到请求的参数,点击发送按钮可以看到请求的结果。由于参数较多,可以考虑去掉一些无用的参数。最后发现只需要保留vid、cid、time这三个参数。猜测vid代表节目id,cid代表视频id,time应该是请求时间,是一个相对值。并且在请求结果中,每条弹幕的时间都大于时间值。结合上面的分析逻辑可以得出,每次请求结果都是请求时间60s以内的弹幕。如果我们想要获得所有的弹幕,我们可以通过改变时间的值来实现。最小时间值应为0,最大值应为最接近视频持续时间的60000倍数的毫秒数。这里的节目时长为89:49。经过验证,确实如此,接下来我们就可以使用代码来实现了。使用postman测试请求参数。使用postman测试时间请求参数代码。使用requests构造网络请求,使用循环控制翻页,抓取所有弹幕。解析返回的json数据,使用pandas存储到Excel中。详细代码如下,共45行。importrequestsimportpandasaspdimporttimeimportdatetimefromfake_useragentimportUserAgentua=UserAgent()url="https://galaxy.bz.mgtv.com/rdbarrage"rdb_content={'id':[],'type':[],'uid':[],'content':[],'add_time':[],'ups':[]}count=0print("取开始时间:{}".format(datetime.datetime.now().strftime('%Y-%m-%d%H:%M:%S')))foriinrange(0,91):querystring={"version":"2.0.0","vid":"5683459","cid":"328724","time":i*60000}headers={'User-Agent':ua.random}try:response=requests.request("GET",url,headers=headers,params=querystring).json()items=response['data']['items']ifitemsisNone:print("刷取完成!弹幕数量{}".format(count))breakelse:foriteminitems:rdb_content['id'].append(item.get('id'))#弹幕idrdb_content['type'].append(item.get('type'))#弹幕类型rdb_content['uid'].append(item.get('uid'))#用户idrdb_content['content'].append(item.get('content'))#弹幕内容rdb_content['add_time'].append(item.get('time'))#弹幕时间rdb_content['ups'.append(item.get('up',0))#d弹幕中的点赞数count=count+1print("抓取第{}分钟的弹幕...,当前弹幕数{}".format(i+1,count))time.sleep(5)except:print("第{}分钟爬取弹幕失败!当前弹幕数为{}".format(i+1,count))continuerdb_df=pd.DataFrame(rdb_content)rdb_df.to_csv('rdb.csv',index=None)运行效果截图:从运行效果可以看出弹幕数量达到了将近3万个在这次抓取期间,而这个时候,程序更新时间不到2天,一定程度上可以反映程序的受欢迎程度。接下来我们对弹幕数据做一些深入的分析,从数据的角度来看这个节目。数据可视化上面爬取的数据中,有一些字段缺失,但是比例很小,所以采用删除的方式处理,最后剩下28602个有效数据。数据预处理-删除重复值01不同时间段弹幕数量分布程序时长约90分钟。我们来看看以1分钟和10分钟为单位的弹幕数量。可以看到,虽然随着时间的推移,弹幕数量有所波动,但总体来说,每一次的弹幕都没有出现剧烈的波动,这也反映出该节目能够持续保持较高的热度。每分钟弹幕数量直方图.png每十分钟弹幕数量直方图.png02不同时长的弹幕数量分布和不同弹幕时长的直方图.png可以看出大多数弹幕的长度都集中在10个字左右,偏向口语化。这也符合我们的认知。10个字左右就足以表达用户看剧的心情和看法了。当然也有用户认为还不算太麻烦,弹幕的数量达到了30多个字,也有极少数长度超过50字的弹幕。出于好奇,我们可以看看长度超过50的弹幕里都说了些什么。如下图,我们多少能感觉到观众们正在非常用心地欣赏节目。长度超过50个弹幕.png03弹幕点赞数分布。点赞数区间.png可以看出,近四分之一的弹幕没有点赞。近60%的弹幕点赞数低于20,点赞数超过20的弹幕不到20%。我们也可以看看点赞数超过300的弹幕说了什么,但是从弹幕中我们可以感受到节目整体的欢乐气氛。300多条弹幕.png04用户发的弹幕数、点赞数、总弹幕数弹幕数、点赞数、弹幕总字数可以看出,点赞数高的用户弹幕数量多,相应的字数也多。网友弹幕对比.png05弹幕中Emoji的使用.png06词云图将弹幕切分,绘制出如下词云图。弹幕词云图看着这张词云图,瞬间感觉喜悦溢出了屏幕。耳边仿佛能听到断断续续的“哈哈哈哈”声。群众的眼睛是雪亮的。能让人如此开心的节目自然会火起来。难怪。至此,我们基本完成了《向往的生活》第五集弹幕的抓拍和简单的可视化分析。您可以自己分析和发现更多有趣的点。本来我也调用了百度的情绪分析API来分析弹幕的情绪倾向,但是效果好像不是很好,所以就没有发了。感兴趣的朋友可以看看代码。欢迎关注公众号“超哥的杂货店”,后台回复“向往的生活”获取源码。祝大家生活愉快!