大数跨境
0
0

爬取《庆余年2》40万条弹幕,我发现了。。。

爬取《庆余年2》40万条弹幕,我发现了。。。 AI算法之道
2024-05-19
0
导读:Python爬取庆余年第二季视频弹幕并可视化结果











01


引言



当前由张若昀、李沁、陈道明、吴刚、田雨和李小冉等豪华阵容主演的电视剧《庆余年》第二季正在腾讯视频热播,该剧距离第一季播出已有五年,所以一经上播,立马引起了全民的关注,热度惊人。


《庆余年》第二季一共36集,于2024年5月16日在腾讯视频平台,截止今日2024年5月19日已可播放8集,今天我们通过Python来爬取该剧视频弹幕,并对其进行数据可视化分析。


闲话少说,我们直接开始吧!






02


 效果展示


通过爬虫,获取了当前8集电视剧约40 万条弹幕,每集视频弹幕大约 5 万条。每集弹幕单独保存到了一个 csv 文件,8集大约40 万条总的弹幕也保存到一个 csv 文件。如下所示:

其中汇总后的弹幕文件存储内容如下:
在接下来的章节里,我们将逐步介绍如何分析视频URL链接,如何获取弹幕内容,以及相应的数据可视化操作。




03


  页面分析


首先我们使用浏览器进到《庆余年》第二季任意一集的播放页面,在浏览器地址栏可以获取该剧集的视频URL地址,该URL一般来说由电视剧ID和每集ID组成,如下所示:

打开开发者工具,播放视频,观察Network中的请求,其中绿色框中的120000150000之类的就是弹幕请求。

并且通过上图,可以得到弹幕URL,如下:

https://dm.video.qq.com/barrage/segment/q4100dpkd26/t/v1/120000/150000

拆分上述URL,我们可以分析,得到如下结论:

该URL由https://dm.video.qq.com/barrage/segment/拼接q4100dpkd26, 再拼接/t/v1/,再拼接120000/150000组成。

其中q4100dpkd26 是 这一集电视剧id120000/150000是递增的参数,表示时间段。

查看弹幕请求的Preview或者Response,可以看出返回的 json 格式的数据,也可以很容易通过代码提出来。如下:

分析完成,接下来我们就来写代码,爬取弹幕吧!






04


  爬取一集弹幕

有了弹幕的URL,我们可以构造请求地址,放入爬虫中,进而获取每一集的弹幕,方便后面做数据分析,代码如下:

def parse_one_episode(video_index,video_code,num=10000,step=30000):    # episodes_danmu_DataFrame是存放一集所有弹幕的DataFrame    episodes_danmu_DataFrame = pd.DataFrame()    # 循环num次获取弹幕    for i in range(num):        url = f'https://dm.video.qq.com/barrage/segment/{video_code}/t/v1/{i * 30000}/{i * 30000 + step}'        response = requests.get(url=url).json()        if (len(response["barrage_list"])) > 0:            # temp_danmu_DataFrame是存放本次弹幕的DataFrame            temp_danmu_DataFrame = pd.json_normalize(response['barrage_list'], errors='ignore')            episodes_danmu_DataFrame = pd.concat([episodes_danmu_DataFrame, temp_danmu_DataFrame])            print("第", i + 1, "次请求弹幕,请求地址为:", url, "当前获取到:", temp_danmu_DataFrame.shape[0],                  "条弹幕,第",video_index, "集已获取累计弹幕", episodes_danmu_DataFrame.shape[0], "条。")        else:            break
return episodes_danmu_DataFrame

通过调用上述代码,控制台输出如下,获取到《庆余年》第二季第一集电视剧的5 万多条弹幕:







05


 获取每集视频ID


通过上述函数,我们可以获取一集电视剧的所有弹幕,接下来我们需要获取该剧所包含的所有视频信息和对应的ID。


我们接着分析网页源代码,运用lxml库,通过xpath提取每一集电视剧的集数、电视剧 ID、每一集 ID、每一集电视剧的标题。

代码如下:

def get_episode_list(url = 'https://v.qq.com/x/cover/mzc002002kqssyu/q4100dpkd26.html'):    response = requests.get(url=url)    response.encoding = 'utf-8'    html_etree = etree.HTML(response.text)  # 看成一个筛子,树状    et = html_etree.xpath('//*[@id="app"]/div[2]/div[2]/div/div[2]/div/div/div[2]/div[1]/div[2]/div[2]/div/div/div')    ret = list()    for item in et:        try:            # 电视剧名称            name = item.xpath('./div/div[2]/text()')[0]            # 第几集            episodes = item.xpath('./div/div[1]/span/text()')[0]            # 剧集编码data-vid            video_code = item.xpath('./div/div[1]/@data-vid')[0]            # 剧集编码data-vid            video_cid = item.xpath('./div/div[1]/@data-cid')[0]            ret.append([episodes,video_cid,video_code,name])        except:            pass    return ret

通过调用上述代码,控制台输出如下,获取到《庆余年》第二季电视剧当前放出来的剧集和每一集的名字,如下:





06


爬取所有弹幕

通过上述章节,我们可以得到《庆余年》第二季每一集的ID和名字,同时可以通过每集的ID获得相应的所有弹幕,进而将二者结合,可以得到目前所有的弹幕,我们将其保存到一个CSV文件中,得到结果如下:







07


可视化每集弹幕数

获取上述所有弹幕后,接下来我们来可视化每集的弹幕数量,如下:

使用 pyecharts 可视化库统计每一集视频弹幕数量,观察上图可知,第 1 集弹幕最多有 57365 条,第 8 集弹幕最少有 27459 条(昨晚刚更新,数量还在增加中),平均每集有 50060 条弹幕。








08


可视化观剧时间

获取上述所有弹幕后,接下来我们来可视化大家的观剧时间,如下:

使用 pyecharts 可视化库统计每一集视频弹幕随时间变化的数量,观察上图可知,大家的观剧时间基本都在19点到24点之间,其中晚上20-22点为高峰期。








09


可视化第一集词云

获取上述所有弹幕后,接下来我们来使用词云可视化大家的弹幕内容,我们首先来可视化第一集也就是该剧开播时的弹幕,使用jieba分词库,wordcloud词云库,获取弹幕中的高频词,得到词云图如下:








10


可视化所有剧集词云

目前已经播出了八集,我们来可视化目前收集到的所有弹幕,得到词云图如下:








11


总结

本文使用Python中的爬虫技术,爬取了《庆余年》第二季包含8集电视剧每一集的弹幕,共计40万条弹幕,相应的Python代码已上传至百度云,方便大家获取。



注:关注公众号,后台回复“庆余年”,可获取源码。






点击上方小卡片关注我




扫码进群,交个朋友!


【声明】内容源于网络
0
0
AI算法之道
一个专注于深度学习、计算机视觉和自动驾驶感知算法的公众号,涵盖视觉CV、神经网络、模式识别等方面,包括相应的硬件和软件配置,以及开源项目等。
内容 573
粉丝 0
AI算法之道 一个专注于深度学习、计算机视觉和自动驾驶感知算法的公众号,涵盖视觉CV、神经网络、模式识别等方面,包括相应的硬件和软件配置,以及开源项目等。
总阅读195
粉丝0
内容573