Python数据获取及分析 获取电影评论星级时间

豆瓣

本任务使用 Python 来获取豆瓣网中某电影下所有的评论,进行分析,从观

众的角度来了解这部电视剧。

数据获取

使用如下脚本获取时间,星级,评论
正则表达式可在此处测试正则表达式可视化工具和正则表达式调试工具

import requests
import re
from openpyxl import Workbookdef getdata():header = { # F12查看"User-Agent": "","cookie": ""}original_url = 'https://movie.douban.com/subject/30228394/comments?start='original_url2 = '&limit=20&status=P&sort=new_score'for page in range(24):url = original_url + str(page * 20) + original_url2print("正在进行第{}页评论获取网址{}".format(page,url))r = requests.get(url, headers=header)data = r.text# 评论comments = re.findall("<span class=\"short\">([\w\W]*?)</span>", data)# 时间times = re.findall("<span class=\"comment-time \" title=\".*?\">([\w\W]*?)</span>", data)# 星级stars = re.findall("<span class=\"allstar[\d]* rating\" title=\"(.*?)\"></span>", data)for i in range(19):comment = comments[i].replace("\n", "")time = times[i].replace("\n", "")time = time.replace(" ", "")star = stars[i]# 生成第i行数据ws.append([time, star, comment])commentst = ""commentst += commentif __name__ == '__main__':# 实例化wb = Workbook()# 激活 worksheetws = wb.active# 设置表头ws.append(['时间','星级','评论'])col = ws.column_dimensions['A']  # 将时间列拓宽col.width = 20col = ws.column_dimensions['C']  # 将评论列拓宽col.width = 140getdata()wb.save('用户评价信息.csv')

获取的时间,星级,评论数据

pandas分家,划分为时间表和星级表

import pandas as pd  #引入pandas函数并as为pd以便后续调用df = pd.read_csv('用户评价信息.csv',encoding='utf-8')  #读取数据,将数据储存进data中df.columns = ['时间','星级','评论']res = df.groupby('时间').count()
res.to_csv('时间表.csv')
print(res)res = df.groupby('星级').count()
res.to_csv('星级表.csv')
print(res)

乱码问题是由于Excel打开格式问题,在程序中由UTF-8一统江山,不存在乱码问题

时间表

星级表

如下为UTF-8编码下内容

星级,时间,评论
力荐,319,319
很差,30,30
推荐,40,40
较差,30,30
还行,37,37

可视化分析

要求将爬取的数据存放在文件中,且实现对数据的可视化分析,包括:

1、 评论日期

按照日期统计评论次数;

源代码:

import numpy as np  # 引入numpy函数并as为np以便后续调用
import pandas as pd  # 引入pandas函数并as为pd以便后续调用
import matplotlib.pyplot as plt  # 引入matplotlib.pyplot函数并as为plt以便后续调用plt.rcParams['font.sans-serif'] = ['KaiTi']  # 指定默认字体
df = pd.read_csv('时间表.csv', encoding='utf-8')  # 读取数据,将数据储存进data中df.columns = ['时间', '星级', '评论']
df['date'] = pd.to_datetime(df['时间'])  # 将数据类型转换为日期类型fig = plt.figure(figsize=(30, 16))  # 设置画布大小
plt.plot(df['date'], df['评论'])  # 分辨率的折线图
plt.xticks(df['date'])
plt.xlabel('发  布   日   期')  # 横坐标标注出发布日期
fig.autofmt_xdate()  # 自动旋转
plt.ylabel('评  论   数   量')  # 纵坐标标注出评论数量
plt.savefig('.\时间折线图01.jpg')  # 保存本次图形
plt.show()  # 输出本次图形

时间折线图01

2、 评论时间

按照评论时间段统计评论数量

import pandas as pd  # 引入pandas函数并as为pd以便后续调用
import matplotlib.pyplot as plt  # 引入matplotlib.pyplot函数并as为plt以便后续调用plt.rcParams['font.sans-serif'] = ['KaiTi']  # 指定默认字体
df = pd.read_csv('时间表.csv', encoding='utf-8')  # 读取数据,将数据储存进data中df.columns = ['时间', '星级', '评论']
df['date'] = pd.to_datetime(df['时间'])  # 将数据类型转换为日期类型
df = df.set_index('date')  # 将date设置为indexdf_period = df.resample('M').sum().to_period('M')print(df_period)
'''数据分析'''
df_period.to_csv('月份表.csv', encoding='utf-8')plt.rcParams['font.sans-serif'] = ['KaiTi']  # 指定默认字体
df = pd.read_csv('月份表.csv', encoding='utf-8')  # 读取数据,将数据储存进data中df.columns = ['date', '星级', '评论']fig = plt.figure(figsize=(15, 9))  # 设置画布大小
plt.bar(df['date'], df['评论'], width=0.5, color=['r', 'cyan', 'cornflowerblue', 'violet', 'tomato', 'orange'])  # 柱状图plt.xlabel('月份')  # 横坐标标注出发布日期plt.ylabel('评论数量')  # 纵坐标标注出评论数量
plt.title('评论数量月份统计图')  # 标题-评论数量月份统计图
plt.savefig('.\月份柱状图02.jpg')  # 保存本次图形
plt.show()  # 输出本次图形

月份柱状图02

3、 评论情绪。

豆瓣的评分是 5 星制,5 星是力荐,4 星是推荐,3 星是还行,2 星是较差,1 星是很差。

import pandas as pd  # 引入pandas函数并as为pd以便后续调用
import matplotlib.pyplot as plt  # 引入matplotlib.pyplot函数并as为plt以便后续调用plt.rcParams['font.sans-serif'] = ['KaiTi']  # 指定默认字体
df = pd.read_csv('星级表.csv', encoding='utf-8')  # 读取数据,将数据储存进data中df.columns = ['星级', '时间', '评论']fig = plt.figure(figsize=(15, 9))  # 设置画布大小
plt.bar(df['星级'], df['评论'], width=0.5, color=['gold', 'cyan', 'cornflowerblue', 'violet', 'tomato', 'orange'])  # 柱状图plt.xlabel('rating')  # 横坐标标注出ratingplt.ylabel('count')  # 纵坐标标注出count
plt.title('rating图')  # 标题-rating图
plt.savefig('.\\rating柱状图03.jpg')  # 保存本次图形
plt.show()  # 输出本次图形

rating柱状图03

4、 观众对角色的情绪类别统计

import re
import pandas as pd
import requests
import matplotlib.pyplot as plt
from openpyxl import load_workbookdef getroles():'''首先获取演员列表,即使是获取演员也依然要使用程序'''header = {"User-Agent": "","cookie": ""}url = 'https://movie.douban.com/subject/30228394/celebrities'r = requests.get(url, headers=header)data = r.textroles = re.findall("<span class=\"role\" title=\".* Actor\/Actress .*?\">.* Actor\/Actress \(.* ([\w\W]*?)\)<\/span>", data)# roles = ['陈独秀', '李大钊', '陈延年', '陈乔年', '蔡元培', '胡适', '鲁迅', '周恩来', '高君曼', '陈鹤年', '易群先', '柳眉'rvalue = [0] * len(roles)droles = zip(roles, rvalue)return dict(droles)def rolesana(roles):role_names = list(roles.keys())print(role_names)# 打开文件及表wb = load_workbook('用户评价信息.xlsx')ws = wb["Sheet"]for index, row in enumerate(ws.rows):# 跳过表头,对于每一行有效数据,获取每一行的星级和评论,if index == 0:continue# 获取电影名称和演员列表rating, data = row[1].value, row[2].valuefor role_name in role_names:if rating == '力荐' and bool(re.findall(role_name, data)):roles[role_name] += 5elif rating == '推荐' and bool(re.findall(role_name, data)):roles[role_name] += 4elif rating == '还行' and bool(re.findall(role_name, data)):roles[role_name] += 3elif rating == '较差' and bool(re.findall(role_name, data)):roles[role_name] += 2elif rating == '很差' and bool(re.findall(role_name, data)):roles[role_name] += 1# 按字典集合中,每一个元组的第二个元素排列。roles = dict(sorted(roles.items(), key=lambda x: x[1], reverse=True))print(roles)role_df = pd.DataFrame(list(roles.values()), index=list(roles.keys()), columns=['得分'])role_df.to_csv("演员评价表.csv")if __name__ == '__main__':dc = getroles()rolesana(dc)plt.rcParams['font.sans-serif'] = ['KaiTi']  # 指定默认字体df = pd.read_csv('演员评价表.csv', encoding='utf-8')  # 读取数据,将数据储存进data中df.columns = ['角色', '得分']fig = plt.figure(figsize=(15, 9))  # 设置画布大小plt.bar(df['角色'], df['得分'], width=0.5,color=['gold', 'cyan', 'cornflowerblue', 'violet', 'tomato', 'orange'])  # 柱状图plt.xlabel('rating')  # 横坐标标注角色fig.autofmt_xdate()  # 自动旋转plt.ylabel('count')  # 纵坐标标注出得分plt.title('rating图')  # 标题-角色得分柱状图plt.savefig('.\\角色得分柱状图04.jpg')  # 保存本次图形plt.show()  # 输出本次图形

角色得分柱状图04

5、 单词云图

评论的文字进行分词,然后制作成一个词云,从词云中可以明显的看出文字出现的概率

和次数。

import wordcloudfrom openpyxl import load_workbook
'''别问为什么这样命名,不能与导入包命名冲突'''def read_data():data_sum = ''# 打开文件及表wb = load_workbook('用户评价信息.xlsx')ws = wb["Sheet"]for index, row in enumerate(ws.rows):# 跳过表头,对于每一行有效数据,获取每一行的电影名称和演员清单,if index == 0:continue# 获取电影名称和演员列表data = row[2].valueprint(data)data_sum = data_sum + ' ' + datafont = r'C:\Windows\Fonts\simfang.ttf'w = wordcloud.WordCloud(font_path=font,background_color='white',width=3840,height=2160,)w.generate(data_sum)w.to_file('wordcloud05.png')if __name__ == '__main__':read_data()

某电影词云图

百度百科

Python 来得到百度百科中某电影中所有演员的信息。

import reimport requests
from lxml import etree
import xlwt
import csv
import pandas as pddef get_info():global actor_information_dicturl = 'https://baike.baidu.com/item/%E8%A7%89%E9%86%92%E5%B9%B4%E4%BB%A3/20374146?fr=aladdin'headers = {'host': 'baike.baidu.com','Referer': 'https://baike.baidu.com/item/%E8%A7%89%E9%86%92%E5%B9%B4%E4%BB%A3/20374146?fr=aladdin','user-agent': '','cookie': 'zhishiTopicRequestTime= ''BAIKE_SHITONG='''}response = requests.get(url, headers=headers)response.encoding = 'utf-8'rsp = response.textelement = etree.HTML(rsp)links = element.xpath('/html/body/div[3]/div[2]/div/div[1]/div[31]/ul/li')# 获取角色信息role_name = []role_description = []for link in links:role_name.append("".join(link.xpath('dl/dt/div[1]/span/text()')))role_description.append("".join(link.xpath('dl/dd/p/text()')))# 获取收视率信息links = element.xpath('/html/body/div[3]/div[2]/div/div[1]/table[4]/tr')data = []dongfang_rating = []zhejiang_rating = []for link in links[2:]:data.append("".join(link.xpath('td[1]/div/text()')))dongfang_rating.append("".join(link.xpath('td[2]/div/text()')))zhejiang_rating.append("".join(link.xpath('td[5]/div/text()')))zhejiang_rating_dict = zip(data, dongfang_rating)dongfang_rating_dict = zip(data, zhejiang_rating)print(dict(zhejiang_rating_dict))print(dict(dongfang_rating_dict))# 获取演员个人信息links = element.xpath('//*[@id="marqueeViewport_actor"]/ul/li/ul/li')for link in links:personal_url = "https://baike.baidu.com" + "".join(link.xpath('dl/dt/a/@href'))headers = {'host': 'baike.baidu.com','Referer': 'https://baike.baidu.com/item/%E8%A7%89%E9%86%92%E5%B9%B4%E4%BB%A3/20374146?fr=aladdin','user-agent': '','cookie': 'zhishiTopicRequestTime= ''BAIKE_SHITONG=%7B%22data%22%3A'''}new_response = requests.get(personal_url, headers=headers)new_response.encoding = 'utf-8'new_rsp = new_response.textelement = etree.HTML(new_rsp)dt_links = element.xpath('//div[@class="basic-info J-basic-info cmn-clearfix"]/dl/dt')dd_links = element.xpath('//div[@class="basic-info J-basic-info cmn-clearfix"]/dl/dd')actor_information_dt = []actor_information_dd = []for dt_link in dt_links:information_dt = "".join(dt_link.xpath('text()')).replace("\xa0", "")actor_information_dt.append(information_dt)for dd_link in dd_links:information_dd = "".join(dd_link.xpath('.//text()'))information_dd = re.sub("\\xa0|\\n|\[.*?\]", "", information_dd)actor_information_dd.append(information_dd)actor_information_dict = zip(actor_information_dt, actor_information_dd)print(dict(actor_information_dict))if __name__ == '__main__':get_info()

获得如下字典

    {}
{}
{'中文名': '张桐', '外文名': 'Tong Zhang', '国籍': '中国', '民族': '汉族', '出生地': '天津市', '出生日期': '1981年8月26日', '星座': '处女座', '血型': 'O型', '身高': '183 cm', '毕业院校': '南开大学(本科);法国里昂艺术戏剧学院(研究生)', '职业': '演员', '经纪公司': '柠檬星盛(北京)影视文化传媒有限公司', '代表作品': '亮剑、绝命后卫师、觉醒年代、欢天喜地七仙女、绝密使命', '主要成就': '2018年第31届中国电视剧飞天奖优秀男演员奖'}
{'中文名': '于和伟', '外文名': 'Hewei Yu', '别名': '和和、皇叔、主公、于叔', '国籍': '中国', '民族': '回族', '出生地': '辽宁省抚顺市东洲区', '出生日期': '1971年5月4日', '星座': '金牛座', '血型': 'A型', '身高': '179 cm', '体重': '70 kg', '毕业院校': '上海戏剧学院', '职业': '演员', '经纪公司': '于和伟工作室', '代表作品': '悬崖之上、三国、大军师司马懿之军师联盟、猎毒人、刑警队长、决胜法庭、巡回检察组、刺杀小说家、觉醒年代、建军大业', '主要成就': '第31届中国电影金鸡奖最佳男配角第24届上海电视节白玉兰奖最佳男配角奖第15届上海电视白玉兰奖最佳男演员提名第31届中国电视剧飞天奖优秀男演员奖提名第17届华鼎奖中国当代题材电视剧最佳男演员奖展开主要成就第31届中国电影金鸡奖最佳男配角第24届上海电视节白玉兰奖最佳男配角奖第15届上海电视白玉兰奖最佳男演员提名第31届中国电视剧飞天奖优秀男演员奖提名第17届华鼎奖中国当代题材电视剧最佳男演员奖第27届上海电视节-白玉兰奖最佳男主角奖收起'}
{}
{'中文名': '夏德俊', '外文名': 'Dejun Xia', '民族': '汉族', '出生地': '辽宁省沈阳市', '出生日期': '1981年7月2日', '星座': '巨蟹座', '血型': 'A型', '身高': '179 cm', '体重': '68 kg', '毕业院校': '北京广播学院(中国传媒大学)', '职业': '演员', '经纪公司': '夏德俊工作室', '代表作品': '新不了情、守望幸福', '主要成就': '2011年最受观众喜爱男演员'}
{'中文名': '马少骅', '别名': '马绍骅马少华', '国籍': '中国', '民族': '回族', '出生地': '贵州', '出生日期': '1955年9月23日', '星座': '处女座', '身高': '172 cm', '毕业院校': '上海戏剧学院', '职业': '演员', '经纪公司': '北京艾沃文化传媒有限公司', '代表作品': '走向共和、辛亥革命、历史转折中的邓小平、生存之民工、搭错车、沂蒙、外科风云', '主要成就': '第21届上海电视节杰出贡献奖第18届北京影视春燕奖最佳男主角奖中国电视好演员男演员奖第29届中国电视剧飞天奖优秀男演员奖提名'}
{'中文名': '朱刚日尧', '国籍': '中国', '民族': '白族', '出生地': '贵州安顺', '出生日期': '8月30日', '星座': '处女座', '血型': 'B型', '身高': '181 cm', '体重': '71 kg', '毕业院校': '中国戏曲学院,中央戏剧学院', '职业': '演员', '代表作品': '孔子春秋、离婚律师、我心灿烂、等你爱我', '主要成就': '第九届全军文艺汇演一等奖'}
{'中文名': '张晚意', '国籍': '中国', '民族': '汉族', '出生地': '湖北省十堰市', '出生日期': '1994年4月22日', '星座': '金牛座', '毕业院校': '北京电影学院', '职业': '演员', '代表作品': '觉醒年代风起霓裳我的真朋友极品模王'}
{'中文名': '马启越', '外文名': 'Qiyue Ma', '国籍': '中国', '出生地': '山东济南', '出生日期': '2004年3月25日', '星座': '白羊座', '职业': '演员', '经纪公司': '北京德漾娱乐文化传媒有限公司', '代表作品': '泰拉星环、少帝康熙、觉醒年代、再见少年'}
{'中文名': '曹磊', '别名': 'caoleiyy(曾用名)', '国籍': '中国', '民族': '回族', '出生地': '北京', '出生日期': '1977年10月8日', '星座': '天秤座', '血型': 'A型', '身高': '182 cm', '体重': '70 kg', '毕业院校': '中央戏剧学院1999级音乐剧本科', '职业': '影视演员', '代表作品': '松花江上、玉碎、大路上、香水佳人', '主要成就': '2018年获得中国电视好演员 2018年公益电影《我在你身边》特殊贡献'}
...

Python数据获取及分析 获取豆瓣电影 评论 星级 时间相关推荐

  1. 一个实战案例带你走完python数据分析全流程:豆瓣电影评论的关键词云图制作

    用python做数据处理流程大致可以分成以下三个部分: 一.数据的获取:一般可以有公开的数据集.网络爬虫.自己整理等方式. 二.数据的处理:包括数据的预处理.数据的查找/筛选/排序/统计等操作. 三. ...

  2. python爬取豆瓣电影评论_python 爬取豆瓣电影评论,并进行词云展示及出现的问题解决办法...

    def getHtml(url): """获取url页面""" headers = {'User-Agent':'Mozilla/5.0 ( ...

  3. Python豆瓣电影评论的爬取及词云显示

    Python豆瓣电影评论的爬取及词云显示 课程设计论文链接 前言 开发工具.核心库 系统相关技术介绍 系统分析与设计 系统功能模块组成 实现功能和目标 爬取模块设计 爬取过程中下一页的处理 窗口界面设 ...

  4. Python实现可视化界面多线程豆瓣电影信息爬虫,并绘制统计图分析结果

    完整代码见链接:https://github.com/kuronekonano/python_scrapy_movie 实现时使用图形界面.多线程.文件操作.数据库编程.网络编程.统计绘图六项技术. ...

  5. Python爬虫之豆瓣电影评论数据的爬取(十四)

    原创不易,转载前请注明博主的链接地址:Blessy_Zhu https://blog.csdn.net/weixin_42555080 本次代码的环境: 运行平台: Windows Python版本: ...

  6. Python爬取豆瓣电影评论数据(通用模板代码)----以《中国医生》为例

    中国医生豆瓣电影评论获取 1 前言 2 数据源分析 3数据爬取(代码实现) 4 结果展示 1 前言   豆瓣是影迷评分.非视频网站,也非购票平台,能长期专门使用豆瓣标记.评价电影的,相对来说是属于影迷 ...

  7. Python爬虫爬取豆瓣电影评论内容,评论时间和评论人

    Python爬虫爬取豆瓣电影评论内容,评论时间和评论人 我们可以看到影评比较长,需要展开才能完整显示.但是在网页源码中是没有显示完整影评的.所以我们考虑到这部分应该是异步加载的方式显示.所以打开网页的 ...

  8. 【Python练习】如何使用Pandas获取“豆瓣电影”相关数据,并生成Excel表格

    使用Python获取"豆瓣电影"相关数据,并生成Excel表格 本文使用了requests和pandas第三方库,对豆瓣电影各相关数据进行爬取,并记录至Excel表格内.但发现存在 ...

  9. Scrapy 框架获取豆瓣电影的信息(包括图片)和电影评论-1

    文章目录 一.项目目录 二.定义爬取结果存储的数据结构(items.py) 电影信息 评论信息 三.爬取到结果后的处理类(spiders 文件夹) 电影信息(movieInfo.py) 评论信息(co ...

  10. python爬虫实例教程之豆瓣电影排行榜--python爬虫requests库

    我们通过requests库进行了简单的网页采集和百度翻译的操作,这一节课我们继续进行案例的讲解–python爬虫实例教程之豆瓣电影排行榜,这次的案例与上节课案例相似,同样会涉及到JSON模块,异步加载 ...

最新文章

  1. python第九章:面向对象--小白博客
  2. 事件相机角点检测,从原理到demo
  3. 8. An Introduction to MCMC for Machine Learning (1)
  4. python_day10_并发编程
  5. Boostrap的按钮下拉菜单
  6. FastDFS整合SpringBoot - 实现service
  7. 用java写了一个汉诺塔
  8. struts2的国际化(即实现网站整体中英文切换)实例
  9. fp算法例题_大部分人都理解错了的FPgrowth算法
  10. NS2中认知无线电仿真
  11. svn往分支提代码_SVN建立分支和合并代码
  12. Java高并发编程详解系列-Volatile关键字
  13. 免费视频素材下载(不定时更新)
  14. Photoshop栅格化图层到底什么意思,什么时候该用栅格化涂层
  15. 人民币金额由阿拉伯数值转换成汉字大写数值的函数
  16. 在线流程图和思维导图开发技术详解(三)
  17. CI/CD——构建企业级Docker+Jenkins+Git+Harbor流水线自动化持续集成持续发布平台
  18. pyqt制作深度学习训练软件
  19. 何一凡2021年北京高考成绩查询,北京市2021年第一次高中学考成绩查询时间:分数什么时候出...
  20. 网络推广除了SEO优化还有这些方法你知道吗?

热门文章

  1. <Safari浏览器插件>使json代码能格式化显示
  2. 数据结构——“队列 队列的应用“ 详细图解和代码示例 (没更新完)
  3. 样条插值(Spline)
  4. 数据整理——大数据治理的关键技术
  5. 配置微软Azure Kinect DK 录制器k4arecorder
  6. Unity 实现两个向量夹角为0~360度
  7. 单细胞测序对于医学的意义
  8. 区块链骇客第二讲: 自毁攻击
  9. 硬件木马检测方法概述
  10. asp.net2.0(C#)图像处理类[转]