最近发现词云图挺有意思的,正好在家闲来无事,就尝试做了一下B站视频弹幕的词云,顺便重拾一下爬虫技能。

寻找请求

首先用Chrome随便打开一个视频开始抓包,猜测弹幕信息是通过Ajax请求得到的,选中XHR,很轻松就可以找到弹幕请求的url。

https://api.bilibili.com/x/v1/dm/list.so?oid=152796906

打开之后发现是一个XML格式的文件,弹幕信息包含在d标签的text里。d标签p属性中的信息猜测可能是弹幕出现的时间、弹幕类型、弹幕发送时间戳、经加密的用户信息、弹幕在数据库里的ID等

但仔细观察发现这个XML里只有500条弹幕信息,这500条弹幕正是用户最新发布的500条弹幕,也就是视频旁边弹幕下拉框列表里最新的500条弹幕这里多出的49条弹幕是在我打开网页到截图这段时间里多出的弹幕,但在XML里仍只有500条

之后我尝试查看历史弹幕,找到历史弹幕的请求url(以2020-02-19的弹幕为例)

https://api.bilibili.com/x/v2/dm/history?type=1&oid=152796906&date=2020-02-19

可以看到这两个url差异很大,打开之后发现XML里仍然只有500条弹幕信息,最重要的是这些历史弹幕的获取需要用户登录,如果未登录返回的结果是这个样子

{"code":-101,"message":"账号未登录","ttl":1}

也就是说要请求历史弹幕需要带上cookie………那还是算了吧,就先拿500条弹幕玩一玩。

请求的url里只有一个参数oid,这个参数应该可以在主页面里找到(值得注意的是这个oid值在主页面的response里的标签为cid,真的坑……)

找到oid值之后我们的任务基本上已经完成了50%,接下来我们就可以写代码了。

python获取视频弹幕信息

1、请求视频页面

AV是av号,PAGE是视频集数,默认为1,headers里除了UA随便加了几个

def get_html():

url = "https://www.bilibili.com/video/av%s?%s" % (AV, PAGE)

headers = {

"Sec-Fetch-Dest": "document",

"Sec-Fetch-Mode": "navigate",

"Host": "www.bilibili.com",

"Referer": "https://search.bilibili.com",

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36",

}

response = requests.get(url=url, headers=headers)

try:

if response.status_code == 200:

return response.text

else:

print('请求页面出错', response.url)

except RequestException:

print('请求页面出错', response.url)

return None

2、获取oid/cid

用正则得到oid/cid,顺便获取一下视频的发布时间和标题

def get_info(html):

pattern = re.compile(r'"cid":(\d+),"page":%s' % PAGE)

pattern1 = re.compile(r'"title":"(.*?)","pubdate":(\d+)')

cid = re.search(pattern, html).group(1)

title, pubdate_u = re.search(pattern1, html).groups()

pubdate = time.strftime("%Y-%m-%d%H:%M:%S", time.localtime(int(pubdate_u))) # 时间戳转str

return cid, title, pubdate

3、获取弹幕信息

这里为了方便就用了Xpath,顺便提取了第一条弹幕的发送时间

def get_dm(cid):

url = 'https://api.bilibili.com/x/v1/dm/list.so?oid=%s' % cid

headers = {

"Sec-Fetch-Dest": "empty",

"Sec-Fetch-Mode": "cors",

"Sec-Fetch-Site": "same-site",

"Host": "api.bilibili.com",

"Origin": "https://www.bilibili.com",

"Referer": "https://www.bilibili.com/video/av%s" % AV,

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36",

}

response = requests.get(url=url, headers=headers)

try:

if response.status_code == 200:

html = etree.HTML(response.content)

dm = html.xpath('//d/text()')

s_utime = html.xpath('//d[1]/@p')[0].split(',')[4] # 第一条弹幕的发送时间

s_time = time.strftime("%Y-%m-%d%H:%M:%S", time.localtime(int(s_utime)))

return dm, s_time

else:

print('获取弹幕出错', response.url)

except RequestException:

print('获取弹幕出错', response.url)

return None

4、词云图制作

使用jieba分词和wordcloud

def ciyun(dm):

result = jieba.analyse.extract_tags(dm, withWeight=True)

wc = wordcloud.WordCloud(

font_path=r'C:/Windows/Fonts/simhei.ttf',

# background_color='White',

width=720, height=480,

max_font_size=150,

)

wc.generate_from_frequencies(dict(result))

wc.to_file('cy.png')

5、mian函数

def main():

html =get_html()

if html:

cid, title, pubdate = get_info(html)

if cid:

dm, s_time = get_dm(cid)

if dm:

print('*' * 50)

print('视频名称:%s,发布日期%s' % (title, pubdate))

print('从%s起,共获取到%d条弹幕' % (s_time, len(dm)))

dm = ''.join(dm) # 把所有弹幕连在一起

ciyun(dm)

if __name__ == '__main__':

main()

6、运行结果

Building prefix dict from the default dictionary ...

Loading model from cache C:\Users\pty666\AppData\Local\Temp\jieba.cache

**************************************************

视频名称:【 钉 钉 本 钉 ,在 线 求 饶 】,发布日期2020-02-16 20:24:22

从2020-02-21 13:51:45起,共获取到500条弹幕

Loading model cost 0.913 seconds.

Prefix dict has been built successfully.

Process finished with exit code 0矩形的词云图确实有点丑……

其他视频词云图

