上次的b站爬取需要手动输入日期等信息,这次直接在程序内根据时间差进行爬取,直接放上完整代码。


代码

上次的分析链接在此:b站弹幕爬取分析
直接附上完整代码:



import requests
from lxml import etree
import pandas as pd
from wordcloud import WordCloud
import jieba
import datetimeclass BarrageSpider:def __init__(self, bv):# 需要一个bv号,在接下来的代码中进行替换操作self.bv = bvself.video_name = None# 不需要登录的弹幕接口地址 只能爬取部分弹幕self.barrage_url = 'https://comment.bilibili.com/{}.xml'# 需要登陆的弹幕接口地址 根据日期进行分类 需要循环爬取 最后归总数据self.date_url = 'https://api.bilibili.com/x/v2/dm/history?type=1&oid={}&date={}'  # 2021-01-01# 点击按钮弹出日历的数据接口,这里我们用来作索引self.index_url = 'https://api.bilibili.com/x/v2/dm/history/index?type=1&oid={}&month={}'  # 2021-01# 在抓包工具中找的一个简洁的请求,里面有我们需要的oid或者是cidself.bv_url = 'https://api.bilibili.com/x/player/pagelist?bvid=' + bv + '&jsonp=jsonp'# 视频时间获取self.video_url = 'https://www.bilibili.com/video/{}'.format(bv)# 不需要登录接口的伪装头self.comment = {'referer': 'https://www.bilibili.com/','user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.66 '}# 需要登录的伪装头 因为需要登录 ip代理已经没有意义了 这里就不再使用IP代理self.date_headers = {"referer": "https://www.bilibili.com/","origin": "https://www.bilibili.com","cookie": "你的cookie 爬很久远的视频 会被封ip 后面接收到的都是空结果","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.66 "}# 从接口返回的json中获取到我们的cid 注: cid = oiddef get_cid(self):# 定位到数据data中下面的cidreturn requests.get(url=self.bv_url, headers=self.comment).json()['data'][0]['cid']def get_video_time(self):time_data = requests.get(url=self.video_url, headers=self.comment).textvideo_page = etree.HTML(time_data)v_time = video_page.xpath('//div[@class="video-data"]/span[3]/text()')[0].split(' ')[0]self.video_name = video_page.xpath('//h1[@class="video-title"]/span/text()')[0]return v_time# 解析不需要登录的接口 返回类型是xml文件def parse_url(self):# 获取指定视频的cid/oidcid = self.get_cid()# 对页面进行伪装请求,这里注意不要转换成text,使用二进制response = requests.get(url=self.barrage_url.format(cid), headers=self.comment).content# etree解析data = etree.HTML(response)# 定位到所有的d元素barrage_list = data.xpath('//d')for barrage in barrage_list:# 获取d元素的p属性值info = barrage.xpath('./@p')[0].split(',')# 获取弹幕内容content = barrage.xpath('./text()')[0]item = {'出现时间': info[0], '弹幕模式': info[1], '字体大小': info[2], '颜色': info[3], '发送时间': info[4], '弹幕池': info[5],'用户ID': info[6], 'rowID': info[7], '内容': content}# 因为这只是一部分弹幕 所以就没有进行持久化存储 没有必要print(item)# 循环爬取所有弹幕 需要传入month的数据 根据视频发布的日期到现在的所有月份def parse_date_url(self, month):print('正在爬取{}月份的数据'.format(month))# 存放爬到的数据result = []# 获取视频的oidoid = self.get_cid()# 获取日期索引date_by_month = requests.get(url=self.index_url.format(oid, month), headers=self.date_headers).json().get('data')# 根据日期索引循环请求if date_by_month:for day in date_by_month:print('{}月份数据下的{}'.format(month, day))# 注意还是二进制文件date_page = requests.get(url=self.date_url.format(oid, day), headers=self.date_headers).contentdate_data = etree.HTML(date_page)# 解析到到所有的d元素barrage_list = date_data.xpath('//d')# 循环解析数据for barrage in barrage_list:# 获取d元素的p属性值things = barrage.xpath('./@p')[0].split(',')# 获取弹幕内容 并去掉所有空格content = barrage.xpath('./text()')[0].replace(" ", "")item = {'出现时间': things[0], '弹幕模式': things[1], '字体大小': things[2], '颜色': things[3], '发送时间': things[4],'弹幕池': things[5],'用户ID': things[6], 'rowID': things[7], '内容': content}result.append(item)# 返回封装好的数据return result# 根据现在的时间遍历所有的月份信息def parse_month(self):start_day = datetime.datetime.strptime(self.get_video_time(), '%Y-%m-%d')end_day = datetime.date.today()months = (end_day.year - start_day.year) * 12 + end_day.month - start_day.monthm_list = []for mon in range(start_day.month - 1, start_day.month + months):if (mon % 12 + 1) < 10:m_list.append('{}-0{}'.format(start_day.year + mon // 12, mon % 12 + 1))else:m_list.append('{}-{}'.format(start_day.year + mon // 12, mon % 12 + 1))return m_list# 舍友指导下的一行代码生成词云 编译器自动格式化了 本质还是一行代码def wordCloud(self):WordCloud(font_path="C:/Windows/Fonts/simfang.ttf", background_color='white', scale=16).generate(" ".join([c for c in jieba.cut("".join(str((pd.read_csv('{}弹幕池数据集.csv'.format(self.video_name))['内容']).tolist()))) iflen(c) > 1])).to_file("{}词云.png".format(self.video_name))if __name__ == '__main__':# 输入指定的视频bv号bv_id = input('输入视频对应的bv号:')# new一个对象spider = BarrageSpider(bv_id)spider.parse_month()# 请求今年1月和去年12月的数据 并合并数据word_data = []months = spider.parse_month()# 循环遍历爬取for month in months:word = spider.parse_date_url(month)word_data.extend(word)# 数据格式化处理 并输出csv格式文件data = pd.DataFrame(word_data)data.drop_duplicates(subset=['rowID'], keep='first')# 字符集编码需要为utf-8-sig 不然会乱码data.to_csv('{}弹幕池数据集.csv'.format(spider.video_name), index=False, encoding='utf-8-sig')# # 生成词云spider.wordCloud()

