用 Python 来了解一下《安家》

如果要选一部近期最火的电视剧,一定非《安家》莫属,你可能没有具体看过,但如果你看微博的话一定听过这个名字,这部电视剧多次登上微博热搜榜,好像还有几次冲上了热搜榜首,该剧主要讲述的是关于房产中介卖房的故事,电视剧原名也是叫卖房子的人。

使用 Python 分析这部电视剧,主要包括两个步骤:获取数据和分析数据,数据来源我们选取《安家》的豆瓣评论区数据。

获取数据

豆瓣中《安家》的地址是:https://movie.douban.com/subject/30482003/,我们打开看一下,如下图所示:

从图中我们可以直观的看出截止目前有 9 万多人进行了打分,从评分上来看,打三星和四星的人数居多,总体评分 6.2 属于及格分,算是中规中矩吧。

我们把页面向下拉到评论区位置,如下图所示:

我们可以看到目前有 3 万多条评论数据,豆瓣对查看评论数据的限制是:未登录时最多可以查看 200 条,登录用户最多可以查看 500 条,也就是说我们最多可以抓取 500 条评论相关的信息,我们要抓取的数据项包括:用户昵称、星级、评论时间、评论内容,将这些信息抓取后我们再将其存到 csv 文件,代码实现如下:

import requests, time, random, pandas as pdfrom lxml import etree
def spider(): url = 'https://accounts.douban.com/j/mobile/login/basic' headers = {"User-Agent": 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)'} # 安家评论网址,为了动态翻页,start 后加了格式化数字,短评页面有 20 条数据,每页增加 20 条 url_comment = 'https://movie.douban.com/subject/30482003/comments?start=%d&limit=20&sort=new_score&status=P' data = { 'ck': '', 'name': '自己的用户', 'password': '自己的密码', 'remember': 'false', 'ticket': '' } session = requests.session() session.post(url=url, headers=headers, data=data) # 初始化 4 个 list 分别存用户名、评星、时间、评论文字 users = [] stars = [] times = [] content = [] # 抓取 500 条,每页 20 条,这也是豆瓣给的上限 for i in range(0, 500, 20): # 获取 HTML data = session.get(url_comment % i, headers=headers) # 状态码 200 表是成功 print('第', i, '页', '状态码:',data.status_code) # 暂停 0-1 秒时间,防止 IP 被封 time.sleep(random.random()) # 解析 HTML selector = etree.HTML(data.text) # 用 xpath 获取单页所有评论 comments = selector.xpath('//div[@class="comment"]') # 遍历所有评论,获取详细信息 for comment in comments: # 获取用户名 user = comment.xpath('.//h3/span[2]/a/text()')[0] # 获取评星 star = comment.xpath('.//h3/span[2]/span[2]/@class')[0][7:8] # 获取时间 date_time = comment.xpath('.//h3/span[2]/span[3]/@title') # 有的时间为空,需要判断下 if len(date_time) != 0: date_time = date_time[0] else: date_time = None # 获取评论文字 comment_text = comment.xpath('.//p/span/text()')[0].strip() # 添加所有信息到列表 users.append(user) stars.append(star) times.append(date_time) content.append(comment_text) # 用字典包装 comment_dic = {'user': users, 'star': stars, 'time': times, 'comments': content} # 转换成 DataFrame 格式 comment_df = pd.DataFrame(comment_dic) # 保存数据 comment_df.to_csv('data.csv') # 将评论单独再保存下来 comment_df['comments'].to_csv('comment.csv', index=False)

分析数据

现在数据取到了,我们使用 Python 来对这些数据进行分析一下。

评论数量

首先,我们来统计一下这 500 条数据每天的评论数量,然后利用折线图进行数据展示,代码实现如下:

import pandas as pd, matplotlib.pyplot as plt
csv_data = pd.read_csv('data.csv')df = pd.DataFrame(csv_data)df_gp = df.groupby(['time']).size()values = df_gp.values.tolist()index = df_gp.index.tolist()# 设置画布大小plt.figure(figsize=(10, 6))# 数据plt.plot(index, values, label='评论数')# 设置数字标签for a, b in zip(index, values): plt.text(a, b, b, ha='center', va='bottom', fontsize=13, color='black')plt.title('评论数随时间变化折线图')plt.xticks(rotation=330)plt.tick_params(labelsize=10)plt.ylim(0, 200)plt.legend(loc='upper right')plt.show()

看一下效果图:

