「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战」。
前言
利用Python实现抓取芒果TV弹幕,废话不多说。
让我们愉快地开始吧~
开发工具
Python版本: 3.6.4
相关模块:
requests模块;
pandas模块
以及一些Python自带的模块。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
思路分析
本文以爬取电影《悬崖之上》为例,讲解如何爬取芒果TV视频的弹幕和评论!
目标网址
https://www.mgtv.com/b/335313/12281642.html?fpa=15800&fpos=8&lastp=ch_movie
复制代码
抓取弹幕
分析网址
弹幕数据所在的文件是动态加载的,需要进入浏览器的开发者工具进行抓包,得到弹幕数据所在的真实url。当视频播放一分钟它就会更新一个json数据包,里面包含我们需要的弹幕数据。
获取真实的URL
https://bullet-ali.hitv.com/bullet/2021/08/14/005323/12281642/0.json\
https://bullet-ali.hitv.com/bullet/2021/08/14/005323/12281642/1.json
复制代码
可以发现,每条url的差别在于后面的数字,首条url为0,后面的逐步递增。视频一共120:20分钟,向上取整,也就是121条数据包。
代码实现
import requests\
import pandas as pd\
\
headers = {\
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'\
}\
df = pd.DataFrame()\
for e in range(0, 121):\
print(f'正在爬取第{e}页')\
resposen = requests.get(f'https://bullet-ali.hitv.com/bullet/2021/08/3/004902/12281642/{e}.json', headers=headers)\
# 直接用json提取数据\
for i in resposen.json()['data']['items']:\
ids = i['ids'] # 用户id\
content = i['content'] # 弹幕内容\
time = i['time'] # 弹幕发生时间\
# 有些文件中不存在点赞数\
try: \
v2_up_count = i['v2_up_count']\
except:\
v2_up_count = ''\
text = pd.DataFrame({'ids': [ids], '弹幕': [content], '发生时间': [time]})\
df = pd.concat([df, text])\
df.to_csv('悬崖之上.csv', encoding='utf-8', index=False)
复制代码
效果展示
抓取评论
分析网页
芒果TV视频的评论需要拉取到网页下面进行查看。评论数据所在的文件依然是动态加载的,进入开发者工具,按下列步骤进行抓包:Network→js,最后点击查看更多评论。
加载出来的依然是js文件,里面包含评论数据。得到的真实url:
https://comment.mgtv.com/v4/comment/getCommentList?page=1&subjectType=hunantv2014&subjectId=12281642&callback=jQuery1820749973529821774_1628942431449&_support=10000000&_=1628943290494\
https://comment.mgtv.com/v4/comment/getCommentList?page=2&subjectType=hunantv2014&subjectId=12281642&callback=jQuery1820749973529821774_1628942431449&_support=10000000&_=1628943296653
复制代码
其中有差别的参数有page
和_
,page是页数,_是时间戳;url中的时间戳删除后不影响数据完整性,但里面的callback
参数会干扰数据解析,所以进行删除。最后得到url:
https://comment.mgtv.com/v4/comment/getCommentList?page=1&subjectType=hunantv2014&subjectId=12281642&_support=10000000
复制代码
数据包中每页包含15条评论数据,评论总数是2527,得到最大页为169。
效果展示
近期评论