用Python爬取六大平台的弹幕、评论,看这一篇就够了

今天讲解如何用Python爬取芒果TV、腾讯视频、B站、爱奇艺、知乎、微博这几个常见常用的影视、舆论平台的弹幕和评论,这类爬虫得到的结果一般用于娱乐、舆情分析,如:新出一部火爆的电影,爬取弹幕评论分析他为什么这么火;微博又出大瓜,爬取底下评论看看网友怎么说,等等这娱乐性分析 。
本文爬取一共六个平台,十个爬虫案例,如果只对个别案例感兴趣的可以根据:芒果TV、腾讯视频、B站、爱奇艺、知乎、微博这一顺序进行拉取观看 。完整的实战源码已在文中,我们废话不多说,下面开始操作!
芒果TV本文以爬取电影《悬崖之上》为例,讲解如何爬取芒果TV视频的弹幕和评论!
网页地址:
https://www.mgtv.com/b/335313/12281642.html?fpa=15800&fpos=8&lastp=ch_movie 
弹幕 
分析网页弹幕数据所在的文件是动态加载的,需要进入浏览器的开发者工具进行抓包,得到弹幕数据所在的真实url 。当视频播放一分钟它就会更新一个json数据包,里面包含我们需要的弹幕数据 。

用Python爬取六大平台的弹幕、评论,看这一篇就够了

文章插图
 
得到的真实url:
https://bullet-ali.hitv.com/bullet/2021/08/14/005323/12281642/0.jsonhttps://bullet-ali.hitv.com/bullet/2021/08/14/005323/12281642/1.json可以发现,每条url的差别在于后面的数字,首条url为0,后面的逐步递增 。视频一共120:20分钟,向上取整,也就是121条数据包 。
 
实战代码import requestsimport pandas as pdheaders = {'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']# 用户idcontent = 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)结果展示:
用Python爬取六大平台的弹幕、评论,看这一篇就够了

文章插图
 
评论 
分析网页芒果TV视频的评论需要拉取到网页下面进行查看 。评论数据所在的文件依然是动态加载的,进入开发者工具,按下列步骤进行抓包:Network→js,最后点击查看更多评论 。
用Python爬取六大平台的弹幕、评论,看这一篇就够了

文章插图
 
加载出来的依然是js文件,里面包含评论数据 。得到的真实url:
https://comment.mgtv.com/v4/comment/getCommentList?page=1&subjectType=hunantv2014&subjectId=12281642&callback=jQuery1820749973529821774_1628942431449&_support=10000000&_=1628943290494https://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 。
用Python爬取六大平台的弹幕、评论,看这一篇就够了

文章插图
 
实战代码import requestsimport pandas as pdheaders = {'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 o in range(1, 170):url = f'https://comment.mgtv.com/v4/comment/getCommentList?page={o}&subjectType=hunantv2014&subjectId=12281642&_support=10000000'res = requests.get(url, headers=headers).json()for i in res['data']['list']:nickName = i['user']['nickName']# 用户昵称praiseNum = i['praiseNum']# 被点赞数date = i['date']# 发送日期content = i['content']# 评论内容text = pd.DataFrame({'nickName': [nickName], 'praiseNum': [praiseNum], 'date': [date], 'content': [content]})df = pd.concat([df, text])df.to_csv('悬崖之上.csv', encoding='utf-8', index=False)


推荐阅读