详解python爬取弹幕与数据分析


Posted in Python onNovember 14, 2020

很不幸的是,由于疫情的关系,原本线下的AWD改成线上CTF了。这就很难受了,毕竟AWD还是要比CTF难一些的,与人斗现在变成了与主办方斗。
虽然无奈归无奈,但是现在还是得打起精神去面对下一场比赛。这个开始也是线下的,决赛地点在南京,后来是由于疫情的关系也成了线上。
当然,比赛内容还是一如既往的得现学,内容是关于大数据的。
由于我们学校之前并没有开设过相关培训,所以也只能自己琢磨了。
好了,废话先不多说了,正文开始。

一.比赛介绍

大数据总体来说分为三个过程。
第一个过程是搭建hadoop环境。
这个开始我也挺懵的,不过后来看了个教程大概懂了。总的来说,hadoop就是一个集成环境,这个环境里面包含了很多软件。
这些软件的功能各不相同,比如文件分布式(原谅我也忘了叫啥),大概作用就是假设你电脑有1个g大小,但是一个文件有10个g,那么你就可以用这个系统,将文件割成10份分别储存。
总的来说,就是为了大数据而服务的一个环境。

第二个过程就是爬取数据。
这个依据比赛的要求而定,我记得初赛的时候是要求爬取一个开源的电商网站,名字好像是SHOPXO。这个有爬虫的基础的同学可以去试下。
决赛还没比,不过好像是要爬取视频的弹幕。这个要比单纯的爬取视频麻烦一点,因为每个网站对弹幕的算法不一样。
一会儿我会写两个爬虫,分别爬取B站和A站的弹幕你们就知道了。

第三个过程就是分析数据。
这个说实话我也不太清楚。分析这一步其实python就可以做,但是貌似又得在那个环境里做。。。挺懵的,所以这里就不详细写了。

在写这篇帖子之前,我还写过一篇关于awd比赛的东西。不过由于其中涉及到很多比较特殊的东西,暂时无法外传,所以我就先设置成私密的了。
关于大数据其实我和你们一样是新手,只不过以前因为一些需要刚好学过爬虫,因此我负责的就是第二块内容。接下来我也会通篇讲一些爬虫和数据分析的东西。

二.爬虫

这个可以说是大数据里面很重要的东西了,因为即使你前面分析做的再好,没有数据供你分析又有什么用呢?所以,学好爬虫。
爬虫其实是一种代称,只是功能比较特殊,所以这么叫。在没学过爬虫之前,先想想看,我们正常是如何获取一些信息呢?就比如我们想知道周杰伦的歌单都有什么的时候。
第一步肯定是去百度搜索周杰伦,然后我们就可以在qq音乐之类的音乐网站上看到周杰伦的歌单。爬虫也得这样。
它没有你想象的那么神奇,肯定是要在某些网站上操作才行。

接着,你就可以一点一点的记录下来周杰伦的信息。我们的爬虫实现的也是这样的过程,只不过你一秒钟只能访问一个页面,而爬虫一秒钟可以访问几万个页面。

好了,关于爬虫的更详细的东西就先不说了,我们不是专门讲爬虫的。csdn上面有很多写爬虫的教程,都很详细。
我们主要的目的是进行实战。

三.爬取网站弹幕

本来是想以网站视频信息作为题目的,但是那个实在是没啥难度,正好比赛用得到弹幕,干脆就讲讲弹幕怎么爬取吧。

1.A站

A站相对于B站要简单一点。我们先观察网页。比如,这个是我随便打开的一个视频。
现在网站上的这些数据大部分都是动态的,因此我们不能直接用html解析器来解析网页,得直接爬取xhr里面的数据。

先按F12抓包。然后我们在搜索栏中随便搜索一条我们的弹幕。

详解python爬取弹幕与数据分析

很幸运,只有一个。我们双击这个查找的结果并进行观察。点到privew,可以发现这里面包含了我们所有的弹幕。

详解python爬取弹幕与数据分析

因此,这种网站直接爬取就行了。点到headers,我们观察参数以及请求方式。

详解python爬取弹幕与数据分析
详解python爬取弹幕与数据分析