从图中我们可以看出 2 月 21、22 这两天评论数最多,其中 2 月 21 号为开播日,评论数较多很正常, 2 月 22 号评论数多于开播日,我们大致可以推测是开播后网络等渠道进一步扩散的因素,之后随着时间的推移热度有所下降,评论数量呈下降至相对平稳的趋势。

角色分析

我们接着统计评论区中几个主要角色被提及的次数,然后再利用柱状图进行数据展示,代码实现如下所示:

import pandas as pd, jieba, matplotlib.pyplot as plt
csv_data = pd.read_csv('data.csv')roles = {'姑姑':0, '房似锦':0, '王子':0, '闪闪':0, '老油条':0, '楼山关':0, '鱼化龙':0}names = list(roles.keys())for name in names: jieba.add_word(name)for row in csv_data['comments']: row = str(row) for name in names: count = row.count(name) roles[name] += countplt.figure(figsize=(8, 5))# 数据plt.bar(list(roles.keys()), list(roles.values()), width=0.5, label='提及次数', color=['g', 'r', 'dodgerblue', 'c', 'm', 'y', 'aquamarine'])# 设置数字标签for a, b in zip(list(roles.keys()), list(roles.values())): plt.text(a, b, b, ha='center', va='bottom', fontsize=13, color='black')plt.title('角色被提及次数柱状图')plt.xticks(rotation=270)plt.tick_params(labelsize=10)plt.ylim(0, 30)plt.legend(loc='upper right')plt.show()

看一下效果图:

我们从角色被提及的次数可以大致推测出角色的受欢迎程度。

星级变化

我们接着根据获取数据来看一下这几天星级变化的大致趋势,一天中如果有多条星评我们取其平均值即可,代码实现如下所示:

import pandas as pd, numpy as np, matplotlib.pyplot as plt
csv_data = pd.read_csv('data.csv')df_time = csv_data.groupby(['time']).size()df_star = csv_data.groupby(['star']).size()index = df_time.index.tolist()value = [0] * len(index)# 生成字典dic = dict(zip(index, value))for k, v in dic.items(): stars = csv_data.loc[csv_data['time'] == str(k), 'star'] # 平均值 avg = np.mean(list(map(int, stars.values.tolist()))) dic[k] = round(avg ,2)# 设置画布大小plt.figure(figsize=(9, 6))# 数据plt.plot(list(dic.keys()), list(dic.values()), label='星级')plt.title('星级随时间变化折线图')plt.xticks(rotation=330)plt.tick_params(labelsize=10)plt.ylim(0, 5)plt.legend(loc='upper right')plt.show()

看一下效果图:

从现有数据来看,《安家》的星级整体维持在 2 星左右,我们可以发现尽管该剧比较热,但观众对该剧的满意并不是很高。

词云展示

最后,我们对所有评论进行词云效果展示,这样可以让我们更加直观的看出评论区哪些词汇出现的频率较高,实现代码如下所示:

from wordcloud import WordCloudimport numpy as np, jiebafrom PIL import Image
def jieba_(): # 打开评论数据文件 content = open('comment.csv', 'rb').read() # jieba 分词 word_list = jieba.cut(content) words = [] # 过滤掉的词 remove_words = ['以及', '不会', '一些', '那个', '只有', '不过', '东西', '这个', '所有', '这么', '但是', '全片', '一点', '一部', '一个', '什么', '虽然', '一切', '样子', '一样', '只能', '不是', '一种', '这个', '为了'] for word in word_list: if word not in remove_words: words.append(word) global word_cloud # 用逗号隔开词语 word_cloud = ','.join(words)
def cloud(): # 打开词云背景图 cloud_mask = np.array(Image.open('bg.jpg')) # 定义词云的一些属性 wc = WordCloud( # 背景图分割颜色为白色 background_color='white', # 背景图样 mask=cloud_mask, # 显示最大词数 max_words=100, # 显示中文 font_path='./fonts/simhei.ttf', # 最大尺寸 max_font_size=80 ) global word_cloud # 词云函数 x = wc.generate(word_cloud) # 生成词云图片 image = x.to_image() # 展示词云图片 image.show() # 保存词云图片 wc.to_file('anjia.png')
jieba_()cloud()

看一下效果图:

总结

本文通过爬取豆瓣中《安家》的评论区数据并对其进行可视化,我们可以大致了解观众对《安家》这部电视大致的评价情况,当然因为我们所获取的样本数量有限,可能或多或少还会与用户实际的评价情况有一点偏差。

