前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >网络爬虫爬取b站励志弹幕并生成词云(精心笔记总结)

网络爬虫爬取b站励志弹幕并生成词云(精心笔记总结)

作者头像
兰舟千帆
发布2022-07-16 12:25:15
7370
发布2022-07-16 12:25:15
举报
文章被收录于专栏:兰舟千帆的java学习笔记

前言 在进入本文之前,我很想给大家推荐b站这个视频,3080.2万播放,27.9万条弹幕。这个视频之火不是因为漂亮的小姐姐,也不是什么很傻,很逗人发笑的视频,而是因为那满满的正能量,以及对于年轻人的激励,我们要活成我们的样子,我们是后浪,我们遇见这个时代,时代遇见今天的我们。

弱小的人才习惯嘲讽和否定,而内心强大的人从不吝啬赞美和鼓励!我们就是后浪,奔涌吧!后浪,奔涌吧!新一代!相信你们看了这个视频会内心波涛汹涌。在b站待了这么长时间,很荣幸可以看到这样的视频。

正文 1:我们今天的目标是爬取此视频的弹幕,并生成词云。一方面是为了做笔记,总结今天学到的,另一方面,我是为了分享经验,以及让大家看到这满是正能量的弹幕词云,足以冲击你的内心。 2:实现思路 我们主要用到以下几点知识

<1 爬虫技术     python库: requests , re, csv, jieba,imageio,wordcloud

<2分析网站: bill网站特定视频

<3查找数据来源的api: 弹幕数据来源的api 3:具体实现:

我们来打开billbill这个视频主页:

我们要拿到的是弹幕数据,我们可以指定某天的弹幕数据,当然通过爬虫,我们可以全部拿下,今天,我们随便指定日期,都是一样的道理。

既然是分析网站,自然是右键查看源码了。

这里面有数据,但不是我们的方向,我们可以清空数据。我们要拿到弹幕的api。那么,需要抓包。我们点击b站弹幕列表下面的查看历史弹幕。

看到上面那个日历没有,今天是2/17,那我就拿今天的弹幕。

下面进行抓包,我们清空network下面的所有,现在我们点击日历上的2/17,我们观察会出现什么。来看

不知道你有没有注意到这样一段 :

seg.so?type=1&oid=186803402&date=2021-02-17

我分析这个包,后面是一个日期格式的参数。那我一定会想到,只要我按照这样的格式,我可以指定任意一天。很可能这个就是我们要寻求的方向。我们点进去。来看

这里放大了了,希望能看到这个蓝色的一行。很熟悉的,是url,下面是请求相关的。我们点进去这个url。会发现是一个文件,这个文件并不是普通的文件。你可以下载,然后用notepad打开,指定格式utf-8编码后,会显示这样。

我们看到里面是有弹幕中文的,但是也有不认识的东西。这里至少可以证明我们的url找对了。这样的弹幕数据不是我想要的,因为我还要生成词云,说以还是以代码来处理整个过程。我会解释相关的代码。 来看代码 下面展示一些 内联代码片

代码语言:javascript
复制
#流程
#导入工具
import requests #第三方工具
import re #正则
import csv #处理保存csv文件格式
import jieba #用来分词的国人开发的库 import wordcloud
import imageio # 读图片
import wordcloud #词云库

#目标网站
url = ' https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=186803402&date=2021-02-17'
#模拟浏览器发送请求,接受返回的数据
headers = {
    # 用户代理 身份证
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36',
    # 账号已登录信息
     'cookie': '_uuid=DB17FC3E-C33B-0402-FEC8-6D5F54FFD75826400infoc; buvid3=524A488F-FA38-4505-A9FD-80539B19E3FB184978infoc; sid=a2zoyf7s; buvid_fp=524A488F-FA38-4505-A9FD-80539B19E3FB184978infoc; DedeUserID=650586683; DedeUserID__ckMd5=673346effe04fe44; SESSDATA=dc4b2c16%2C1628474903%2Cc95da*21; bili_jct=f92980128fe4681476212c6cfe3d0ff7; CURRENT_FNVAL=80; blackside_state=1; rpdid=|(J|)JR|||Rm0J uYukmkkmJk; fingerprint3=dc6c77bb0dfdccdd39bc9efbb780630d; fingerprint=f29725bb59f7984374f945e2ebddc362; buvid_fp_plain=524A488F-FA38-4505-A9FD-80539B19E3FB184978infoc; fingerprint_s=0a7abb581b9ea03451e614a51a3d4b2b; LIVE_BUVID=AUTO8416133069733130; bp_video_offset_650586683=491829482594004200; bsource=search_baidu; PVID=1; bfe_id=1e33d9ad1cb29251013800c68af42315'
}
resp = requests.get(url,headers=headers)
print(resp) # 打印输出一下看是否可以正常访问
print(resp.text)#以文本的形式打印网页源代码
# 获取弹幕数据
#中文
Danmu = re.findall("[\u4e00-\u9fa5]+",resp.text) # 用到的正则,匹配中文
print(Danmu)
# 4.数据保存
for i in Danmu : #相当于一个遍历保存
    with open('B站弹幕.csv','a',newline='',encoding='utf-8') as f :
        writer = csv.writer(f) #这里可以理解为传入文件句柄
        #文件句柄可以帮助我们找到该文件,作用是这个。
        danmu = []
        danmu.append(i)
        writer.writerow(danmu)