在我看了其他视频后发现,其实不同视频的弹幕存储量是不同的,有的是500,有的是1000,有的甚至可以达到6000、8000,形式也有所不同。以8000为例,这些弹幕并不是一天的,而是从选中日期开始向前数8000条弹幕。

最后放两个视频的词云图,猜一猜是哪两个视频 (狗头) 。

python爬取bilibili弹幕_爬取Bilibili弹幕并制作词云图相关推荐

  1. 关键词分词工具_快图制作工具 | 如何制作词云图?

    点击蓝字关注我们 如何制作词云图?    首先,我们需要对"词云"有个简单的概念. "词云"这个概念最先由美国西北大学新闻学副教授.新媒体专业主任里奇·戈登(R ...

  2. 爬取B站弹幕制作词云图

    大家好,我是天空之城,今天给大家带来,爬取B站弹幕制作词云图. 以下内容部分来自公众号数据分析与统计学之美,号主是大牛,有需要的加他. 首先打开一个b站视频https://www.bilibili.c ...

  3. python用selenium爬取b站评论并制作词云图

    文章目录 前言 一.爬取b站评论 1.selenium配置 2.代码 二.制作词云图 1.下载停用词 2.代码 3.注意事项 三.制作成品 1.初期成品 2.成品 前言 b站视频下的评论是下拉加载的. ...

  4. Python 爬虫实例+爬取豆瓣小组 + wordcloud 制作词云图

    目标 利用PYTHON爬取如下图中所有回答的内容,并且制作词云图. 用到的库 import requests # import jsonfrom PIL import Image from pyque ...

  5. python爬取豆瓣小组_Python 爬虫实例+爬取豆瓣小组 + wordcloud 制作词云图

    目标 利用PYTHON爬取如下图中所有回答的内容,并且制作词云图. 用到的库 import requests # import json from PIL import Image from pyqu ...

  6. 爬取指定网页并制作词云图

    利用python中的库和函数设计一个爬取读书网中"软件与程序设计"栏的程序,并对其书名制作词云图,下载其书封面存储到本地文件中. 构建多个函数分别进行网页的请求,html的获取,所 ...

  7. 对爬取的电影《唐人街探案3》豆瓣短评做文本分析,并利用stylecloud制作词云图

    上一节,我们爬取了豆瓣上电影<唐人街探案3>的评论,并将评论保存成了txt文档,爬虫过程可参考:爬取某瓣上电影<唐人街探案3>的评论 本节,我们将对电影短评做文本分析,并利用s ...

  8. 利用python爬虫抓取虎扑PUBG论坛帖子并制作词云图

    作为一个PUBG迷,刷论坛是每天必不可少的事,上面有很多技术贴和职业比赛的帖子,突发奇想,想知道论坛里谈论最多的是什么,便做了一个爬虫爬取了论坛上最新的帖子标题和部分回复,然后利用jieba与word ...

  9. e分钟带你利用Python制作词云图

    随着大数据时代的来临,数据分析与可视化,显得越来越重要,今天给小伙伴们带来一种最常见的数据可视化图形-词云图的制作方法. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语 ...

  10. python处理数据集并制作词云图

    python处理数据集并制作词云图 处理数据 使用自定义词典 去掉停用词 词频统计 绘制词云图+美化 1.处理数据 这里是老师给的新闻数据集,里面有5个类别的新闻数据,我以cars这一类为例. 将cs ...

最新文章

  1. 智慧城市 android,基于Android系统的智慧城市服务客户端的设计与实现
  2. Typora 收费,WTF? 还是需要支持下
  3. 从零开始学习python-《从零开始学 Python》(第二版)
  4. vue代码生成器可视化界面_手把手教你基于SqlSugar4编写一个可视化代码生成器(生成实体,以SqlServer为例,文末附源码)...
  5. VMwareTool 安装
  6. Tableau的简单数据可视化操作
  7. vue鼠标移动上去提示_关于如何处理vue中鼠标悬停事件的详细说明
  8. python 继承与多态
  9. jieba 中文分词
  10. iOS逆向之分析工具的安装和使用
  11. access查询出生年月大于_查询条件示例
  12. 国际电脑使用执照(ICDL)考试
  13. Mindjet MindManager2022版本自带简体中文,无需汉化
  14. Hypervisor是什么
  15. UDS04-清除诊断信息服务【ServiceID = 0x14】
  16. Python学习笔记(5)
  17. 利用opencv从USB摄像头获取图片 获得摄像头编号
  18. python正则匹配ABAC型词语
  19. YL70 远程I/O模块,可以用来测量四路开关量信号,并有四路继电器信号输出
  20. %格式化和format格式化--python

热门文章

  1. HPU图论专项(graph)【拓扑--二分图--最小生成树---树的直径---并查集--奇偶树---最小环---强联通】
  2. .net获取mysql数据_asp.net用DataSet从数据库中获取数据
  3. linux 无线网卡驱动 centrino 6200 agn,下载:Intel无线网卡驱动14.2官方正式版
  4. Node.js Kubernetes Graceful Shutdown
  5. 什么是动态DNS(DDNS)
  6. 阮一峰mysql_阮一峰:理解矩阵乘法
  7. BlenderGIS插件 城市建筑3D模型自动生成 教程
  8. jqwidgets日历插件如何改为中文版24小时制和bootstrap的日期控件如何改成24小时制
  9. MongoDB之按时间查询
  10. [IOI2018]组合动作 题解