查看原文
其他

爬虫B站弹幕| 考完试,这辈子,这个班,基本是聚不齐了......

印象Python 2022-08-01

The following article is from GOGO数据 Author 是沐沐呀

文 |沐沐

来源:GOGO数据「ID: mu_science」



嗨!朋友,我是沐沐
欢迎来到学习python的宝藏基地~~~
今天给大家介绍python如何爬取B站弹幕并且可视化,一起来看看吧!

关于毕业,你有什么想说的呢?一起先来看看视频。

这里面有你的回忆吗?




毕业聚会就是你笑着喝完这瓶啤酒说:“以后无论如何也要再聚在一起”可是却再也聚不齐了。
毕业了,那种在青春里放肆的幸福我想以后不会在有了。
校服是我和她穿过唯一的情侣装,毕业照是我和她唯一的合影。
我曾如此讨厌学校,最后却如此怀念。
拍毕业照只需要三秒,定格的却是三年。
毕业了,不想说再见!
班主任说吃散伙饭的时候,全班的人都沉默了,班里第一次这么安静,嗯,要毕业了。
考完试,这辈子,这个班,基本是聚不齐了。
就这样眨眼间毕业了。如果上天再给我一次机会,我要永远不毕业。
这个六月。喜欢校园喜欢同学喜欢老师。这个夏天就要和他们挥手了。
我考了那么多试,没想到是为了离开家,故乡再没有春和秋,只剩下匆匆来去的冬夏。



曾经如此渴望独立,真的到了这个时候,我却如此害怕失去这群人....
一起来看看还有什么想要说而不敢说的呢?


B站的弹幕区一如既往的‘人才济济’啊。这次我们想要爬取这部番的弹幕,并生成词云图。让我们来看看大家都在弹幕里说了些什么吧。



网站分析



在B站中,许多基础的数据,如弹幕、评论、视频基本信息等,都有非常成熟和稳定的应用程序接口(API)可供使用。

也就是说,我们可以通过弹幕 API,获取一个视频的弹幕数据。

什么是API

API 是 Application Programming Interface (应用 编程 接口)三个单词的缩写。

通俗易懂的说,API 其实就是别人已经写好的可以实现特定功能的函数。

只需要调用它,传入规定的参数,这个函数就可以实现功能。



在B站中,只要视频中有弹幕,就会有一个 cid 参数。cid 用来表示某个视频对应的弹幕池。

前面我们提到,API 一般以 URL 形式存在的,B站的弹幕 API 的 URL 链接看图示代码中。

看来,只要知道了 cid 参数值,就可以找到视频弹幕数据的位置了



如图我们搜索cid并且找到该视频的cid

输入到爬取弹幕的API中


http://comment.bilibili.com/{cid}.xml


在浏览器打开网址




发送请求


我们的目标就是将这些弹幕下载到我们的本地


  url = f'http://comment.bilibili.com/{cid}.xml'

  headers = {
      'referer''https://www.bilibili.com/video/BV1dM4y1u76V',
      'User-Agent': str(UserAgent().random)
  }

  resp = requests.get(url, headers = headers)
  # 调用.encoding属性获取requests模块的编码方式
  # 调用.apparent_encoding属性获取网页编码方式
  # 将网页编码方式赋值给response.encoding
  resp.encoding = resp.apparent_encoding

  if resp.status_code == 200:
        print(resp.text)



我们从获取到网站的响应信息后可以看出,所有的弹幕文字信息其实都是在

<d></d>标签之内的,所以我们选择使用正则提取。


<d p="251.98000,4,25,14811775,1594262476,0,9befc340,35190368391135239">我终将青春还给了她</d>


   # 获取所有评论内容
    content_list = re.findall('<d p=".*?">(.*?)</d>', resp.text)

    for item in content_list:
        print(item)




保存数据


数据获取就真么简单,接下来就是数据持久化。为了方便后续的词云可视化,我们选择将弹幕信息保存到 csv文件中


      for item in content_list:
          with open('B站弹幕.csv''a', encoding = 'utf-8')as fin:
              fin.write(item + '\n')
              print(item)
      print('-------------弹幕获取完毕!-------------')


卧槽,弹幕全是表白,酸了酸了,我不该看的





可视化分析


我们要jieba来分词,使用imread模块来读取图片信息,最后使用wordcloud来生成我们想要的词云图。


  with open(comment_file_path, encoding='utf-8')as file:
      comment_text = file.read()
      wordlist = jieba.lcut_for_search(comment_text)
      new_wordlist = ' '.join(wordlist)
      mask = imread('img_1.png')
      wordcloud = WordCloud(font_path='msyh.ttc', mask=mask).generate(new_wordlist)
      wordcloud.to_file('picture_1.png')


满满两张虐狗墙啊





1. 本文详细介绍了pandas在处理数据时常用到的技巧,

有兴趣的读者可以尝试自己动手练习一下。


2. 本文仅供读者学习使用,不做其他用途!


3. 右下角点亮[在看]

即可找我领取本文的全部代码呦

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存