利用Python分析《庆余年》人物图谱和微博传播路径

庆余年电视剧终于在前两天上了,这两天赶紧爬取微博数据看一下它的表现。

庆余年

《庆余年》是作家猫腻的小说。这部从2007年就开更的作品拥有固定的书迷群体,也在文学IP价值榜上有名。

期待已久的影视版的《庆余年》终于播出了,一直很担心它会走一遍《盗墓笔记》的老路。

在《庆余年》电视剧上线后,就第一时间去看了,真香。

庆余年微博传播分析

《庆余年》在微博上一直霸占热搜榜,去微博看一下大家都在讨论啥:

一条条看显然不符合数据分析师身份。

于是爬取了微博超话页面,然后找到相关人员,分别去爬取相关人员的微博评论,看看大家都在讨论啥。

import re
import time
import copy
import pickle
import requests
import argparse'''微博爬虫类'''
class weibo():def __init__(self, **kwargs):self.login_headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36','Accept': '*/*','Accept-Encoding': 'gzip, deflate, br','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8','Connection': 'keep-alive','Origin': 'https://passport.weibo.cn','Referer': 'https://passport.weibo.cn/signin/login?entry=mweibo&r=https%3A%2F%2Fweibo.cn%2F&backTitle=%CE%A2%B2%A9&vt='}self.login_url = 'https://passport.weibo.cn/sso/login'self.home_url = 'https://weibo.com/'self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36',}self.session = requests.Session()self.time_interval = 1.5'''获取评论数据'''def getComments(self, url, url_type='pc', max_page='all', savename=None, is_print=True, **kwargs):# 判断max_page参数是否正确if not isinstance(max_page, int):if max_page != 'all':raise ValueError('[max_page] error, weibo.getComments -> [max_page] should be <number(int) larger than 0> or <all>')else:if max_page < 1:raise ValueError('[max_page] error, weibo.getComments -> [max_page] should be <number(int) larger than 0> or <all>')# 判断链接类型if url_type == 'phone':mid = url.split('/')[-1]elif url_type == 'pc':mid = self.__getMid(url)else:raise ValueError('[url_type] error, weibo.getComments -> [url_type] should be <pc> or <phone>')# 数据爬取headers = copy.deepcopy(self.headers)headers['Accept'] = 'application/json, text/plain, */*'headers['MWeibo-Pwa'] = '1'headers['Referer'] = 'https://m.weibo.cn/detail/%s' % midheaders['X-Requested-With'] = 'XMLHttpRequest'url = 'https://m.weibo.cn/comments/hotflow?id={}&mid={}&max_id_type=0'.format(mid, mid)num_page = 0comments_data = {}while True:num_page += 1print('[INFO]: Start to get the comment data of page%d...' % num_page)if num_page > 1:url = 'https://m.weibo.cn/comments/hotflow?id={}&mid={}&max_id={}&max_id_type={}'.format(mid, mid, max_id, max_id_type)res = self.session.get(url, headers=headers)comments_data[num_page] = res.json()if is_print:print(res.json())try:max_id = res.json()['data']['max_id']max_id_type = res.json()['data']['max_id_type']except:breakif isinstance(max_page, int):if num_page < max_page:time.sleep(self.time_interval)else:breakelse:if int(float(max_id)) != 0:time.sleep(self.time_interval)else:breakif savename is None:savename = 'comments_%s.pkl' % str(int(time.time()))with open(savename, 'wb') as f:pickle.dump(comments_data, f)return True'''模拟登陆'''def login(self, username, password):data = {'username': username,'password': password,'savestate': '1','r': 'https://weibo.cn/','ec': '0','pagerefer': 'https://weibo.cn/pub/','entry': 'mweibo','wentry': '','loginfrom': '','client_id': '','code': '','qq': '','mainpageflag': '1','hff': '','hfp': ''}res = self.session.post(self.login_url, headers=self.login_headers, data=data)if res.json()['retcode'] == 20000000:self.session.headers.update(self.login_headers)print('[INFO]: Account -> %s, login successfully...' % username)return Trueelse:raise RuntimeError('[INFO]: Account -> %s, fail to login, username or password error...' % username)'''获取PC端某条微博的mid'''def __getMid(self, pc_url):headers = copy.deepcopy(self.headers)headers['Cookie'] = 'SUB=_2AkMrLtDRf8NxqwJRmfgQzWzkZI11ygzEieKdciEKJRMxHRl-yj83qhAHtRB6AK7-PqkF1Dj9vq59_dD6uw4ZKE_AJB3c;'res = requests.get(pc_url, headers=headers)mid = re.findall(r'mblog&act=(\d+)\\', res.text)[0]return midif __name__ == '__main__':import argparseparser = argparse.ArgumentParser(description="weibo comments spider")parser.add_argument('-u', dest='username', help='weibo username', default='')parser.add_argument('-p', dest='password', help='weibo password', default='')parser.add_argument('-m', dest='max_page', help='max number of comment pages to crawl(number<int> larger than 0 or all)', default=100)parser.add_argument('-l', dest='link', help='weibo comment link', default='')parser.add_argument('-t', dest='url_type', help='weibo comment link type(pc or phone)', default='pc')args = parser.parse_args()wb = weibo()username = args.usernamepassword = args.passwordtry:max_page = int(float(args.max_page))except:pass**加粗样式**url = args.linkurl_type = args.url_typeif not username or not password or not max_page or not url or not url_type:raise ValueError('argument error')wb.login(username, password)wb.getComments(url, url_type, max_page)