代码获取方式】

(0)

相关推荐

  • 爱了!Python 动态图表太太太秀了

    本文转自:法纳斯特,作者:小F 关于动态条形图,小F以前推荐过「Bar Chart Race」这个库.三行代码就能实现动态条形图的绘制. 有些同学在使用的时候,会出现一些错误.一个是加载文件报错,另一 ...

  • 利用Python绘制关系网络图

    我们在做数据可视化时,要展现多个元素之间的相互关系时(比如人物关系图),常会用到网络图. 今天我们就分享一个在 Python 里绘制网络图的库:NetworkX,并显示它的基本操作. 一.Networ ...

  • 一行pandas代码生成哑变量

    一. 数据 import pandas as pd df = pd.read_csv('data.csv', usecols=['Name', 'Info']) df.head() 二.任务 现在我想 ...

  • 做动态图表,没有数据?用Python就能获取!

    既然有了Python这个制作动态条形图工具,缺的那便是数据了. 先看一下B站2019年「数据可视化」版块的情况,第一个视频超2百万的播放量,4万+的弹幕. 小F自己在B站上制作的几个视频,也是几十万的 ...

  • reticulate包 | 在Rmarkdown中调用Python代码

    Python和R是一对数据科学两大语言,在互联互通的路上,我感觉R更加的积极.还记得之前 Python中调用R的库-rpy2, 在Python使用R语言语法还是有些不自然.在R中调用Python体验十 ...

  • 内蒙古大型煤电基地生态修复与整治成效好,天鹅都来安家了

    锡林浩特讯    雪化冰消,万物复苏.冰封的内蒙古大地迎来春日的暖阳,草原也恢复了生机.日前,水电九局承建的生态修复工程--内蒙古东部草原区锡林浩特西湖景观的湖面上迎来了两位"贵客" ...

  • Python|二叉树叶子结点问题解决方法

    问题描述键盘输入一颗二叉树,求解其叶子结点个数.示例: 输入:4,2,6,1,3,5输出:3解决方案一棵树当中没有子结点(即度为0)的结点称为叶子结点,简称"叶子".当二叉树为空时 ...

  • Python数据分析库有哪些?常见分类!

    众所周知,Python前景好.需求量大.薪资高.就业岗位多,除了基本的开发工作之外,还可以从事人工智能.数据分析.网络爬虫等岗位.那么说起数据分析,你知道Python常用数据分析库有哪些吗?我们一起来 ...

  • PyPy为什么能让Python比C还快?一文了解内在机制

    来自|机器之心 「如果想让代码运行得更快,您应该使用 PyPy.」 - Python 之父 Guido van Rossum 对于研究人员来说,迅速把想法代码化并查看其是否行得通至关重要.Python ...

  • 【Python爬虫】:使用高性能异步多进程爬虫获取豆瓣电影Top250

    在本篇博文当中,将会教会大家如何使用高性能爬虫,快速爬取并解析页面当中的信息.一般情况下,如果我们请求网页的次数太多,每次都要发出一次请求,进行串行执行的话,那么请求将会占用我们大量的时间,这样得不偿 ...

  • 【Python爬虫】:破解网站字体加密和反反爬虫

    前言:字体反爬,也是一种常见的反爬技术,例如58同城,猫眼电影票房,汽车之家,天眼查,实习僧等网站.这些网站采用了自定义的字体文件,在浏览器上正常显示,但是爬虫抓取下来的数据要么就是乱码,要么就是变成 ...

  • 《安家》“霸占上海老洋房”现实故事:你永远喂不饱一只白眼狼

    作者:洞见·涵露微微 恩不可过,过施则不继,不继则怨生. ♬ 点上方绿标可收听洞见主播林静朗读音频 01 热播剧<安家>以房产中介的视角,呈现了温暖感动,但最多的,却是市井人心的自私. 龚 ...

  • Python 内置函数最全汇总,现看现用

    今天,好好看看这些Python内置函数,也许你明天就能用到Python 内置函数最全汇总:1 abs()绝对值或复数的模In [1]: abs(-6)Out[1]: 62 all() 接受一个迭代器, ...

  • Python学习教程:Python 内置函数最全汇总(上篇)

    Python学习教程:Python 内置函数最全汇总(一) 1 abs() 绝对值或复数的模 In [1]: abs(-6)Out[1]: 6 2 all() 接受一个迭代器,如果迭代器的所有元素都为 ...