ITPub博客

首页 > 应用开发 > Python > 爬一下《中餐厅》绿大暗:我不要你觉得,我只要我觉得

爬一下《中餐厅》绿大暗:我不要你觉得,我只要我觉得

原创 Python 作者:千锋Python唐小强 时间:2019-09-17 13:13:52 0 删除 编辑

最近总是听身边朋友同事说: 我不要你觉得,我只要我觉得!我知道他们肯定是在玩梗,哼~说实话,第一次听到到这话的时候,竟然觉得有点蛮不讲理的霸道,emm,有些 油腻的霸道,嗯嗯,就是这样!为了不表现出我的无知,我赶紧上网查了一下,b站的鬼畜区,终于让我找到了 真相

原来是绿大暗的 明言 绿大暗仅凭一己之力,将综艺节目《中餐厅3》推上了热门,成为了本季度当之无愧的综艺之王,“我不要你觉得,我只要我觉得”, “别说话,听我的”等都是绿大暗的经典名言,这些名言被广大网友称为 “明学”,甚至隐隐与“六学”齐名,两开花。

对一部视频作品,如果说 评论是观众观看后的沉思,那么 弹幕就是吃瓜群众情感的实时流露,为了一窥“明学”的真谛,我打算爬一爬 《中餐厅3》的弹幕数据,做一个情感分析。

一、分析网页爬数据

1.确认加载方式

《中餐厅3》在芒果TV独播,打开Chrome浏览器,访问第1集的链接https://www.mgtv.com/b/330026/6086563.html,通过禁用页面javaScript发现页面视频和弹幕都无法加载,并且右键-查看页面源码,搜索不到弹幕的文字,说明数据是异步加载的。

爬一下《中餐厅》绿大暗:我不要你觉得,我只要我觉得

2.抓包分析

打开刚刚关闭的javaScript,重新加载页面,F12打开开发者工具,仔细查找XHR或JS最终在js中找到了弹幕数据,链接是这样的

https://galaxy.bz.mgtv.com/rdbarrage?version=2.0.0&vid=6086563&abroad=0&pid=&os=&uuid=&deviceid=&cid=330026&ticket=&time=60102&mac=&platform=0&callback=jsonp_1568127366004_84552

爬一下《中餐厅》绿大暗:我不要你觉得,我只要我觉得

弹幕数据是json格式,但是伪装成了jQuery藏在JS里面。

爬一下《中餐厅》绿大暗:我不要你觉得,我只要我觉得

3.链接分析

从抓包的地址看,弹幕的真实请求地址是https://galaxy.bz.mgtv.com/rdbarrage?,其后是一堆相关的参数,相关的参数见下图

爬一下《中餐厅》绿大暗:我不要你觉得,我只要我觉得

上图中许多参数字段是没有值的,所以我们试着简化请求地址链接,最终发现https://galaxy.bz.mgtv.com/rdbarrage?vid=6086563&cid=330026&time=60102仍然可以请求成功,也就是说只保留vid,cid.time3个参数就可以了

爬一下《中餐厅》绿大暗:我不要你觉得,我只要我觉得

接下来分析vid,cid.time这3个参数

首先我们把前3期的url列出来

第1期:https://www.mgtv.com/b/330026/6086563.html

第2期:https://www.mgtv.com/b/330026/6128068.html

第3期:https://www.mgtv.com/b/330026/6168375.html

发现上述url中330026没有变化,只有后面的一串文字发生了变化,通过和下图中参数对比,发现url中第一个不变的数字串就是我们要寻找的vid,而后面的数字串就是cid,不难看出,vid是“中餐厅3”在芒果TV平台中的编号,而cid是中餐厅3不同期数的编号。

爬一下《中餐厅》绿大暗:我不要你觉得,我只要我觉得

那么参数time是什么?

首先通过time英文的本身来看,她是一个和时间有关系的变量,那么可以有以下猜测

  1. time是本波弹幕开始加载的时间;
  2. time是本波弹幕播放的总时长