爬取到微博评论后,老规矩,词云展示一下,不同主角的评论内容差别还是挺大的

微博评论词云分析

不同主演的评论风格差异较大,也与微博内容息息相关。
张若昀:

李沁:

肖战:
emmm…算了吧

从目前大家的评论来看,情绪比较正向,评价较高,相信《庆余年》会越来越火的。

这部剧在微博热度这么高,都是谁在传播呢?

于是我进一步点击用户头像获取转发用户的公开信息。

看了一下几位主演的相关微博,都是几十万的评论和转发,尤其是肖战有百万级的转发,尝试爬了一下肖战的微博,执行了6个小时只爬了十分之一。

最终还是败给了各位小飞侠,之后有结果再同步给大家。

于是我只能挑软柿子捏,换成官微的微博。

这条微博发布时间是26号,经过一段时间已经有比较好的传播,其中有几个关键节点进一步引爆话题。

经过几个关键节点后,进一步获得传播,这几个关键节点分别是:

肖战的超话:https://weibo.com/1081273845/Ii1ztr1BH
王小亚的微博:https://weibo.com/6475144268/Ii1rDEN6q

继续看一下转发该微博的用户分析:

进一步了解转发微博的受众,掌握传播范围和深度。

整体看下来,庆余年官微的这条微博90%都是普通用户的转发,这部剧转发层级达到5层,传播范围广,在微博上的讨论女性居多(占比89%),大部分集中在一二线城市。

原著人物关系图谱

如果只看微博,不分析原著,那就不是一个合格的书粉。

于是我去下载了原著画一下人物关系图谱。

先给大家看一下原著的人物关系图谱:

emmm…确实挺丑的,大家可以去Gephi上调整。

首先我需要从原著里洗出人物名,尝试用jieba分词库来清洗:

import jiebatest= 'temp.txt' #设置要分析的文本路径
text = open(test, 'r', 'utf-8')
seg_list = jieba.cut(text, cut_all=True, HMM=False)
print("Full Mode: " + "/ ".join(seg_list))  # 全模式

生成一个适合你的列表

发现并不能很好的切分出所有人名,最简单的方法是直接准备好人物名称和他们的别名,这样就能准确定位到人物关系。

存储好人物表,以及他们对应的别名(建立成字典)

def synonymous_names(synonymous_dict_path):with codecs.open(synonymous_dict_path, 'r', 'utf-8') as f:lines = f.read().split('\n')for l in lines:synonymous_dict[l.split(' ')[0]] = l.split(' ')[1]return synonymous_dict

接下来,清理文本数据:

def clean_text(text):new_text = []text_comment = []with open(text, encoding='gb18030') as f:para = f.read().split('\r\n')para = para[0].split('\u3000')for i in range(len(para)):if para[i] != '':new_text.append(para[i])for i in range(len(new_text)):new_text[i] = new_text[i].replace('\n', '')new_text[i] = new_text[i].replace(' ', '')text_comment.append(new_text[i])return text_comment

我们需要进一步统计人物出现次数,以及不同人物间的共现次数:

text_node = []
for name, times in person_counter.items():text_node.append([])text_node[-1].append(name)text_node[-1].append(name)text_node[-1].append(str(times))
node_data = DataFrame(text_node, columns=['Id', 'Label', 'Weight'])
node_data.to_csv('node.csv', encoding='gbk')

结果样例如下:

不愧是主角,范闲出现的次数超过了其他人物出现次数的总和,基本每个人都与主角直接或间接地产生影响。

同理可以得到不同人物的边,具体代码参考源文件。

接下来需要做的就是利用Gephi绘制人物关系图谱:

运行结果:

参考文献:Ren, Donghao, Xin Zhang, Zhenhuang Wang, Jing Li, and Xiaoru Yuan. “WeiboEvents: A Crowd Sourcing Weibo Visual Analytic System.” In Pacific Visualization Symposium (PacificVis) Notes, 2014 IEEE, pp. 330-334. IEEE, 2014.

有任何问题,欢迎私信。

