python爬取bilibili弹幕_python爬虫:bilibili弹幕爬取+词云生成

19d68591-8a10-4a6d-b133-b04b6a3b8b58.png

如果你懒得看下边的文字,我录了一个完整的教学视频在b站上。

我的B站教学:https://www.bilibili.com/video/av75377135?p=2

工作原理

b站是提供弹幕接口的,所以我们的整体操作进行如下:

1.到B站获取cid2.将cid与网站固定格式进行链接3.用python请求网页4.进行简单的单词处理5.生成词云

接下来我们就按照刚才说的顺序进行详细解释

操作顺序

1.到B站获取cid

首先点进一个视频网页,点击F12-network获取监测页面,然后一定要点击播放视频,我们就会在监测页面中看到一个叫heartbeat的XHR脚本,点开任意一个即可。

4772174d-f5d8-4604-ab25-370e3e9a1f5f.png

点击之后我们需要看Headers,里边包括了我们想知道的信息。往下滚动就会发现cid,这个id是唯一的,也就是说下次抓取的时候还可以用这个id。

5e924e5e-2a36-4dfa-aefd-abbeaa939a49.png

2.将cid与网站固定格式进行链接

我们拿到cid之后就可以去检查一下是否可以获取弹幕了。获取的固定xml格式是: https://comment.bilibili.com/视频的cid.xml

例如在这里我们的页面就是:

'https://comment.bilibili.com/94198756.xml'

我们把这个链接用网页的方式打开,就能看到如下内容:

f1433b6a-9a0c-4d48-9c72-2793448c40fd.png

这样我们就确定可以爬取了。

3.用python请求网页

因为是开源的,我们也不需要设置代理agent什么的,直接获取就行

import requestsfrom bs4 import BeautifulSoupurl= 'https://comment.bilibili.com/94198756.xml'request = requests.get(url)#获取页面request.encoding='utf8'#因为是中文,我们需要进行转码,否则出来的都是unicode

通过之前的网页查看,我们发现弹幕的XML规律如下:

停车场反杀龙卷风

都是d开头,所以我们只需要用beautifulsuop来选取所有的‘d’就可以

soup = BeautifulSoup(request.text, 'lxml')results = soup.find_all('d')#找出所有'd'comments = [comment.text for comment in results]#因为出来的时候是bs4格式的,我们需要把他转化成list

这样一个完整的弹幕list就已经有了,这里要注意,b站弹幕提取上线是1000条,所以大于一千的就会随机选取1000条弹幕给你。

4.进行简单的单词处理

拿到之后的弹幕并不能直接满足我们进行单词分析,我们要进行一些简单的清理 (1)有一些英文我们需要统一大小写

comments = [x.upper() for x in comments]#统一大小写

(2)去掉弹幕中的空格 例:‘仙 人 指 路’ 和 ‘仙人指路’ 是没有区别的

comments_clean = [comment.replace(' ','') for comment in comments]#去掉空格

(3)我们简单的看一下弹幕之后发现弹幕里边的’/test’是有很多,但是我们并不需要它,诸如此类:

set(comments_clean)#看一下都有啥类似的没用的词语useless_words = ['//TEST','/TESR','/TEST','/TEST/','/TEXT','/TEXTSUPREME','/TSET','/Y','\\TEST']comments_clean = [element for element in comments_clean if element not in useless_words]#去掉不想要的字符

进行完上述处理之后,我们就可以进行词云的制作了。不过在制作之前,还是让我们简单的看一下词频。(不是最终的,因为一会要把句子里的词分开)

import pandas as pdcipin = pd.DataFrame({'danmu':comments_clean})cipin['danmu'].value_counts()

(4)分词 在这里我们把刚才得到的弹幕用jieba库进行分词

danmustr = ''.join(element for element in comments_clean)#把所有的弹幕都合并成一个字符串import jiebawords = list(jieba.cut(danmustr))#分词

(5)进一步clean 分词之后,我们会发现里边有很多的符号或者是单字,这些是没有意义的,我们要去掉这一些。

fnl_words = [word for word in words if len(word)>1]#去掉单字

5.生成词云

至此我们可以通过词词频来生成词云了 首先我们要下载词云的包

!pip install wordcloud