然后观察4条相邻的弹幕js数据,当前弹幕的next的值和下一条弹幕js文件请求的time值非常接近,于是尝试把

https://galaxy.bz.mgtv.com/rdbarrage?vid=6086563&cid=330026&time=120083中的time值修改为120000,然后再次请求数据,发现仍然可以成功请求到对应的数据

爬一下《中餐厅》绿大暗:我不要你觉得,我只要我觉得

上图中在next参数的旁边还有个参数interval,她的英文意思是“间隔,间距”,而弹幕的time值依次是60000、120000、180000….,差值为60000,所以推测next=1000*interval,所以很有可能next的单位是ms,而interval的单位是s。

为了验证猜想,我们把视频进度条拉到最后,本期的视频长度为104.01分钟,而最后一条弹幕的next为6240000,6240000ms转化为分钟刚好是104min,验证成立:time是每条弹幕开始播放的时间。

爬一下《中餐厅》绿大暗:我不要你觉得,我只要我觉得

至此所有的参数都已经搞清楚了

二、爬取数据

采用request请求数据,导入我们需要调用的包

import requests
import json 
import pandas as pd
import time

首先定义一个主函数用来获取每条弹幕js文件的内容,并将获得的数据转化为json格式。传入的参数time_zimu是每条弹幕开始播放的时间

def main(time_zimu):
 url='https://galaxy.bz.mgtv.com/rdbarrage?vid=6337608&cid=330026&time='+str(time_zimu)
 html=requests.get(url,headers=headers)
 html.encoding="utf-8"
 html_data=html.text[html.text.find('['):-2]
 html_data_json=json.loads(html_data)

这需要注意一点,因为我们要获取的json数据是在jQuery中,为了避免出错,我们这里直接获取json部分的数据html_data=html.text[html.text.find('['):-2],效果如下图

爬一下《中餐厅》绿大暗:我不要你觉得,我只要我觉得

将数据转为json格式后,其中type,uid,content,time是我们想要的数据

爬一下《中餐厅》绿大暗:我不要你觉得,我只要我觉得

构造获取弹幕信息函数,传入json的数据orgin_data,通过循环重复取出单条弹幕信息,并提取对应的字段

def get_infos(orgin_data):
 for infos in orgin_data:
 yield[
 infos['type'],
 infos['uid'],
 infos['content'],
 infos['time']
 ]

构造保存数据函数,将获得的数据构建成DaraFrame,将数据保存到csv文件中

def save_data(single_data):
 data=[]
 data.extend(single_data)
 columns=['type','uid','content','time']
 data_frame=pd.DataFrame(data=data,columns=columns)
 data_frame.to_csv('data2019.csv',mode='a')

最后封装函数,循环获取所有弹幕文件

if __name__ == "__main__":
 time_c=60000 #加载弹幕时间间隔
 for i in range(0,110): #此处110取决于最后弹幕的出现时间
 print('开始 时间为'+str(i)+'的字幕')
 main(time_c*i)
 time.sleep(3)

三、展示成果

运行爬虫,开始工作爬取弹幕

爬一下《中餐厅》绿大暗:我不要你觉得,我只要我觉得

展示下我们爬取到的弹幕数据文件的前几行数据,达成获得弹幕数据成就

data=pd.read_csv('data2019.csv')
print(data.head())
爬一下《中餐厅》绿大暗:我不要你觉得,我只要我觉得

这篇文章其实并没有太大的难度,但是对于新手伙伴来说,很多的教程都集中在代码部分,而前期的分析工作则介绍的很少,其实这部分也很重要!

爬完了中餐厅,大家对绿大暗的看法也是褒贬不一哈, 活泼可爱的小猴紫,有担当懂事的小凯,贴心的海璐姐,默默无闻的卓卓,一身本领的林大厨!综艺节目,我们安安静静的吃瓜多好,哈哈哈!


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69923331/viewspace-2657234/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-05-14

  • 博文量
    431
  • 访问量
    235048