利用Python分析《庆余年》人物图谱和微博传播路径相关推荐

  1. python爬微博超话图片_Python爬虫:《庆余年》人物图谱和微博传播路径

    利用Python分析<庆余年>人物图谱和微博传播路径 庆余年电视剧终于在前两天上了,这两天赶紧爬取微博数据看一下它的表现. 庆余年 <庆余年>是作家猫腻的小说.这部从2007年 ...

  2. 利用Python分析航空公司客户价值

      利用Python分析航空公司客户价值 一.背景介绍 随着社会生活中数据量的急剧增多,如何从这些海量的数据中提取与发掘出对我们决策有用的信息成为当前亟待解决的题,因此,数据分析与挖掘技术在这些年得到 ...

  3. 利用Python分析文章词频,并生成词云图

    利用Python分析文章词频,并生成词云图 使用request模块获取文章数据 import jieba import requests import csv from bs4 import Beau ...

  4. 数据分析作业(一)利用Python分析学生成绩

    利用Python分析学生成绩 一.题目描述 二.解题步骤 运行环境 题目分析 三.完整代码 四.运行结果 五.参考文献 附录 附录A 更新记录 附录B 相关练习题目 练习一:读取Excel文件数据表分 ...

  5. python单词软件哪个好_利用Python分析背单词软件的惊人真相

    摘要:利用python分析背单词软件,揭秘你不知道的惊人真相 0×00 前言 你想知道背单词软件有大概多少人注册第一天都没有背完嘛 你想知道背单词软件这么火,这么多人在使用,真的有多少人真的在背诵嘛 ...

  6. python人物关系抽取小说_用python分析小说人物关系(一)——理论篇

    1.工具介绍 jieba jieba分词,最好用的开源中文分词工具.他最主要的两个功能是分词和关键词的抽取.在这里,我们需要用他的分词功能来提取文本中的人名. gephi gephi是一个开源的复杂网 ...

  7. 利用python分析电商_Python实现爬取并分析电商评论

    现如今各种APP.微信订阅号.微博.购物网站等网站都允许用户发表一些个人看法.意见.态度.评价.立场等信息.针对这些数据,我们可以利用情感分析技术对其进行分析,总结出大量的有价值信息.例如对商品评论的 ...

  8. ppt python 图表_利用python分析weibo数据做成图表放入PPT中

    起因 很久以前,就有个想法,就是自动分析微博的数据,但是之前一直想的是网页版展示,flask想学了好久都没学,偶然的一次看到了一篇关于python处理pptx的文章,再加上同窗三年的室友在毕业后竟然主 ...

  9. python录入数据至ppt_利用python分析weibo数据做成图表放入PPT中

    起因 很久以前,就有个想法,就是自动分析微博的数据,但是之前一直想的是网页版展示,flask想学了好久都没学,偶然的一次看到了一篇关于python处理pptx的文章,再加上同窗三年的室友在毕业后竟然主 ...

最新文章

  1. 力所能及的做些自己喜欢和有趣的事
  2. 【迁移学习(Transfer L)全面指南】Pytorch处理体积数据
  3. 如何用python画圆形的代码-python – 如何快速绘制数千个圆圈?
  4. android 全局 socket,学习Android socket通信之如何解决中文乱码
  5. 使用 Ajax 实现本地化后的客户端消息验证
  6. LeetCode 533. 孤独像素 II
  7. Docker容器虚拟化技术---Docker运维管理(Docker Compose)4
  8. NYNU_省赛选拔题(10)
  9. Matlab输出换行
  10. 关于DBSCAN聚类算法
  11. 郑捷《机器学习算法原理与编程实践》学习笔记(第四章 推荐系统原理)(一)推荐系统概述...
  12. No module named ‘skimage‘的问题及解决
  13. 【综合复习_网络部分】
  14. PTA团队练习题C语言
  15. python抢购茅台抢购描述
  16. Java学习笔记(一):Java简介
  17. 使用unity3D实现全景图像查看器
  18. javaScripty笔记
  19. 关于Dbvisualizer在win10环境下,出现编辑器乱码问题情况
  20. 2021-04-22手机APP24小时自动刷屏向上翻页自动刷视频,各种短视频、抖音、快手、今日头条等

热门文章

  1. android 绘图之Path与Paint详解
  2. “工作12年,还是输给小年轻”:IT人的中年职场保卫战,该如何打赢?
  3. 冯巩的155句经典语,太有才了,这才是真正的幽默!
  4. p系统ndows10的功能更新1903,Win10 2019年四月版(Win10 1903)更新功能介绍和下载
  5. js颜色 RGB 和 16进制转换
  6. 不会聊天怎么办?先做好这10件小事
  7. 2018.5.11作业
  8. 解决HTTP 414“请求URI太长”的思路
  9. PHP报错:414 Request-URI Too Large
  10. 微信小程序在 wxml 文件中使用 Array.includes 方法