Python实战:爬取腾讯视频弹幕,获得热播剧《繁花》140万条弹幕,并可视化分析

Python实战:爬取腾讯视频弹幕,获得热播剧《繁花》140万条弹幕,并可视化分析

当前,王家卫导演,胡歌、马伊琍、唐嫣、辛芷蕾、游本昌等豪华阵容主演的电视剧《繁花》在腾讯视频热播,引起的关注度十分惊人。

《繁花》一共 30 集,在腾讯视频平台 2023 年 12 月 27 开播,2024 年 1 月 10 日播出最后 2 集大结局。

今天,我们通过 Python 爬取腾讯视频弹幕,并对数据可视化分析。

本文用到的主要技术点:
requests爬虫库、xpath技术、pandas库、pyecharts库、jieba分词库、wordcloud词云库

1、先看效果

通过爬虫,获取了 30 集电视剧约 140 万条弹幕,每集视频弹幕大约 5 万条。

每集弹幕单独保存到了一个 csv 文件,30 集大约 140 万条总的弹幕也保存到一个 csv 文件。(本文首发在“程序员coding”公众号)

接下来,我们分析网页查找弹幕 url、编写 Python 获取弹幕内容、保存弹幕进行数据分析。

2、网页分析

在腾讯视频网站,打开《繁花》电视剧,播放任意一集,查看浏览器地址栏中的 url,这个 url 由电视剧的id每一集的id组成。

继续播放视频,打开开发者工具,查看 Network 中的请求,其中红框中的180000210000之类的就是弹幕请求。

查看分析弹幕 url,例如:

https://dm.video.qq.com/barrage/segment/e0047jq251d/t/v1/150000/180000

是由https://dm.video.qq.com/barrage/segment/拼接e0047jq251d,再拼接/t/v1/,再拼接150000/180000组成。

其中e0047jq251d这一集电视剧id150000/180000是递增 30000 的参数。

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

分析完成,接下来写 Python 代码就简单了。(本文首发在“程序员coding”公众号)

3、爬取一集弹幕

通过分析弹幕 url 规律,构造请求地址,放入爬虫中运行就可以获得一集电视剧的弹幕。可以将弹幕字段保存到 csv 文件中,方便后续进行数据处理分析。

Python 代码如下:

#(本文首发在“程序员coding”公众号)
import requests
import pandas as pd

# episodes_danmu_DataFrame是存放一集所有弹幕的DataFrame
episodes_danmu_DataFrame = pd.DataFrame()

# 填写腾讯视频的参数,video_code是腾讯视频的编号,num是获取弹幕的次数,step是步进参数
video_code = "c004725utxa"
num = 10000  # 设置一个较大的请求次数,程序会自动判断,当没有弹幕了会自动退出循环
step = 30000

# 循环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],
              "条弹幕,这一集总弹幕已获取到", episodes_danmu_DataFrame.shape[0], "条。")
    else:
        break

print("总共获取到", episodes_danmu_DataFrame.shape[0], "条弹幕")
# 查看 DataFrame 的行数和列数。
rows = episodes_danmu_DataFrame.shape
print("请求得到的表格行数与列数:", rows)

# 将 DataFrame 保存为 csv 文件
# 选择保存的列
episodes_danmu_DataFrame = episodes_danmu_DataFrame.loc[:, ['time_offset', 'create_time', 'content']]
episodes_danmu_DataFrame.to_csv(f"腾讯视频弹幕-繁花-{episodes_danmu_DataFrame.shape[0]}条弹幕.csv", mode='w',
                                encoding="utf-8", errors='ignore', index=False)
print("弹幕保存完成!")


PyCharm 控制台输出如下,获取到《繁花》一集电视剧的约 5 万条弹幕:

4、获取全剧参数

接下来想想能不能再优化下程序,自动爬取每一集电视剧的弹幕呢?

其实要完成这个需求也不难,首先获取到每一集电视剧的 id,然后再用每一集的 id 放到上面的程序里,构造弹幕请求 url,就可以完成每一集电视剧弹幕的爬取了。

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

Python 代码如下:

import requests
from lxml import etree

url = 'https://v.qq.com/x/cover/mzc002006wiw7ll/x0047c2sgdz.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')

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]
        print(episodes,video_cid,video_code,name)
    except:
        pass