运行结果




这里只有十八万行…是因为刚开始测试的时候忘记在月份前加0。代码里已经更正。
更正后 爬取了骚猪的视频:

视频上显示16万弹幕,实际则有67万,而且爬到19年后,获取的都为空数据,预测实际弹幕有100万左右。

可以通过多账号的方式爬取完整弹幕,这里就不做了。

python按日期爬取b站弹幕 2.0版相关推荐

  1. Python爬取B站弹幕方法介绍

    Python爬取B站弹幕方法介绍 文章目录 Python爬取B站弹幕方法介绍 前言 寻找弹幕数据 编写爬虫 B站弹幕数量 新技术介绍 参考文章 前言 最近同学要做东西,需要用 B 站的视频对应的弹幕数 ...

  2. python接收弹幕_闲着没事,尝试一下用Python爬取B站弹幕呀~

    原标题:闲着没事,尝试一下用Python爬取B站弹幕呀~ 前言 最近同学要做东西,需要用 B 站的视频对应的弹幕数据做分析,于是请我帮忙爬取 B 站视频的弹幕数据. 对于爬虫而言,我们需要找到对应数据 ...

  3. 萌新学习Python爬取B站弹幕+R语言分词demo说明

    代码地址如下: http://www.demodashi.com/demo/11578.html 一.写在前面 之前在简书首页看到了Python爬虫的介绍,于是就想着爬取B站弹幕并绘制词云,因此有了这 ...

  4. 用Python爬取B站弹幕并做成词云

    用Python爬取B站弹幕并做成词云 一.获取视频的cid号 1.进入想爬的视频,打开浏览器设置里的"开发者工具": 进入NetWork后等待requests刷出,数据够了后可随意 ...

  5. Java爬取B站弹幕 —— Python云图Wordcloud生成弹幕词云

    一 . Java爬取B站弹幕 弹幕的存储位置 如何通过B站视频AV号找到弹幕对应的xml文件号 首先爬取视频网页,将对应视频网页源码获得 就可以找到该视频的av号aid=8678034 还有弹幕序号, ...

  6. python爬取b站弹幕并进行数据可视化

    python爬取b站弹幕并进行数据可视化 1.第一步,爬取b站弹幕 我们随便打开一个b站视频 打开开发者模式,在network下搜索list,可以找到该视频的弹幕文件 打开之后是这个样子的 结构还是比 ...

  7. python爬取b站视频封面_学习笔记(4)[Python爬虫]:爬取B站搜索界面的所有视频的封面...

    学习笔记(4)[Python爬虫]:爬取B站搜索界面的所有视频的封面 import os import requests import re import json from bs4 import B ...

  8. 爬取B站弹幕制作词云图

    大家好,我是天空之城,今天给大家带来,爬取B站弹幕制作词云图. 以下内容部分来自公众号数据分析与统计学之美,号主是大牛,有需要的加他. 首先打开一个b站视频https://www.bilibili.c ...

  9. Python学习笔记-爬取B站电视剧《风犬少年的天空》弹幕并分析

    爬取B站电视剧<风犬少年的天空>弹幕并分析 写在前面 开始! 简单分析一下弹幕数据 蠢并痛苦着的学习过程... 干(烂)货环节-------弹幕的获取与整理 关于cid的获取 关于弹幕上限 ...

最新文章

  1. 与工作流关联的服务器发生意外错误
  2. 微软制作工具_大白菜U盘启动盘制作
  3. LeetCode-73. Set Matrix Zeroes
  4. 进程、后台进程以及信号
  5. 一文搞懂 PyTorch 内部机制
  6. 机器学习用于金融市场预测难在哪?
  7. Spark之SparkStreaming的DStream操作
  8. 通过二进制方式安装innobackupex
  9. JAVA 常见的类集之CollectionListQueue
  10. 爱pia戏推出PC客户端,为您自动置顶窗口,方便查找
  11. 计算机电源的瓦数是什么,电脑的电源功率大小有区别吗?对电脑有什么影响吗?...
  12. 计算机维修英语情景对话大全,实用英语短对话:修电脑
  13. 算法 动画算法 算法动画 动画原理——总体概览图
  14. TCP通信丢包原因总结
  15. 常规计算机 符号键是,有谁知道电脑键盘上的标示符号都代表什么意思
  16. html css 如何将图片作为背景,CSS背景图片和HTML中的img标签
  17. 16年,悲痛又收获的一年
  18. 附件 计算机 丢失,Win10系统开始菜单中没有附件解决方法
  19. 开源夏令营《基于HackRF开发GPS信号仿真模拟器》开题报告
  20. [ZJOI2001] 积木城堡

热门文章

  1. Qt开发技术:Qt富文本(一)富文本介绍、文档结构
  2. 关于计算机的知识作文,有关电脑的作文
  3. TI Zigbee Light Link 参考设计
  4. 想知道视频水印怎么去?推荐几个去视频水印的方法
  5. 智力题集锦与详解——持续更新
  6. 今日头条——校招在线编程题《头条校招》
  7. 如何通过二极管设计一个或门电路
  8. 【Reward is enough】Sutton、DavidSilver师徒联手:奖励机制足够实现各种目标。
  9. (最新,所有kali版本通用)kali中安装搜狗输入方法
  10. 【LeetCode】934. 最短的桥