Python数据获取及分析 获取电影评论星级时间
豆瓣
本任务使用 Python 来获取豆瓣网中某电影下所有的评论,进行分析,从观
众的角度来了解这部电视剧。
数据获取
使用如下脚本获取时间,星级,评论
正则表达式可在此处测试正则表达式可视化工具和正则表达式调试工具
import requestsimport refrom openpyxl import Workbookdef getdata():header = {# F12查看"User-Agent": "","cookie": ""}original_url = '/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') # 纵坐标标注出countplt.title('rating图') # 标题-rating图plt.savefig('.\\rating柱状图03.jpg') # 保存本次图形plt.show() # 输出本次图形
rating柱状图03
4、 观众对角色的情绪类别统计
import reimport pandas as pdimport requestsimport matplotlib.pyplot as pltfrom openpyxl import load_workbookdef getroles():'''首先获取演员列表,即使是获取演员也依然要使用程序'''header = {"User-Agent": "","cookie": ""}url = '/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 requestsfrom lxml import etreeimport xlwtimport csvimport pandas as pddef get_info():global actor_information_dicturl = '/item/%E8%A7%89%E9%86%92%E5%B9%B4%E4%BB%A3/20374146?fr=aladdin'headers = {'host': '','Referer': '/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 = "" + "".join(link.xpath('dl/dt/a/@href'))headers = {'host': '','Referer': '/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', '毕业院校': '南开大学(本科);法国里昂艺术戏剧学院(研究生)', '职业': '演员', '经纪公司': '柠檬星盛(北京)影视文化传媒有限公司', '代表作品': '亮剑、绝命后卫师、觉醒年代、欢天喜地七仙女、绝密使命', '主要成就': '第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', '毕业院校': '北京广播学院(中国传媒大学)', '职业': '演员', '经纪公司': '夏德俊工作室', '代表作品': '新不了情、守望幸福', '主要成就': '最受观众喜爱男演员'}{'中文名': '马少骅', '别名': '马绍骅马少华', '国籍': '中国', '民族': '回族', '出生地': '贵州', '出生日期': '1955年9月23日', '星座': '处女座', '身高': '172 cm', '毕业院校': '上海戏剧学院', '职业': '演员', '经纪公司': '北京艾沃文化传媒有限公司', '代表作品': '走向共和、辛亥革命、历史转折中的邓小平、生存之民工、搭错车、沂蒙、外科风云', '主要成就': '第21届上海电视节杰出贡献奖第18届北京影视春燕奖最佳男主角奖中国电视好演员男演员奖第29届中国电视剧飞天奖优秀男演员奖提名'}{'中文名': '朱刚日尧', '国籍': '中国', '民族': '白族', '出生地': '贵州安顺', '出生日期': '8月30日', '星座': '处女座', '血型': 'B型', '身高': '181 cm', '体重': '71 kg', '毕业院校': '中国戏曲学院,中央戏剧学院', '职业': '演员', '代表作品': '孔子春秋、离婚律师、我心灿烂、等你爱我', '主要成就': '第九届全军文艺汇演一等奖'}{'中文名': '张晚意', '国籍': '中国', '民族': '汉族', '出生地': '湖北省十堰市', '出生日期': '1994年4月22日', '星座': '金牛座', '毕业院校': '北京电影学院', '职业': '演员', '代表作品': '觉醒年代风起霓裳我的真朋友极品模王'}{'中文名': '马启越', '外文名': 'Qiyue Ma', '国籍': '中国', '出生地': '山东济南', '出生日期': '3月25日', '星座': '白羊座', '职业': '演员', '经纪公司': '北京德漾娱乐文化传媒有限公司', '代表作品': '泰拉星环、少帝康熙、觉醒年代、再见少年'}{'中文名': '曹磊', '别名': 'caoleiyy(曾用名)', '国籍': '中国', '民族': '回族', '出生地': '北京', '出生日期': '1977年10月8日', '星座': '天秤座', '血型': 'A型', '身高': '182 cm', '体重': '70 kg', '毕业院校': '中央戏剧学院1999级音乐剧本科', '职业': '影视演员', '代表作品': '松花江上、玉碎、大路上、香水佳人', '主要成就': '获得中国电视好演员 公益电影《我在你身边》特殊贡献'}...