ok。这些得到了以后,上脚本。

import requests
url="https://www.acfun.cn/rest/pc-direct/new-danmaku/poll"
headers={
  "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36",
  "cookie":""
  #注意,cookie要填你自己的。A站有些特殊,爬取的时候需要加上cookie。
  }
data={
  "videoId":"15779946",
  "lastFetchTime":"0",
  "enableAdvanced":"true"
  }
html=requests.post(url,headers=headers,data=data)
html=html.json()
html=html["added"]
for i in html:
  print(i["body"])

效果如图。

详解python爬取弹幕与数据分析

数量我数了一下,刚好是这个视频的弹幕数。你们可以添加自己的东西上去,比如增加写入文件啥的功能。

2.B站

这个有点特殊了。B站的弹幕是另一种算法。
B站将弹幕单独剥离出来到了一个网页上,需要视频对应的cid才可以获得到弹幕对应的码,然后获得视频的弹幕信息。举个例子:【哔哩哔哩2019拜年祭】

首先,我们要获取到视频的视频号以前是av号,现在是bv号。

详解python爬取弹幕与数据分析

然后将这个链接加上你的bv号。这个是哔哩哔哩的一个api,可以获得cid。
https://api.bilibili.com/x/player/pagelist?bvid=BV17t411y7R1&jsonp=jsonp
将连接中的bvid换成bv号。

如图,我们发现了视频有4个cid。

详解python爬取弹幕与数据分析

接着我们使用下一个api,这样就可以获得弹幕了。
https://comment.bilibili.com/76457841.xml
将后面的数字换成刚找到的cid。

结果如图:

详解python爬取弹幕与数据分析

很好。这就是我们手动获得弹幕的流程,接下来就是用爬虫做出来就行了。

第一步,将bv转成av号。其实你可以直接用bv号,但是由于我做这个帖子之前的时候用的是av号找的,所以加了这么一步。
这一步直接去网上找工具就行了,有很多,就不往代码上面加了。

第二部,用刚才给的第二个api获得cid。我们使用爬虫即可,将网址构造成规定的格式。
https://www.bilibili.com/widget/getPageList?aid=?
问号换成aid。

第三步,爬取。可以看到我们最终返回的是一个xml文件,所以用爬虫里面的xml解析器解析即可。

别的就不废话了,直接上代码。有啥没看懂的评论区问。

import requests
from bs4 import BeautifulSoup
import lxml

aid=input("请输入av号:如果是bv码请转换为av号\n")
file_name=input("请输入保存文件名:\n")
f=open(file_name,"a",encoding='utf-8')
headers={
  "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.193 Safari/537.36"
  }
get_cid="https://www.bilibili.com/widget/getPageList?aid="+aid
cid_list=eval(requests.get(get_cid).text)
for cid in cid_list:
  cid=cid["cid"]
  xml="https://comment.bilibili.com/"+str(cid)+".xml"
  html=requests.get(xml,headers=headers)
  html.encoding=html.apparent_encoding
  soup=BeautifulSoup(html.text,"xml").find_all("d")
  for dm in soup:
    f.write(dm.text+"\n")
f.close()

这个是直接将弹幕文件保存到本地了,为了方便后续的分析。结果如图。

详解python爬取弹幕与数据分析

一共是九万多条弹幕。

行了,剩下的就懒得写了。

四.数据分析

要说分析的话其实这个是很广的,得依据特定的要求来做。
先说说第一个,高频词统计。
代码是我copy的,简单但是好用。
(将上一步的文件放到和脚本同一个目录下)

import jieba.analyse
f =open(r'bilibil周年庆.txt',encoding='utf-8')#打开文件
text=f.read() #读取文件
text_list=jieba.analyse.extract_tags(text,topK=40)#进行jieba分词,并且取频率出现最高的40个词
text_list=",".join(text_list)#用空格将这些字符串连接起来
print(text_list)

如图,40个出现字数最多的词汇就被统计出来了。

详解python爬取弹幕与数据分析

由于是机器识别,难免不准,所以不要在意这些莫名其妙出现的次。