然后生成词云

import wordcloudwc = wordcloud.WordCloud(width=1000, font_path='simfang.ttf',height=800)#设定词云画的大小字体,一定要设定字体,否则中文显示不出来wc.generate(' '.join(fnl_words))

这样就生成了,我们现在来看一下

from matplotlib import pyplot as pltplt.imshow(wc)

3c48d011-b86a-46ab-887e-5c3212f52ce4.png

如果不满意样子的话是可以在wordcloud.WordCloud里边调整的,例如可以调整画布大小,随机字体颜色区间,画布背景等等。或者更傻的方式就是重新跑一下wc.generate(’ '.join(fnl_words))就可以出来新的图片了

最后保存一下我们做好的图片

wc.to_file(r"C:\Users\CCHANG\Desktop\danmu_pic.png")

顺带提一句,我们还可以拿一个图片作为蒙版按形状生成图片。

我们需要先上传一个图片,把它做成numpy.array的形式。我们就自己画一个图吧,记住,上传的图片背景主题一定要对比鲜明

5d755522-7193-4928-8fc2-cfbc78b9005d.png

import cv2img = cv2.imread(r'C:\Users\CCHANG\Desktop\circle.png', cv2.IMREAD_UNCHANGED) #直接读取成了数字格式resized = cv2.resize(img, (800, 800),interpolation = cv2.INTER_AREA)#我们把它重新设定一下大小

不过有的时候用cv2不是非常稳定,所以我们还有另一种方法

from PIL import Imageimport numpy as npimg = Image.open(r'E:\录屏\course3\mask.jpg')resized = np.array(img)

然后我们调整wordcloud里边的一些设置,再生成一次

wc_1 = wordcloud.WordCloud(background_color='black',width=1000,height=800,mask=resized,font_path='simfang.ttf'# ,color_func = wordcloud.random_color_func())wc_1.generate_from_text(' '.join(fnl_words))#绘制图片plt.imshow(wc_1)plt.axis('off')plt.figure()plt.show() #显示图片

最后就变成了这样

29cdd592-f84f-43df-b400-3a5bff66c99e.png

记得保存哦~

wc_1.to_file(r'C:\Users\CCHANG\Desktop\danmu_pic_2.png')

记得如果看不懂就去看我的B站教学https://www.bilibili.com/video/av75377135?p=2

完整代码

import requestsfrom bs4 import BeautifulSoupimport pandas as pdimport jiebaimport wordcloudfrom matplotlib import pyplot as plturl= 'https://comment.bilibili.com/94198756.xml'request = requests.get(url)#获取页面request.encoding='utf8'#因为是中文,我们需要进行转码,否则出来的都是unicodesoup = BeautifulSoup(request.text, 'lxml')results = soup.find_all('d')#找出所有'd'comments =[comment.text for comment in results]#得到完整的listcomments = [x.upper() for x in comments]#统一大小写comments_clean = [comment.replace(' ','') for comment in comments]#去掉空格set(comments_clean)#看一下都有啥类似的没用的词语useless_words = ['//TEST','/TESR','/TEST','/TEST/','/TEXT','/TEXTSUPREME','/TSET','/Y','\\TEST']comments_clean =[element for element in comments_clean if element not in useless_words]#去掉不想要的字符cipin = pd.DataFrame({'danmu':comments_clean})cipin['danmu'].value_counts()#查看词频danmustr = ''.join(element for element in comments_clean)#把所有的弹幕都合并成一个字符串words = list(jieba.cut(danmustr))#分词fnl_words = [word for word in words if len(word)>1]#去掉单字wc = wordcloud.WordCloud(width=1000, font_path='simfang.ttf',height=800)#设定词云画的大小字体,一定要设定字体,否则中文显示不出来wc.generate(' '.join(fnl_words))plt.imshow(wc)#看图wc.to_file(r"C:\Users\CCHANG\Desktop\danmu_pic.png")#保存#######################################################加蒙板的图片import cv2img = cv2.imread(r'C:\Users\CCHANG\Desktop\circle.png', cv2.IMREAD_UNCHANGED) #直接读取成了数字格式resized = cv2.resize(img, (800, 800),interpolation = cv2.INTER_AREA)#我们把它重新设定一下大小#不过有的时候用cv2不是非常稳定,所以我们还有另一种方法#from PIL import Image#import numpy as np#img = Image.open(r'E:\录屏\course3\mask.jpg')#resized = np.array(img)wc_1 = wordcloud.WordCloud(background_color='black',width=1000,height=800,mask=resized,font_path='simfang.ttf'# ,color_func = wordcloud.random_color_func())wc_1.generate_from_text(' '.join(fnl_words))#绘制图片plt.imshow(wc_1)plt.axis('off')plt.figure()plt.show() #显示图片wc_1.to_file(r'C:\Users\CCHANG\Desktop\danmu_pic_2.png')

作者:https://blog.csdn.net/johnchang0201/article/details/103004229

75cbc46d-5d6d-4f35-b02c-0df2617f2b02.jpg

IT入门 感谢关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428283.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c json输出html标签,Json编码HTML字符串

我目前正在从PowerShell脚本生成JSON文件,但它正在输出Unicode而不是特殊字符,如这是我得到的输出:[{"Id": "187303","LinkText": "\u003cb style color:#d11717;\u0027\u003eAnnual General Meeting (ME…

access vba 常量数组赋值_聊聊 VBA 数组的那些坑

为什么使用数组?1. 缩减工作薄文件大小,提高运行效率一般而言只是使用 Excel 的内置工作表函数,在运算方面还是很高效的,但有时因为一个单元格牵扯的计算太多,比如调用多单元格数据,对结果文本进行部分替换…

extern、static

1. 基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。 也就是说extern有两个作用,第一个,当它与"C&quo…

python如何处理数据_python数据处理之如何选取csv文件中某几行的数据

前言 有些人看到这个问题觉得不是问题,是嘛,不就是df.col[]函数嘛,其实忽略了一个重点,那就是我们要省去把csv文件全部读取这个过程,因为如果在面临亿万级别的大规模数据,得到的结果就是boom,bo…

HTML文件可通过www进行传输,使用 zssh 进行 Zmodem 文件传输

Zmodem 最早是设计用来在串行连接(uart、rs232、rs485)上进行数据传输的,比如,在 minicom 下,我们就可以方便的用 Zmodem (说 sz 、rz 可能大家更熟悉)传输文件。只不过串口本身传输速度不快,文件大的话会让人有点崩溃。没有彻底把…

Linux下使用popen()执行shell命令

转载于&#xff1a;https://www.cnblogs.com/caosiyang/archive/2012/06/25/2560976.html 简单说一下popen()函数 函数定义 #include <stdio.h>FILE * popen(const char *command , const char *type ); int pclose(FILE *stream); 函数说明 popen()函数通过创建一个管道…

centos7安装python3.7.4_Centos7升级Python3.7.4

和大家技术分享一下当我们安装完成Centos7后&#xff0c;默认系统Python的版本为2.7.5。我们希望将Python升级到最新版本。 1、安装依赖项 yum install -y openssl-devel openssl-static zlib-devel lzma tk-devel xz-devel bzip2-devel ncurses-devel gdbm-devel readline-dev…

中年人可以学计算机吗,中老年人学计算机与上网的操作系统是windows xp还是window7...

中老年人学计算机与上网的操作系统是windows xp还是window7《中老年人学电脑与上网》想买这本书给爸妈学&#xff0c;但是不知道操作系统什么&#xff0c;简介上也没有写&#xff0c;有没有知道的告诉我是用什么系统教的。谢谢 我是想买这本书&#xff0c;请看过这本书的人告诉…

MyEclipse移动开发教程:迁移HTML5移动项目到PhoneGap(二)

MyEclipse开年钜惠 在线购买低至75折&#xff01;立即开抢>> 【MyEclipse最新版下载】 二、将文件从HTML5项目复制到PhoneGap项目中 1. 在HTML5 app项目的www/文件夹的资源中&#xff0c;单击右键&#xff0c;然后选择Copy。 从HTML5项目复制www资源2. 将资源粘贴到新Pho…

pb graph鼠标移上显示数据_Plotly数据可视化:离线版、微软vscode版的Python的基本作图...

1 介绍&#xff1a;1.1 Plotly 是一款用来做数据分析和可视化的在线平台&#xff0c;功能非常强大。1.2 Plotly是一个非常著名且强大的开源数据可视化框架&#xff0c;它通过构建基于浏览器显示的web形式的可交互图表来展示信息。1.3 具有多种语言python、javascript、matlab、…

Wireshark抓包常见问题解析(转)

1. tcp out-of-order&#xff08;tcp有问题&#xff09; 解答&#xff1a; 1&#xff09;、 应该有很多原因。但是多半是网络拥塞&#xff0c;导致顺序包抵达时间不同&#xff0c;延时太长&#xff0c;或者包丢失&#xff0c;需要重新组合数据单元 因为他们可能是通过不同的路径…

计算机专业论文范文精选,计算机毕业论文提纲范文精选

论文提纲&#xff0c;是指论文作者动笔行文前的必要准备&#xff0c;是论文构思谋篇的具体体现。下面是CN人才网为大家整理的计算机毕业论文提纲范文精选&#xff0c;欢迎参考~计算机毕业论文提纲范文精选论文题目 通过QoS配置解决大流量问题副标题 通过QoS配置保证智能化小区的…

centos安装无线网卡驱动_CentOS下显卡驱动安装的相关思考

背景&#xff1a;最近在安装显卡驱动&#xff0c;查找了一些网上的教程&#xff0c;但总感觉思路不够清晰&#xff0c;没办法弄清背后涉及的Linux原理&#xff0c;于是参考网上教程&#xff0c;并查阅了相关资料&#xff0c;希望能对显卡驱动安装作一个梳理&#xff0c;以做记录…

获取select被选中的option的值

<select id"select"> <option>绥江</option> <option>西江</option> <option>北江</option> <option>贺江</option> <option>新兴江</option> </select> $(funct…

红石32位cpu通用计算机,我的世界无命令方块32位红石电脑装置详解

来源&#xff1a;游戏园日期&#xff1a;2019-05-14 04:03:07我的世界无命令方块32位红石电脑装置详解。那下面给大家分享的是我的世界中的一个叫做机器编号为RSC-3230的红石电脑装置哦~有喜欢的顽疾啊不妨进来看看下的这个电脑哦~喜欢的话还可以下载下面的存档哦~本作品是一台…

c++心形代码_c语言心形告白代码实现

c语言心形告白代码实现1.彩色告白includeincludeincludeincludedefine U 0.1define V 0.053void SetColor(unsigned short ForeColor,unsigned short BackGroundColor){HANDLE hConGetStdHandle(STDOUTPUTHANDLE);SetConsoleTextAttribute(hCon,(ForeColor%16)|(BackGroundColo…

python字符串字面量有哪四种定义方式_Python学习笔记(四)字符串型

字符串是 Python 中最常用的数据类型。我们可以使用引号(或")来创建字符串。 在最新的Python 3版本中&#xff0c;字符串是以Unicode编码的&#xff0c;也就是说&#xff0c;Python的字符串支持多语言。 创建字符串很简单&#xff0c;只要为变量分配一个值即可 View Code …

python之os、sys和random模块

import os# print(os.getcwd())#获取当前目录&#xff0c;绝对路径# print(os.chdir(../))#更改当前目录&#xff0c;../的意思是退回上一级目录# print(os.getcwd())# print(os.curdir)#当前目录&#xff0c;相对路径# print(os.pardir)#当前目录&#xff0c;相对路径# print(…

审计署计算机培训心得体会,审计署计算机中级培训心得体会2018

《审计署计算机中级培训心得体会.doc》由会员分享&#xff0c;可免费在线阅读全文&#xff0c;更多与《审计署计算机中级培训心得体会2018》相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索。1、要&#xff0c;课前要有一定的预习&#xff0c;预习时不必太细致&…

python执行效率有多低_python – Scapy的低性能

我正在创建一个脚本,将来自Tap0的所有流量发送到Eth0,并将来自Eth0的所有流量发送到Tap0.在网上找到很多例子后,我设法让它发挥作用.我遇到的问题是性能非常低. 在不使用脚本的情况下在2个VM之间进行ping操作,所需时间不到1毫秒.使用脚本需要大约15ms. 当我使用scp从VM向另一个…