用Python爬取B站、腾讯视频、爱奇艺和芒果TV视频弹幕
off999 2024-12-15 16:03 31 浏览 0 评论
众所周知,弹幕,即在网络上观看视频时弹出的评论性字幕。不知道大家看视频的时候会不会点开弹幕,于我而言,弹幕是视频内容的良好补充,是一个组织良好的评论序列。通过分析弹幕,我们可以快速洞察广大观众对于视频的看法。
阿喵通过一个关于《八佰》的视频弹幕数据,绘制了如下词云图,感觉效果还是可以的。
点击并拖拽以移动
这里多说一句,小编是一名python开发工程师,这里有我自己整理的一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编:“01”即可领取。
海量的弹幕数据不仅可以绘制此类词云图,还可以调用百度AI进行情感分析。那么,我们该如何获取弹幕数据呢?本文运用Python爬取B站视频、腾讯视频、芒果TV和爱奇艺视频等弹幕,让你轻松获取主流视频网站弹幕数据。
一、B站视频弹幕
1.网页分析
本文以爬取up主硬核的半佛仙人发布的《你知道奶茶加盟到底有多坑人吗?》视频弹幕为例,首先通过以下步骤找到存放弹幕的真实url。
点击并拖拽以移动
简单分析url参数,很显然,date参数表示发送弹幕的时间,其他参数均无变化。因此,只需要改变date参数,然后通过beautifulsoup解析到弹幕数据即可。
2.爬虫实战
import requests #请求网页数据
from bs4 import BeautifulSoup #美味汤解析数据
import pandas as pd
import time
from tqdm import trange #获取爬取速度
def get_bilibili_url (start, end) :
url_list = []
date_list = [i for i in pd.date_range(start, end).strftime( '%Y-%m-%d' )]
for date in date_list:
url = f"api.bilibili.com/x/v2/dm/his… {date} "
url_list.append(url)
return url_list
def get_bilibili_danmu (url_list) :
headers = {
"user-agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36" ,
"cookie" : "你自己的" #Headers中copy即可
}
file = open( "bilibili_danmu.txt" , 'w' )
for i in trange(len(url_list)):
url = url_list[i]
response = requests.get(url, headers=headers)
response.encoding = 'utf-8'
soup = BeautifulSoup(response.text)
data = soup.find_all( "d" )
danmu = [data[i].text for i in range(len(data))]
for items in danmu:
file.write(items)
file.write( "\n" )
time.sleep( 3 )
file.close()
if name == "main" :
start = '9/24/2020' #设置爬取弹幕的起始日
end = '9/26/2020' #设置爬取弹幕的终止日
url_list = get_bilibili_url(start, end)
get_bilibili_danmu(url_list)
print(
"弹幕爬取完成"
)
3.数据预览
点击并拖拽以移动
?
二、腾讯视频弹幕
1.网页分析
本文以爬取《脱口秀大会 第3季》最后一期视频弹幕为例,首先通过以下步骤找到存放弹幕的真实url。
点击并拖拽以移动
通过删减各参数,发现仅有timestamp参数的变化会影响弹幕数据的爬取,且timestamp参数是首项为15,公差为30的等差数列。可以大胆猜测腾讯视频每30秒更新一页弹幕数据,该视频长度为12399秒。而数据格式为标准的json格式,因此json.loads直接解析数据即可。
2.爬虫实战
import requests
import json
import time
import pandas as pd
df = pd.DataFrame()
for page in range( 15 , 12399 , 30 ):
headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36' }
url = 'mfm.video.qq.com/danmu?otype… .format(page)
print( "正在提取第" + str(page) + "页" )
html = requests.get(url,headers = headers)
bs = json.loads(html.text,strict = False ) #strict参数解决部分内容json格式解析报错
time.sleep( 1 )
#遍历获取目标字段
for i in bs[ 'comments' ]:
content = i[ 'content' ] #弹幕
upcount = i[ 'upcount' ] #点赞数
user_degree =i[ 'uservip_degree' ] #会员等级
timepoint = i[ 'timepoint' ] #发布时间
comment_id = i[ 'commentid' ] #弹幕id
cache = pd.DataFrame({ '弹幕' :[content], '会员等级' :[user_degree],
'发布时间' :[timepoint], '弹幕点赞' :[upcount], '弹幕id' :[comment_id]})
df = pd.concat([df,cache])
df.to_csv( 'tengxun_danmu.csv' ,encoding = 'utf-8' )
print(df.shape)
3.数据预览
点击并拖拽以移动
三、芒果TV弹幕
1.网页分析
本文以爬取《乘风破浪的姐姐》最后一期视频弹幕为例,首先通过以下步骤找到存放弹幕的真实url。
点击并拖拽以移动
?
通过分析参数,我们可以发现,芒果TV会生成首项为0,公差为1的等差数列json弹幕文件,每个json文件存储前一分钟内所有的弹幕数据。弹幕数据存放格式为json,数据解析较为简单。
2.爬虫实战
import requests
import json
import pandas as pd
def get_mangguo_danmu (num1, num2, page) :
try :
url = 'bullet-ws.hitv.com/bullet/2020…
print( "正在爬取第" + str(page) + "页" )
danmuurl = url.format(num1, num2, page)
res = requests.get(danmuurl)
res.encoding = 'utf-8'
#print(res.text)
data = json.loads(res.text)
except :
print( "无法连接" )
details = []
for i in range(len(data[ 'data' ][ 'items' ])): # 弹幕数据在json文件'data'的'items'中
result = {}
result[ 'stype' ] = num2 # 通过stype可识别期数
result[ 'id' ] = data[ 'data' ][ 'items' ][i][ 'id' ] # 获取id
try : # 尝试获取uname
result[ 'uname' ] = data[ 'data' ][ 'items' ][i][ 'uname' ]
except :
result[ 'uname' ] = ''
result[ 'content' ] = data[ 'data' ][ 'items' ][i][ 'content' ] # 获取弹幕内容
result[ 'time' ] = data[ 'data' ][ 'items' ][i][ 'time' ] # 获取弹幕发布时间
try : # 尝试获取弹幕点赞数
result[ 'v2_up_count' ] = data[ 'data' ][ 'items' ][i][ 'v2_up_count' ]
except :
result[ 'v2_up_count' ] = ''
details.append(result)
return details
#输入关键信息
def count_danmu () :
danmu_total = []
num1 = input( '第一个数字' )
num2 = input( '第二个数字' )
page = int(input( '输入总时长' ))
for i in range(page):
danmu_total.extend(get_mangguo_danmu(num1, num2, i))
return danmu_total
def main () :
df = pd.DataFrame(count_danmu())
df.to_csv( 'mangguo_danmu.csv' )
if name == 'main' :
main()
3.数据预览
点击并拖拽以移动
四、爱奇艺弹幕
1.网页分析
本文以爬取《乐队的夏天第2季》第13期上视频弹幕为例,首先通过以下步骤找到存放弹幕的真实url。
点击并拖拽以移动
?
分析弹幕真实url,我们发现,参数5981449914376200是视频tvid,参数62是tvid倒数4为的前两位,参数00是tvid的最后两位,.z前的参数1为视频总时长除以300秒向上取整。观察相邻两个弹幕文件包,可以看出爱奇艺每5分钟更新一次弹幕文件。
点击并拖拽以移动
?
由于直接爬取出来的弹幕文件存在乱码,需要进行二进制编码,方可得到最终的弹幕数据。
2.爬虫实战
import zlib
import requests
1.爬取xml文件
def download_xml (url) :
bulletold = requests.get(url).content # 二进制内容
return zipdecode(bulletold)
def zipdecode (bulletold) :
'对zip压缩的二进制内容解码成文本'
decode = zlib.decompress(bytearray(bulletold), 15 + 32 ).decode( 'utf-8' )
return decode
for x in range( 1 , 12 ):
x是从1到12,12怎么来的,这一集总共57分钟,爱奇艺每5分钟会加载新的弹幕,57除以5向上取整
url = 'cmts.iqiyi.com/bullet/62/0… + str(x) + '.z'
xml = download_xml(url)
把编码好的文件分别写入17个xml文件中(类似于txt文件),方便后边取数据
with open( './aiqiyi/iqiyi' + str(x) + '.xml' , 'a+' , encoding= 'utf-8' ) as f:
f.write(xml)
2.读取xml文件中的弹幕数据数据
from xml.dom.minidom import parse
import xml.dom.minidom
def xml_parse (file_name) :
DOMTree = xml.dom.minidom.parse(file_name)
collection = DOMTree.documentElement
在集合中获取所有entry数据
entrys = collection.getElementsByTagName( "entry" )
print(entrys)
result = []
for entry in entrys:
content = entry.getElementsByTagName( 'content' )[ 0 ]
print(content.childNodes[ 0 ].data)
i = content.childNodes[ 0 ].data
result.append(i)
return result
with open( "aiyiqi_danmu.txt" , mode= "w" , encoding= "utf-8" ) as f:
for x in range( 1 , 12 ):
l = xml_parse( "./aiqiyi/iqiyi" + str(x) + ".xml" )
for line in l:
f.write(line)
f.write(
"\n"
3.数据预览
点击并拖拽以移动
最后多说一句,小编是一名python开发工程师,这里有我自己整理的一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编:“01”即可领取。
相关推荐
- 把系统装在u盘(把系统装在u盘里的缺点)
-
系统装进U盘有效的方法。1、下载并且安装好大白菜装机版,打开安装好的大白菜装机版,插入u盘等待软件成功读取到u盘之后,点击“一键制作启动u盘”进入下一步操作:2、弹出的信息提示窗口中,选择自己下载的的...
- 恢复出厂设置对电脑有影响吗
-
电脑恢复出厂设置,对系统没有影响,原因如下:1、系统还原是电脑在使用中的一种正常运作,不还原电脑无法正常运行,系统还原是对电脑的维护,不会对电脑或系统造成损害。2、系统还原是一次大容量的数据读写、清除...
- 注册邮箱163免费登录入口官网
-
注册网易邮箱账号步骤如下:1、在浏览器的地址栏输入http://email.163.com/进入网易邮箱的登录页面,点击页面下方的立即注册2、点击立即注册进入邮箱的注册页面,点击页面上面的注册字母邮箱...
- 产品密钥win10专业版激活密钥免费
-
1不存在永久激活密钥,但可以使用一些有效期长的密钥去激活Win10专业版。2Windows10的激活方式是基于数字权利,当你购买Windows10时,系统会将您电脑的硬件信息和购买记录绑定在一起...
- ghostxp系统下载怎么安装教程
-
系统之家下载的XP系统通常是一个ISO镜像文件,安装这个系统需要通过一些步骤来制作可启动安装介质并进行系统安装。以下是安装的基本步骤:准备安装介质:使用工具如Rufus或AnyBurn将下载的ISO文...
- 无线网桥监控安装方法(无线网桥怎么连接监控)
-
网桥连接无线路由器安装的设置方法如下1.主路由器上网正常,副路由器LAN口插一根网线,另一头连接电脑。主副路由器不需要用网线连接。2.电脑开机输入副路由器背面的设置地址,进入登录界面输入背面的账号密码...
- 怎么对电脑文件夹加密(怎么对电脑文件夹加密码)
-
1.右键点要加密的文件或文件夹,然后单击“属性”;2.在“常规”选项卡,点击“高级”。选中“加密内容以便保护数据”复选框;3.在加密文件夹时,系统将询问是否要同时加密它的子文件夹。要如果选择是,那它的...
- windows系统下载手机(win10下载手机)
-
OPPO手机重新下载安装系统:先备份好重要数据!然后手机连接电脑把下载的固件存入手机。然后再长按电源键十秒钟进入关机状态(可拆卸电板的需取下电板然后重新安装)。再同时按住电源键跟音量减键,进入reco...
- 电脑系统分区怎么分(电脑系统分区怎么分区)
-
分区是将硬盘分割成不同的逻辑部分,每个分区可以被视为一个独立的存储设备。通过分区,可以更好地管理数据和操作系统。要进行电脑分区,可以按照以下步骤进行:1.确定分区方案:首先需要确定分区的目的和需求。...
- 电脑显卡怎么选择(电脑显卡怎样选择)
-
以下是一些通用的方法:1.在硬件层面进行配置:首先需要确认您的主板和操作系统是否支持多GPU并行,以及您的电源是否提供足够的功率支持。在BIOS中启用多GPU选项,并安装正确的驱动程序。然后,通...
- 设置软件下载(设置软件下载入口)
-
iphone13app的下载设置1、首先,打开手机桌面的【设置】。2、在设置界面,点击【面容ID与密码】。3、这时设置了键盘锁的会要求你输入键盘锁密码进入。4、进入之后,找到【iTunesStore...
- 电脑麦克风插孔是哪个(电脑麦克风插那)
-
1.蓝色的为音频输入口。一般的电脑后面都有三个音频接口:蓝色是音频输入,绿色是音频输出,粉红色麦克风。 2.音频输入(蓝色),为外接光驱.随身听及其它音频输入设备,即可以把外部的设备声音传送至电脑...
- ie浏览器打不开网页怎么修复
-
第一步:打开“运行”输入—〉cmd—〉回车然后把下面这行字符复制到黑色cmd框里面去回车等待dll文件全部注册完成就关闭可以了(下面是要运行的代码):for%1in(%windir%\syste...
- mail163邮箱登录入口网页版(mail163手机邮箱登录)
-
1.首先你要开启网易的POP3/SMTP/IMAP。2.设置完之后你需要网易的客户端授权密码。3.密码会发送至你的绑定手机。4.用发给你的客户端授权密码登录第三方客户端(ios客户端)5.直接登陆,储...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
系统u盘安装(win11系统u盘安装)
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
