文章目录
- 一、需求
- 二、网页分析
- 2.1 找到弹幕数据所在
- 三、爬虫代码
- 四、词云
一、需求
示例视频
https://www.bilibili.com/video/BV1v44y1j73d?spm_id_from=333.851.b_7265636f6d6d656e64.2

需求:爬取该视频2022年1月 所有 弹幕
二、网页分析
2.1 找到弹幕数据所在
因为有些数据不是直接显示在html上的,属于动态数据,需要异步加载得到。
步骤1:打开network,或者直接使用F12选到network。
步骤2:打开F12,然后点击右侧 “查看历史弹幕里”,任何一个日期。,然后点击切换月份。

2022-01-06日的弹幕信息

同理可得该月的弹幕月份信息,即这个月有哪些日期有弹幕
日期信息为json格式(2021-11月为空哈,该视频为2022-1月的,修改参数切换到2022-01即可)
三、爬虫代码
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: yudengwu(余登武)
# @Date : 2022/1/24
#@email:1344732766@qq.com
import requests
import re
import time
import numpy as np
import pandas as pd
#得到一页的响应
def get_oneresponse(url):
#请求头为1日弹幕数据侠 的请求信息
headers = {
'cookie': "你的cookie",
'origin': 'origin: https://www.bilibili.com',
'referer': 'https://www.bilibili.com/video/BV1v44y1j73d?spm_id_from=333.851.b_7265636f6d6d656e64.2',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36',
}
response = requests.get(url=url, headers=headers)
return response
#得到一个月的弹幕日期
def get_time(url):
response = get_oneresponse(url)
json_data = response.json() #日期为json格式
date = json_data['data']
print(date)
return date
#主函数
def main(url):
data = get_time(url)
#for dateindex in range(len(data)):
print(len(data))#21日
for dateindex in range(18,20,1):#取2日
date = data[dateindex]
print(date)
url = f'https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=477232539&date={date}' #1日弹幕网址
html_data = get_oneresponse(url).text
# 正则匹配 "."表示匹配除换行符外的所有字符,“*”匹配0个或多个,“?”匹配一个或者0个。
# [\u4E00-\u9FA5]匹配任何中文 “+”匹配一个或多个 。[] 表示可以匹配括号里的任何。
# 。。“.*?”贪婪匹配,能少匹配就少匹配,能不匹配就不匹配
result = re.findall(".*?([\u4E00-\u9FA5]+).*?", html_data)
result = pd.Series(result)
result.to_csv('弹幕.txt',mode='a', index=False) # mode=a 追加写入文件 (也可以用open 写入)
time.sleep(2) #休息2秒。如果网页请求太频繁,网站会设别到这是爬虫程序
if __name__ == '__main__':
one_url = 'https://api.bilibili.com/x/v2/dm/history/index?type=1&oid=477232539&month=2022-01' #该视频一个月的网址
main(one_url)

四、词云
import jieba
import wordcloud
# 读取文件内容
f = open('弹幕.txt', encoding='utf-8')
txt = f.read()
# jiabe 分词 分割词汇
#txt = jieba.lcut(txt) #分割行
#string = ' '.join(txt) #分词
# 词云图设置
wc = wordcloud.WordCloud(background_color='white',
font_path='simhei.ttf', #字体
max_words=400, max_font_size=40, # max_words=400 词的个数
random_state=42
)
# 给词云输入文字
wc.generate(txt) #不分词,如果分词传入的是string
# 词云图保存图片地址
wc.to_file('out.png')

作者:电气-余登武