
01
引言
当前由张若昀、李沁、陈道明、吴刚、田雨和李小冉等豪华阵容主演的电视剧《庆余年》第二季正在腾讯视频热播,该剧距离第一季播出已有五年,所以一经上播,立马引起了全民的关注,热度惊人。
《庆余年》第二季一共36集,于2024年5月16日在腾讯视频平台,截止今日2024年5月19日已可播放8集,今天我们通过Python来爬取该剧视频弹幕,并对其进行数据可视化分析。
闲话少说,我们直接开始吧!
02
效果展示

03
页面分析
首先我们使用浏览器进到《庆余年》第二季任意一集的播放页面,在浏览器地址栏可以获取该剧集的视频URL地址,该URL一般来说由电视剧ID和每集ID组成,如下所示:
打开开发者工具,播放视频,观察Network中的请求,其中绿色框中的120000、150000之类的就是弹幕请求。

并且通过上图,可以得到弹幕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 是 这一集电视剧id,120000/150000是递增的参数,表示时间段。
分析完成,接下来我们就来写代码,爬取弹幕吧!
04
爬取一集弹幕
有了弹幕的URL,我们可以构造请求地址,放入爬虫中,进而获取每一集的弹幕,方便后面做数据分析,代码如下:
def parse_one_episode(video_index,video_code,num=10000,step=30000):# episodes_danmu_DataFrame是存放一集所有弹幕的DataFrameepisodes_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是存放本次弹幕的DataFrametemp_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:breakreturn 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-vidvideo_code = item.xpath('./div/div[1]/@data-vid')[0]# 剧集编码data-vidvideo_cid = item.xpath('./div/div[1]/@data-cid')[0]ret.append([episodes,video_cid,video_code,name])except:passreturn 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代码已上传至百度云,方便大家获取。
点击上方小卡片关注我
扫码进群,交个朋友!


