python爬取bilibili弹幕_爬取Bilibili弹幕并制作词云图
最近发现词云图挺有意思的,正好在家闲来无事,就尝试做了一下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弹幕并制作词云图相关推荐
- 关键词分词工具_快图制作工具 | 如何制作词云图?
点击蓝字关注我们 如何制作词云图? 首先,我们需要对"词云"有个简单的概念. "词云"这个概念最先由美国西北大学新闻学副教授.新媒体专业主任里奇·戈登(R ...
- 爬取B站弹幕制作词云图
大家好,我是天空之城,今天给大家带来,爬取B站弹幕制作词云图. 以下内容部分来自公众号数据分析与统计学之美,号主是大牛,有需要的加他. 首先打开一个b站视频https://www.bilibili.c ...
- python用selenium爬取b站评论并制作词云图
文章目录 前言 一.爬取b站评论 1.selenium配置 2.代码 二.制作词云图 1.下载停用词 2.代码 3.注意事项 三.制作成品 1.初期成品 2.成品 前言 b站视频下的评论是下拉加载的. ...
- Python 爬虫实例+爬取豆瓣小组 + wordcloud 制作词云图
目标 利用PYTHON爬取如下图中所有回答的内容,并且制作词云图. 用到的库 import requests # import jsonfrom PIL import Image from pyque ...
- python爬取豆瓣小组_Python 爬虫实例+爬取豆瓣小组 + wordcloud 制作词云图
目标 利用PYTHON爬取如下图中所有回答的内容,并且制作词云图. 用到的库 import requests # import json from PIL import Image from pyqu ...
- 爬取指定网页并制作词云图
利用python中的库和函数设计一个爬取读书网中"软件与程序设计"栏的程序,并对其书名制作词云图,下载其书封面存储到本地文件中. 构建多个函数分别进行网页的请求,html的获取,所 ...
- 对爬取的电影《唐人街探案3》豆瓣短评做文本分析,并利用stylecloud制作词云图
上一节,我们爬取了豆瓣上电影<唐人街探案3>的评论,并将评论保存成了txt文档,爬虫过程可参考:爬取某瓣上电影<唐人街探案3>的评论 本节,我们将对电影短评做文本分析,并利用s ...
- 利用python爬虫抓取虎扑PUBG论坛帖子并制作词云图
作为一个PUBG迷,刷论坛是每天必不可少的事,上面有很多技术贴和职业比赛的帖子,突发奇想,想知道论坛里谈论最多的是什么,便做了一个爬虫爬取了论坛上最新的帖子标题和部分回复,然后利用jieba与word ...
- e分钟带你利用Python制作词云图
随着大数据时代的来临,数据分析与可视化,显得越来越重要,今天给小伙伴们带来一种最常见的数据可视化图形-词云图的制作方法. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语 ...
- python处理数据集并制作词云图
python处理数据集并制作词云图 处理数据 使用自定义词典 去掉停用词 词频统计 绘制词云图+美化 1.处理数据 这里是老师给的新闻数据集,里面有5个类别的新闻数据,我以cars这一类为例. 将cs ...
最新文章
- 智慧城市 android,基于Android系统的智慧城市服务客户端的设计与实现
- Typora 收费,WTF? 还是需要支持下
- 从零开始学习python-《从零开始学 Python》(第二版)
- vue代码生成器可视化界面_手把手教你基于SqlSugar4编写一个可视化代码生成器(生成实体,以SqlServer为例,文末附源码)...
- VMwareTool 安装
- Tableau的简单数据可视化操作
- vue鼠标移动上去提示_关于如何处理vue中鼠标悬停事件的详细说明
- python 继承与多态
- jieba 中文分词
- iOS逆向之分析工具的安装和使用
- access查询出生年月大于_查询条件示例
- 国际电脑使用执照(ICDL)考试
- Mindjet MindManager2022版本自带简体中文,无需汉化
- Hypervisor是什么
- UDS04-清除诊断信息服务【ServiceID = 0x14】
- Python学习笔记(5)
- 利用opencv从USB摄像头获取图片 获得摄像头编号
- python正则匹配ABAC型词语
- YL70 远程I/O模块,可以用来测量四路开关量信号,并有四路继电器信号输出
- %格式化和format格式化--python
热门文章
- HPU图论专项(graph)【拓扑--二分图--最小生成树---树的直径---并查集--奇偶树---最小环---强联通】
- .net获取mysql数据_asp.net用DataSet从数据库中获取数据
- linux 无线网卡驱动 centrino 6200 agn,下载:Intel无线网卡驱动14.2官方正式版
- Node.js Kubernetes Graceful Shutdown
- 什么是动态DNS(DDNS)
- 阮一峰mysql_阮一峰:理解矩阵乘法
- BlenderGIS插件 城市建筑3D模型自动生成 教程
- jqwidgets日历插件如何改为中文版24小时制和bootstrap的日期控件如何改成24小时制
- MongoDB之按时间查询
- [IOI2018]组合动作 题解