在说说第二个,情感分析。这个是我猜测可能会用的到的东西。
我们这个可以直接用baiduAPI来做,要比我们自己的写的好。这个api会将所有的数据进行情感预测,并且返回积极或者消极的概率。
不过你首先得去申请一个百度api的账号。这个就不说了,百度有教程。
代码也是我copy的。首先感谢下原作者,写的真的很棒。
(原本是要两个脚本,我改进了一下,写成了一个脚本。这个脚本仅仅测试了两个词,如果想对文件进行分析,稍微改动一下就行了。)

import re
import requests
import json

# 将text按照lenth长度分为不同的几段
def cut_text(text, lenth):
  textArr = re.findall('.{' + str(lenth) + '}', text)
  textArr.append(text[(len(textArr) * lenth):])
  return textArr # 返回多段值

def get_emotion(access_token,data): # 情感分析
  # 定义百度API情感分析的token值和URL值
  token = access_token 
  url = 'https://aip.baidubce.com/rpc/2.0/nlp/v1/sentiment_classify?charset=UTF-8&access_token={}'.format(token)

  # 百度情感分析API的上限是2048字节,因此判断文章字节数小于2048,则直接调用
  if (len(data.encode()) < 2048):
    new_each = {
      'text': data # 将文本数据保存在变量new_each中,data的数据类型为string
    }
    new_each = json.dumps(new_each)
    res = requests.post(url, data=new_each) # 利用URL请求百度情感分析API
    # print("content: ", res.content)
    res_text = res.text # 保存分析得到的结果,以string格式保存
    result = res_text.find('items') # 查找得到的结果中是否有items这一项
    positive = 1
    if (result != -1): # 如果结果不等于-1,则说明存在items这一项
      json_data = json.loads(res.text)
      negative = (json_data['items'][0]['negative_prob']) # 得到消极指数值
      positive = (json_data['items'][0]['positive_prob']) # 得到积极指数值
      print("positive:",positive)
      print("negative:",negative)
      # print(positive)
      if (positive > negative): # 如果积极大于消极,则返回2
        return 2
      elif (positive == negative): # 如果消极等于积极,则返回1
        return 1
      else:
        return 0 # 否则,返回0
    else:
      return 1
  else:
    data = cut_text(data, 1500) # 如果文章字节长度大于1500,则切分
    # print(data)
    sum_positive = 0.0 # 定义积极指数值总合
    sum_negative = 0.0 # 定义消极指数值总和
    for each in data: # 遍历每一段文字
      # print(each)
      new_each = {
        'text': each # 将文本数据保存在变量new_each中
      }
      new_each = json.dumps(new_each)
      res = requests.post(url, data=new_each) # 利用URL请求百度情感分析API
      # print("content: ", res.content)
      res_text = res.text # 保存分析得到的结果,以string格式保存
      result = res_text.find('items') # 查找得到的结果中是否有items这一项
      if (result != -1):
        json_data = json.loads(res.text) # 如果结果不等于-1,则说明存在items这一项
        positive = (json_data['items'][0]['positive_prob']) # 得到积极指数值
        negative = (json_data['items'][0]['negative_prob']) # 得到消极指数值
        sum_positive = sum_positive + positive # 积极指数值加和
        sum_negative = sum_negative + negative # 消极指数值加和
        # print(positive)
    print(sum_positive)
    print(sum_negative)
    if (sum_positive > sum_negative): # 如果积极大于消极,则返回2
      return 2
    elif (sum_positive == sum_negative): # 如果消极等于于积极,则返回1
      return 1
    else:
      return 0 # 否则,返回0

def main():
  # client_id 为官网获取的API Key, client_secret 为官网获取的Secret Key
  #这两个我都空出来了,你用你的填上就行了。
  client_id=""
  client_secret=""
  host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id='+client_id+'&client_secret='+client_secret
  response = requests.get(host)
  list_new=eval(response.text)
  access_token=list_new["access_token"]
  txt1 = "你好优秀"
  txt2 = "难过!"
  print("txt1测试结果:",get_emotion(access_token,txt1))
  print("txt2测试结果:",get_emotion(access_token,txt2))

if __name__ == "__main__":
  main()

效果如图。

