前言
利用Python实现抓取芒果TV弹幕,废话不多说。
让我们愉快地开始吧~
开发工具
Python版本:3.6.4
相关模块:
requests模块;
pandas模块
以及一些Python自带的模块。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
思路分析
本文以爬取电影《悬崖之上》为例,讲解如何爬取芒果TV视频的弹幕和评论!
目标网址
/b/335313/12281642.html?fpa=15800&fpos=8&lastp=ch_movie
抓取弹幕
分析网址
弹幕数据所在的文件是动态加载的,需要进入浏览器的开发者工具进行抓包,得到弹幕数据所在的真实url。当视频播放一分钟它就会更新一个json数据包,里面包含我们需要的弹幕数据。
获取真实的URL
https://bullet-/bullet//08/14/005323/12281642/0.json\https://bullet-/bullet//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-/bullet//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:
/v4/comment/getCommentList?page=1&subjectType=hunantv&subjectId=12281642&callback=jQuery1820749973529821774_1628942431449&_support=10000000&_=1628943290494\/v4/comment/getCommentList?page=2&subjectType=hunantv&subjectId=12281642&callback=jQuery1820749973529821774_1628942431449&_support=10000000&_=1628943296653
其中有差别的参数有page
和_
,page是页数,_是时间戳;url中的时间戳删除后不影响数据完整性,但里面的callback
参数会干扰数据解析,所以进行删除。最后得到url:
/v4/comment/getCommentList?page=1&subjectType=hunantv&subjectId=12281642&_support=10000000
数据包中每页包含15条评论数据,评论总数是2527,得到最大页为169。
代码实现
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 o in range(1, 170):\url = f'/v4/comment/getCommentList?page={o}&subjectType=hunantv&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)
效果展示