用Python爬取B站、腾讯视频、爱奇艺和芒果TV视频弹幕( 二 )


用Python爬取B站、腾讯视频、爱奇艺和芒果TV视频弹幕文章插图
点击并拖拽以移动
通过删减各参数 , 发现仅有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.数据预览
用Python爬取B站、腾讯视频、爱奇艺和芒果TV视频弹幕文章插图
点击并拖拽以移动
三、芒果TV弹幕
1.网页分析
本文以爬取《乘风破浪的姐姐》最后一期视频弹幕为例 , 首先通过以下步骤找到存放弹幕的真实url 。
用Python爬取B站、腾讯视频、爱奇艺和芒果TV视频弹幕文章插图
点击并拖拽以移动
?
通过分析参数 , 我们可以发现 , 芒果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 = http://kandian.youth.cn/index/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 : # 尝试获取弹幕点赞数