【Python爬虫】B站《风灵玉秀》动画短评数据分析

Python数据分析结业作业,还有很多待优化的细节,request还是不太适合大型爬虫,回头慢慢修……

短评爬取

import requests
import json
from fake_useragent import UserAgent
import time
import datetime
import pandas as pd

#模拟浏览器
headers = {'User-Agent':UserAgent(verify_ssl=False).random}
comment_api = 'https://api.bilibili.com/pgc/review/short/list?media_id=6038&ps=20&sort=0' 

#发送get请求
response = requests.get(url = comment_api, headers=headers)
data_json = response.text
data = json.loads(data_json)

#取1000条短评,全量容易被封……
#alldata_num=data['data']['total']
alldata_num=1001

#定义数据格式
cols=['author','content','ctime','disliked','likes','score','progress']
df = pd.DataFrame(index = range(alldata_num),columns=cols)

#获取short comment
j = 0
while j < alldata_num :
    data_list = data['data']['list']
    for i in range(len(data_list)):
        df.loc[j,'author']=data_list[i]['author']['uname']
        df.loc[j,'content']=data_list[i]['content']
        df.loc[j,'ctime']=data_list[i]['ctime']        
        df.loc[j,'disliked']=data_list[i]['stat']['disliked']
        df.loc[j,'likes']=data_list[i]['stat']['likes']
        df.loc[j,'score']=data_list[i]['score']
        try:
            df.loc[j,'progress']=data_list[i]['progress']#提取进度易报错
        except:
            pass
        j += 1
        
        #提取cursor参数,进入下一个循环
        next_cursor = data['data']['next']       
        url = comment_api + '&cursor=' + str(next_cursor)
        response = requests.get(url=url, headers=headers)
        data_json = response.text
        data = json.loads(data_json)
        #防止被反爬虫机制阻断QAQ
        if j % 100 ==0 :
            print('————Have finished {}%————'.format(round(j/alldata_num*100,1)))
#            print(next_cursor)
        time.sleep(0.6)
                
    #存入文件,后续无需再爬
    df.to_csv('shortcomments.csv',index=False)

    for i in range(len(data_list)):
        next_cursor = data['data']['next']       
    url = comment_api + '&cursor=' + str(next_cursor)
    response = requests.get(url=url, headers=headers)
    data_json = response.text
    data = json.loads(data_json)                    

相关性数据分析

#读取数据
df = pd.read_csv('shortcomments.csv')

#去除空值
data_all = df.fillna(0)

#转换时间格式
def getDate(x):
    x = time.gmtime(x)
    return(pd.Timestamp(datetime.datetime(x[0],x[1],x[2])))
data_all['date'] = data_all.ctime.apply(lambda x: getDate(x))

#评论日期分布堆积图
from collections import Counter
import matplotlib.pyplot as plt
cdays = Counter(data_all['date'])
comm_days = pd.DataFrame(cdays.items(),columns = ['date','comment_num'])
comment_days = comm_days.sort_values(by='date')
comment_days.plot.area(x='date',y='comment_num',cmap='tab10_r')
评论日期分布
#计算评论距今天数
def Days(x):
    x = time.gmtime(x)
    return((datetime.datetime.now() - datetime.datetime(x[0],x[1],x[2],x[3],x[4],x[5])).days)
    
data_all['days'] = data_all.ctime.apply(lambda x: Days(x))
#短评长度
data_all['comm_len'] = data_all.content.apply(lambda x: len(x))

#数据相关性分析

#评分与评论距今天数散点图
plt.scatter(data_all['score'],data_all['days'], color='blue')

评分&评论距今时间关系
#多元拟合,评论获赞数与评论字数、评分、评论时间的关系

import numpy as np
import statsmodels.api as sm

X = pd.DataFrame(data_all.loc[:,['comm_len','score','days']], columns = ['comm_len','score','days']) 
y = pd.DataFrame(data_all['likes'], columns = ['likes'])

X_add1 = sm.add_constant(X)
model = sm.OLS(y, X_add1).fit()
print (model.summary())
相关性拟合
#仅距今日期显著性较高,删除评分和短评长度,重新训练
X.drop('score', axis = 1, inplace = True)
X.drop('comm_len', axis = 1, inplace = True)

X_add1 = sm.add_constant(X)
model = sm.OLS(y, X_add1).fit()
print(model.summary())

print(model.params) #输出回归系数
#模型拟合显著性不高,且R方较小,可以推送日期与点赞数相关,但数据解释力度小。

#假设测试数据为距今6天
X_test = np.array([1,6]) 

#利用模型的 predict 获得 预测 结果
print(model.predict(X_test))
#点赞数为负,显然不对,后期可以考虑挖掘更多数据进行模拟。比如发表用户的粉丝数等

重新拟合

绘制评论中高频词词云

#绘制短评内容的热点词云
import jieba
import jieba.posseg as pseg
from wordcloud import WordCloud
from PIL import Image        

#分词&过滤停用词
#停用词来自百度停用词库
stop_words = set(line.strip() for line in open('stopwords_baidu.txt'))

outstr = ''
for i in range(len(data_all)):
    jieba.suggest_freq(('风灵玉秀'), True)
    jieba.suggest_freq(('铃儿'), True)
    jieba.suggest_freq(('钰袖'), True)
    x = jieba.cut(data_all['content'][i])
    for word in x:
        if word not in stop_words:
             if word != '\t':
                 xx=' '.join(word)
                 outstr += xx

#统计词频、排序
content = dict(Counter(outstr))
content1 = sorted(content.items(),key=lambda content:content[1],reverse=True)
content2 = {}
for i in range(len(content1)):
    content2[content1[i][0]] = content1[i][1]

#画出词云  
mask_image = np.array(Image.open('heart.png'))
Wc = WordCloud(font_path='simhei.ttf', background_color='white', mask=mask_image, colormap='Oranges',width=900,height=600, max_words=50)
wordcloud = Wc.generate_from_frequencies(content2)

plt.imshow(wordcloud)
plt.axis("off")
plt.show()

词云

看起来都是好评~百合、有爱和能打的主题也完美体现了233
完结撒花✿✿ヽ(°▽°)ノ✿

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容