详解python爬取弹幕与数据分析

剩下的比如折线图什么的就不写了,百度都有。

到此这篇关于详解python爬取弹幕与数据分析的文章就介绍到这了,更多相关pythonpython爬弹幕数据分析内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python标准异常和异常处理详解
Feb 02 Python
用Python实现协同过滤的教程
Apr 08 Python
python关闭windows进程的方法
Apr 18 Python
Python中with及contextlib的用法详解
Jun 08 Python
tensorflow构建BP神经网络的方法
Mar 12 Python
Python单向链表和双向链表原理与用法实例详解
Aug 31 Python
python集合比较(交集,并集,差集)方法详解
Sep 13 Python
Python Flask框架扩展操作示例
May 03 Python
python 自定义装饰器实例详解
Jul 20 Python
python 使用socket传输图片视频等文件的实现方式
Aug 07 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
Aug 13 Python
python使用openpyxl操作excel的方法步骤
May 28 Python
Ubuntu权限不足无法创建文件夹解决方案
Nov 14 #Python
Python爬虫过程解析之多线程获取小米应用商店数据
Nov 14 #Python
基于Python的身份证验证识别和数据处理详解
Nov 14 #Python
Python join()函数原理及使用方法
Nov 14 #Python
详解pycharm连接远程linux服务器的虚拟环境的方法
Nov 13 #Python
利用python 下载bilibili视频
Nov 13 #Python
详解python polyscope库的安装和例程
Nov 13 #Python
You might like
php连接mysql数据库代码
2009/03/10 PHP
PHP删除目录及目录下所有文件的方法详解
2013/06/06 PHP
jQuery 1.5 源码解读 面向中高阶JSER
2011/04/05 Javascript
Jquery实现带动画效果的经典二级导航菜单
2013/03/22 Javascript
js关闭父窗口时关闭子窗口
2013/04/01 Javascript
jquery实现table鼠标经过变色代码
2013/09/25 Javascript
让alert不出现弹窗的两种方法
2014/05/18 Javascript
在AngularJS中如何使用谷歌地图把当前位置显示出来
2016/01/25 Javascript
javascript类型系统_正则表达式RegExp类型详解
2016/06/24 Javascript
AngularJS入门教程之ng-checked 指令详解
2016/08/01 Javascript
微信公众号 摇一摇周边功能开发
2016/12/08 Javascript
JavaScript中for循环的几种写法与效率总结
2017/02/03 Javascript
jQuery日程管理控件glDatePicker用法详解
2017/03/29 jQuery
nodejs使用express创建一个简单web应用
2017/03/31 NodeJs
Ajax验证用户名或昵称是否已被注册
2017/04/05 Javascript
jQuery plugin animsition使用小结
2017/09/14 jQuery
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
2018/04/25 Javascript
NodeJS如何实现同步的方法示例
2018/08/24 NodeJs
arctext.js实现文字平滑弯曲弧形效果的插件
2019/05/13 Javascript
Angular封装表单控件及思想总结
2019/12/11 Javascript
[02:43]DOTA2亚洲邀请赛场馆攻略——带你走进东方体育中心
2018/03/19 DOTA
[42:25]EG vs Spirit Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
python实现代理服务功能实例
2013/11/15 Python
解决phantomjs截图失败,phantom.exit位置的问题
2018/05/17 Python
django 解决manage.py migrate无效的问题
2018/05/27 Python
python图像处理入门(一)
2019/04/04 Python
解决pycharm最左侧Tool Buttons显示不全的问题
2019/12/17 Python
python中sklearn的pipeline模块实例详解
2020/05/21 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
2020/06/08 Python
详解canvas多边形(蜘蛛图)的画法示例
2018/01/29 HTML / CSS
Debenhams百货英国官方网站:Debenhams UK
2016/07/12 全球购物
英国知名化妆品网站:Revolution Beauty(原TAM Beauty)
2018/02/28 全球购物
上海天奕面试题笔试题
2015/04/19 面试题
音乐教师求职信
2014/06/28 职场文书
三好生演讲稿
2014/09/12 职场文书
朋友圈早安励志语录!
2019/07/08 职场文书