B站评论爬取

news/2025/2/12 16:54:41/

B站评论爬取

本文仅用于记录自己的进步之用,欢迎大家批评指正
本次爬取的是哔哩哔哩上的动漫《异度侵入 ID:INVADED》的前10集评论
在此记录自己在爬取过程中的心得。

获取目标内容的URL链接:

首先打开目标网站,并查看网页源码,发现评论内容不在源码中,可以确认评论是动态生成的。于是进入开发者模式,查找返回的内容
在这里插入图片描述
发现评论是以json文件的形式返回的,于是将json文件的URL链接复制并在新的页面打开,却发现404not found。
在这里插入图片描述
在网上查阅资料之后发现问题出在参数上,这是原始的网页URL:
‘https://api.bilibili.com/x/v2/reply?callback=jQuery172043286393203562556_1583729327871&jsonp=jsonp&pn=1&type=1&oid=91190744&sort=2&_=1583729340425’
其中?之后的内容即参数,其中的第一项’callback’和最后一项参数下划线是以某种方式随机生成的记录用户行为的(我也不清楚具体原理),我们在爬取的时候需要将这两项参数去除就能正常访问json文件。

参数规律探索

在找到了正确的URL格式之后批量爬取还需要明白参数的含义和规律。
我发现其规律如下:参数‘pn’控制页码;参数‘sort’控制排序顺序:1代表按时间排序,2代表按热度排序;‘oid’代表视频作品的编号。
在明确其规律之后我手动采集了该动漫的前10集各自的oid编号(未发现B站的oid编号规律,若有人发现,欢迎交流),准备爬取每一集热度从高到低的前100页评论。

信息提取

在从指定URL获取了json文件之后我们需要提取我们感兴趣的部分信息。json文件与python的字典格式相似,是一种通用互联网信息存储格式,可以通过转换成python字典的方式来提取信息。

comments=[]
import requests
#url='https://api.bilibili.com/x/v2/reply?callback=jQuery172020074966520029802_1582591973427&jsonp=jsonp&pn=1&type=1&oid=91190744&sort=2&_=1582593966728'
header={"Cookie":"buvid3=05D72C76-38C1-4F69-AC93-B90C56C0907D110236infoc; LIVE_BUVID=AUTO2015623146874484; sid=53khd8hr; CURRENT_FNVAL=16; stardustvideo=1; rpdid=|(u)~J|uYYRJ0J'ulYJ|~Jul~; _uuid=2A50132F-BFC3-E691-823F-99041AAD3E4B52177infoc; im_notify_type_385625993=0; UM_distinctid=16e12522eb7797-0b291c8a138e46-5373e62-144000-16e12522eb855f; laboratory=1-1; DedeUserID=385625993; DedeUserID__ckMd5=8fb7192f0bcda3a1; SESSDATA=7b969aa2%2C1584488173%2Cf651ce21; bili_jct=65262388cd0ecce875f0530143e0ebb7; CURRENT_QUALITY=32; bp_t_offset_385625993=363207981016294510; INTVER=1","User-Agent":"Mozilla/5.0"}
#param={"jsonp":"jsonp","pn":"1","type":"1","oid":"91190744","sort":"2","_":"1582593966728"}
oidlist=[82232111,82232426,83157260,84138871,85126891,86339824,87731819,89463810,91190744,92990314]
#pagelist=[263,138,136,188,210,288,334,388,701,761]
#url='https://api.bilibili.com/x/v2/reply?jsonp=jsonp&pn={}&type=1&oid={}&sort=2'
#B站api接口,oid=视频id,sort=排序方法,pn=页码
for oid in oidlist:for p in range(100):url='https://api.bilibili.com/x/v2/reply?jsonp=jsonp&pn={}&type=1&oid={}&sort=2'.format(p+1,oid)try:html=requests.get(url,headers=header)data=html.json()if data['data']['replies']:for i in data['data']['replies']:comments.append(i['content']['message'])except:print(url+'爬取异常')

这样就成功将评论装到了comments这个列表中,再用excel表格储存方便日后文本挖掘使用。注意:在大量写入excel文件的时候,避免使用xlwt,xlwt最多能支持65536行数据,而使用xlsxwriter则无写入限制。

