众所周知,弹幕,即在网络上观看视频时弹出的评论性字幕。不知道大家看视频的时候会不会点开弹幕,于我而言,弹幕是视频内容的良好补充,是一个组织良好的评论序列。通过分析弹幕,我们可以快速洞察广大观众对于视频的看法。

阿喵通过一个关于《八佰》的视频弹幕数据,绘制了如下词云图,感觉效果还是可以的。

点击并拖拽以移动

这里多说一句,小编是一名python开发工程师,这里有我自己整理的一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编即可领取。

海量的弹幕数据不仅可以绘制此类词云图,还可以调用百度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开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编即可领取。

本文章素材来源于网络,如有侵权请联系删除。

用Python爬取B站、腾讯视频、爱奇艺和芒果TV视频弹幕!的更多相关文章

  1. 如何使用油猴脚本不要vip就能观看各大视频网站如腾讯,爱奇艺等的vip视频

    如何使用油猴脚本不要vip就能观看各大视频网站如腾讯,爱奇艺等的vip视频 首先打开谷歌商店(这里需要fq,如不能fq的小伙伴请看上面写的Chrome怎么访问外网) 搜索Tampermonkey,点击 ...

  2. 萌新学习Python爬取B站弹幕+R语言分词demo说明

    代码地址如下:http://www.demodashi.com/demo/11578.html 一.写在前面 之前在简书首页看到了Python爬虫的介绍,于是就想着爬取B站弹幕并绘制词云,因此有了这样 ...

  3. python爬取某站新闻,并分析最近新闻关键词

    在爬取某站时并做简单分析时,遇到如下问题和大家分享,避免犯错: 一丶网站的path为 /info/1013/13930.htm ,其中13930为不同新闻的 ID 值,但是这个数虽然为升序,但是没有任 ...

  4. 用python爬取B站在线用户人数

    最近在自学Python爬虫,所以想练一下手,用python来爬取B站在线人数,应该可以拿来小小分析一下 设计思路 首先查看网页源代码,找到相应的html,然后利用各种工具(BeautifulSoup或 ...

  5. Python爬取B站视频信息

    该文内容已失效,现已实现scrapy+scrapy-splash来爬取该网站视频及用户信息,由于B站的反爬封IP,以及网上的免费代理IP绝大部分失效,无法实现一个可靠的IP代理池,免费代理网站又是各种 ...

  6. python爬取b站排行榜

    爬取b站排行榜并存到mysql中 目的 b站是我平时看得最多的一个网站,最近接到了一个爬虫的课设.首先要选择一个网站,并对其进行爬取,最后将该网站的数据存储并使其可视化. 网站的结构 目标网站:bil ...

  7. Python爬取b站任意up主所有视频弹幕

    爬取b站弹幕并不困难.要得到up主所有视频弹幕,我们首先进入up主视频页面,即https://space.bilibili.com/id号/video这个页面.按F12打开开发者菜单,刷新一下,在ne ...

  8. Python爬取B站耗子尾汁、不讲武德出处的视频弹幕

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 前言 耗子喂汁是什么意思什么梗呢?可能很多人不知道,这个梗是出自马保国,经常上网的人可能听说过这个 ...

  9. 使用python爬取P站图片

    刚开学时有一段时间周末没事,于是经常在P站的特辑里收图,但是P站加载图片的速度比较感人,觉得自己身为计算机专业,怎么可以做一张张图慢慢下这么low的事,而且这样效率的确也太低了,于是就想写个程序来帮我 ...

随机推荐

  1. RVO+CA

    http://gamma.cs.unc.edu/RVO/ http://gamma.cs.unc.edu/CA/ https://arongranberg.com/astar/docs/writing ...

  2. Codeforces 1321D Navigation System

    题意 有个人要从\(s\)走到\(t\),经过的路径给定.导航系统每次会显示当前节点到\(t\)的最短路,有多条就显示其中之一.这个人如果按照导航走,那么啥都没变.如果没有按导航走导航就会重新导航.问 ...

  3. 非旋Treap——维护数列

    https://www.luogu.org/problemnew/show/P3391 知识点:1.split:1.拆数值 2.拆排名 2.merge 3.截取l - r这个区间,先截l - 1出来, ...

  4. uniapp接入友盟统计

    话不多说,上图 如果找不到上图,那就下图: 然后就隔天去平台看数据吧 ^_^

  5. PHP复杂变量

    eval($str="${${phpinfo()}}";)     →   可以执行phpinfo() ${phpinfo()} = {${phpindo()}} PHP复杂变量 ...

  6. ES ElasticSearch 7.x 下动态扩大索引的shard数量

    ES ElasticSearch 7.x 下动态扩大索引的shard数量 背景 在老版本的ES(例如2.3版本)中, index的shard数量定好后,就不能再修改,除非重建数据才能实现. 从ES6. ...

  7. Spring IoC 到底是什么

    前言 「上一篇文章」我们对 Spring 有了初步的认识,而 Spring 全家桶中几乎所有组件都是依赖于 IoC 的. 刚开始听到 IoC,会觉得特别高大上,但其实掰开了很简单. 跟着我的脚步,一文 ...

  8. java+swing+mysql图书管理系统

    系统说明:本系统采用eclipse开发,IDEA,eclipse,myeclipse均可运行 界面采用swing实现 数据库:mysql,附sql代码,其余数据库可复制sql代码运行 数据库连接文件m ...

  9. VMware安装Centos7并联网使用

    一.安装VMware VMwareworkstation官方下载地址: https://www.vmware.com/cn/products/workstation-pro/workstation-p ...

  10. Priest John's Busiest Day(POJ 3683)

    原题如下: Priest John's Busiest Day Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12162   ...