# 绘制词云
f = open('B站弹幕.csv','r',encoding='utf-8')
txt = f.read()
#print(txt)

# 1.分词处理
textlist = jieba.lcut(txt)
print(textlist)
string1 = ' '.join(textlist) #拼接成整个字符串
#print(string)
mk = imageio.imread(r'心.jpg')
w=wordcloud.WordCloud(
    width = 1000,
    height =700,
    background_color ='white',
    font_path='msyh.ttc',
    mask =mk,
    scale = 18,
    stopwords = {'','\n','\r'},#停用词
    contour_width =5,
    contour_color ='red'

)
# 将string变量传入w的generate()方法,给词云输入文字
w.generate(string1)
#将词云图片导出到当前文件夹
w.to_file('out1.png')

我觉的代码很详细了,但是给大家在稍微说点就是为何要指定user-agent,以及cookie。 指定user-agent是为了模拟浏览器访问,否则网站会认为你是爬虫,是写程序去访问的,可能会被卡擦掉。当然还有指定高级的线程池什么的,在这里是没必要的。cookie,保存了你登陆网站的信息,很像一个身份证,如果你不指定cookie,那么网站会提示你登录的。可以把他理解为身份信息,当你访问网站时,网站就给你存一个cookie。 这里面有一个jieba库,是我们国人开发的,有点自豪。是用来分词的,具体可以去查阅文档理解相关的源码和方法。

re库是导入用来写正则语法的库,是用来匹配的。规则很简单,但是东西比较多哦。当然我们也可以直接去网站查看规则。很多匹配的语法规则都有。csv是一种文件格式,也可以去查看库理解,并不是难事。词云时,需要读取csv格式文件

代码中wordcloud中的参数mk代表指定根据的图片绘制词云,这里要求图片背景尽量为白色,里面可以有你想要的形状。更详细的请查看资料了解相关的方法。

还有就是关于with open()这部分代码中的newline参数, 当在读取模式下,如果新行符为None,那么就作为通用换行符模式工作,意思就是说当遇到\n,\r或\r\n都可以作为换行标识,并且统一转换为\n作为文本输入的换行符。当设置为空’’时,也是通用换行符模式工作,但不作转换为\n,输入什么样的,就保持原样全输入。当设置为其它相应字符时,就会判断到相应的字符作为换行符,并保持原样输入到文本。 当在输出模式时,如果新行符为None,那么所有输出文本都是采用\n作为换行符。如果设置为’’或者\n时,不作任何的替换动作。如果是其它字符,会在字符后面添加\n作为换行符。所以这个参数的设置非常重要。

还有一个方法就是’ ‘.join(),代表以’ '拼接字符串。比如 string2 = ‘,’.join(‘abcd’) 那么会输出a,b,c,d。就是这样的意思。

我们来看代码的实现结果,这里有我的几个词云,好与不好,都与图片的选择有关,简单展示一下。

执行完这段代码后,控制台可能会打印你不需要的信息,注释掉即可,那是我测试用的。还有就是不要看到控制台打印出红色字体就认为出错了。你得知道他在说啥。像下面是没有错误的。

就写到这里了,相关的请遵守csdn博客协议。期待与大家共同进步。

------jgdabc 点击访问主页

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 就写到这里了,相关的请遵守csdn博客协议。期待与大家共同进步。
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档