import xlsxwriter
workbook=xlsxwriter.Workbook("异度侵入评论.xlsx") 
worksheet = workbook.add_worksheet("first_sheet") 
worksheet.write_column('A2',comments)
workbook.close()

分词

#提取停用词
stop_word=[]
fd = open( "停用词表.txt", "r",encoding='utf-8' )
for line in fd.readlines():stop_word+=str(line).strip('\n').split(',')
fd.close()
#print(stop_word)
import jieba
import re
pattern=re.compile(r'[\u4e00-\u9fa5]')
jieba.load_userdict('自定义词库.txt')
def fenci2(list1):seg_list=''for i in range(len(list1)):words_list=jieba.cut(list1[i],cut_all=False)for i in words_list:if pattern.match(i) and i not in stop_word:seg_list+=iseg_list+=' 'return seg_list
corpus_list=fenci2(comments)

制作词云图

#使用PIL绘制词云图
import wordcloud #导入词云库
import numpy as np
import matplotlib.pyplot as plt
import PIL
import jieba
import re
#导入图片
image1 = PIL.Image.open(r'z.jpg')
MASK = np.array(image1)
WC = wordcloud.WordCloud(font_path = 'C:\\Windows\\Fonts\\STFANGSO.TTF',max_words=1000,mask = MASK,height= 800,width=800,background_color='white',repeat=False,mode='RGBA') #设置词云图对象属性
con = WC.generate(corpus_list)
plt.imshow(con)
plt.axis("off")
WC.to_file('词云图2.png')

做出来的效果图:在这里插入图片描述

SnowNLP情感分析

import pandas as pd
df=pd.read_excel('异度侵入评论.xlsx')
df['评论']=df['评论'].astype(str)
from snownlp import SnowNLP
def get_sentiment(text):return SnowNLP(text).sentiments
df['态度评分']=df['评论'].apply(get_sentiment)
import numpy as np
np.mean(df['态度评分'])
df.to_excel('异度侵入评论.xlsx')

此处因在网上未找到合适的二分类数据标注语料库故使用SnowNLP做情感分析的效果并不好。SnowNLP的默认语料库是商品购买评价,直接应用到此处不是很合适,若有同仁找到合适的语料库,希望能与我分享。

基于情感词典的情感分析

由于snownlp默认语料库的局限性,现在试图采用网上的开源情感词典做情感分析,本此使用了知网情感词典(HOWNET)以及大连理工大学的情感词典合并去重之后作为情感词典(在网上没有找到免费的台湾大学NTUSD简体中文情感词典故未采用),本次挖掘我试图按照网上大佬们的思路构建特定领域的情感词典与上述的基础词典合并作为最终词典,但由于才疏学浅,未能理解掌握这种方法。因此本次仅基于基础情感词库做情感态度分析。

import re
import jieba
#载入停用词表
stop_word=[]
fd = open( "停用词表.txt", "r",encoding='utf-8' )
for line in fd.readlines():stop_word+=str(line).strip('\n').split(',')
fd.close()
#print(stop_word)
# 结巴分词工具做分词操作(包括添加自定义词库和停用词)
jieba.load_userdict('异度侵入词库.txt')
def fenci(text):seg_list=list(jieba.cut(str(text)))pattern=re.compile(r'[\u4e00-\u9fa5]')word_list=[word for word in seg_list if word not in stop_word and pattern.match(word)]return word_list
df['分词']=df['评论'].apply(fenci)
#fenci('今天阳光明媚,我心情很好')import numpy as np
pos_word=[]
fd = open( "pos.txt", "r",encoding='utf-8' )
for line in fd.readlines():pos_word+=str(line).strip('\n').split(',')
fd.close()
neg_word=[]
fd = open( "neg.txt", "r",encoding='utf-8' )
for line in fd.readlines():neg_word+=str(line).strip('\n').split(',')
fd.close()
deny_word=['不','没','无','莫','非','别']
def evaluate(seg_list):count=np.zeros(len(seg_list))for i in range(len(seg_list)):if seg_list[i] in pos_word:count[i]=1if seg_list[i] in neg_word:count[i]=-1for i in range(len(seg_list)):if seg_list[i] in deny_word:if count[i+1]==0:count[i+1]*=-1else:count[i+1]*=-count[i]return sum(count)
df['score']=df['分词'].apply(evaluate)
df['Y_']=np.sign(df['score'])
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
a=['消极态度','中立态度','积极态度']
b=[]
for i in range(-1,2):b.append(df[df['Y_']==i].shape[0])
plt.figure('Bar Chart', facecolor='lightgray')
plt.title('态度分类统计', fontsize=16)
plt.xlabel('态度分类', fontsize=14)
plt.ylabel('评论数', fontsize=14)
plt.tick_params(labelsize=10)
plt.grid(linestyle=':', axis='y')
x1 = plt.bar(0,b[0], color='red', label=a[0], align='center')
x2 = plt.bar(1,b[1], color='dodgerblue', label=a[1], align='center')
x3 = plt.bar(2,b[2], color='lightgreen', label=a[2], align='center')
plt.xticks([])
plt.legend()
plt.show()