PyCharm 控制台输出如下,获取到《繁花》这部电视剧已经更新完的 30 集,每一集的集数、电视剧 id、每一集 id、每一集标题:

5、爬取30集弹幕

通过上面 2 个代码,可以获取到任意一集的弹幕和每一集电视剧的 id,通过代码整合,就可以获取到这部电视剧 30 集视频每一集的弹幕了。

爬虫获取的 30 集电视剧,每一集的弹幕保存为一个 csv 文档,截图如下:

每个 csv 文件包含弹幕位于视频的第几集、弹幕在视频出现的位置、创建弹幕时间戳、弹幕内容这几个字段。

(本文首发在“程序员coding”公众号)

6、数据分析

通过这 140 万条弹幕,可以做一些有意思的分析,下面举几个例子权当抛砖引玉。

6.1、每集视频弹幕数量

使用 pyecharts 可视化库统计每一集视频弹幕数量,第 30 集弹幕最多有 59032 条,第 4 集弹幕最少有 37255 条,平均每集有 46849 条弹幕。生成柱状图如下:

6.2、追剧时间分布

将时间戳create_time转换为小时格式的时间,分析观众追剧时间分布。

from datetime import datetime
df["hour"] = df["create_time"].apply(lambda x: datetime.fromtimestamp(int(x)).strftime('%H'))

结果如下图所示,19 点至 23 点是全天追剧的高峰。

6.3、弹幕长度分析

添加一列content_length来记录content的长度,分析弹幕长度生成图形,可以看出弹幕长度主要分布在 4-10 个字区间。

# 添加一列content_length来记录content的长度
df['content_length'] = df['content'].map(lambda x: len(str(x)))

length_series = df['content_length'].value_counts()
length_series.sort_index(ascending=True, inplace=True)
# 评论长度列表(升序)
length_list = length_series.index.astype(int).tolist()
# 各长度对应出现次数列表
count_list = length_series.values.astype(int).tolist()

6.4、词云图

使用 jieba 分词库、wordcloud 词云库找出弹幕中高频词汇。以第一集弹幕为例,生成的图片如下:

用 30 集弹幕生成的热词词云图如下:

7、总结

完整代码包含 4 个 Python 源代码,数据集包含 30 集电视剧每一集弹幕,总计约 140万条弹幕。

以上就是“Python实战:爬取腾讯视频弹幕,获得热播剧《繁花》140万条弹幕,并可视化分析”的全部内容,希望对你有所帮助。

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

二、Python必备开发工具

img

三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

五、Python练习题

检查学习结果。

img

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

img

最后祝大家天天进步!!

上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。

  • 26
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,以下是一个爬取 B 站视频弹幕发布时间并进行可视化Python 代码: ```python import datetime import matplotlib.pyplot as plt import bilibili_api from bilibili_api import video # 视频的 av 号 av_number = 123456 # 获取弹幕数据 danmaku_data = video.get_danmaku(av_number) # 提取弹幕发布时间 danmaku_time = [] for danmaku in danmaku_data: time_str = danmaku['time'] time_float = float(time_str) time_stamp = datetime.datetime.fromtimestamp(time_float) danmaku_time.append(time_stamp) # 统计弹幕数量和发布时间 danmaku_count = [] danmaku_time_dict = {} for time_stamp in danmaku_time: time_str = time_stamp.strftime('%Y-%m-%d %H:00:00') if time_str in danmaku_time_dict: danmaku_time_dict[time_str] += 1 else: danmaku_time_dict[time_str] = 1 for time_str in sorted(danmaku_time_dict.keys()): danmaku_count.append(danmaku_time_dict[time_str]) # 绘制可视化图表 plt.figure(figsize=(12, 6)) plt.plot(danmaku_time_dict.keys(), danmaku_count) plt.xlabel('发布时间') plt.ylabel('弹幕数量') plt.title('B 站视频弹幕发布时间分布') plt.xticks(rotation=45, ha='right') plt.show() ``` 这段代码会首先通过 `Bilibili-API` 库获取指定视频弹幕数据,然后提取弹幕发布时间,并统计每个小时内的弹幕数量。最后使用 `matplotlib` 库绘制发布时间和弹幕数量的可视化图表。需要注意的是,这里的时间是按小时统计的,如果需要按其他时间粒度统计,可以修改代码中的 `strftime` 方法参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值