在这里插入图片描述
由于情感词库不完整的原因,中立态度的分类结果较多,后续改进的方向:
可以参考基于情感词库和PMI互信息的情感分类


http://www.ppmy.cn/news/409614.html

相关文章

B站UP主发起停更潮

我是卢松松,点点上面的头像,欢迎关注我哦! 近日用户发现很多B站自媒体表示,暂时停止更新,短期内不会再上传新的内容。停更原因方面,平台收益减少、收支难以平衡是停止更新的主要原因。 不过很快B站UP主回应…

关于B站(bilibili)对未登录用户视频观看进行暂停和弹窗的分析与简单解决方案

关于B站(bilibili)对未登录用户视频观看进行暂停和弹窗的分析与简单解决方案 情况介绍简要分析初步的解决方案总结(太长不看点这里) 情况介绍 于近日的某次更新后,B站(bilibili)网页端出现了一…

如何快速爬取B站全站视频信息

專 欄 ❈ 陈键冬,Python中文社区专栏作者,知乎专栏:尽瞎扯 GitHub: https://github.com/chenjiandongx ❈ B站我想大家都熟悉吧,其实 B 站的爬虫网上一搜一大堆。不过纸上得来终觉浅,绝知此事要躬行&…

10秒解决B站没有视频音效调节问题

有这个问题的话估计播放策略是默认的 改成AV1 或者AVG 刷新网页就好了 在设置改一下就好了 别选默认的和HEVG 选AV1 AVG即可 改完就可以了

爬取b站最火up主及其粉丝信息

爬取b站最火up主及其粉丝信息 编译环境:python3、Firefox Developer Edition 使用技术:bs4、json、selenium、pymysql 输出预览: 代码:链接: https://pan.baidu.com/s/1SSqMrMr_IVni-Tb6Yx40vQ 提取码: hnu6 使用前请修改数据库…

一场胆战心惊的B站面试,哔哩哔哩也太难进了

此次哔哩哔哩Java开发面试之旅可谓惊险,不过通过对大部分面试题套路的掌握,不出意外还是拿下了,下面我们来看看这些题是不是常见的不能再常见的了。这些面试题看了就能面上?当然不是,只是通过这些题让自己知道所欠缺的…

Miko二次元动漫视频网站源码 视频播放带仿哔哩哔哩视频字幕弹幕

非常大气漂亮的Miko动漫视频网站整站源码,二次元动漫网源码。Dz后台管理方便,整站数据都设置好了,传上即可制作一个完整的动漫网。 安装教程: 1.源码上传到空间 2.自己修改里面数据库信息(错一个网站就打不开&#xff…

B站,被扫黄了!B站变P站?

月活用户达1.97亿的B站,又惹麻烦了。 作为全国乃至全球最大的二次元社区,B站如今的市值已经超过300亿美元,而曾经把B站按在地上摩擦的爱奇艺还一直在130亿美元徘徊。 众所周知,最初的B站只是一个小众的追番网站,后来它…