Python数据获取及分析 获取电影评论星级时间
豆瓣
本任务使用 Python *获取豆瓣网中某电影下所有的评论,进行分析,从观众的角度*了解这部电视剧。
数据获取
使用如下脚本获取时间,星级,评论 正则表达式可在此处测试正则表达式可视化工具和正则表达式调试工具
import requests
import re
from openpyxl import Workbook
def 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_url2
print("正在进行第{}页评论获取网址{}".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 += comment
if __name__ == '__main__':
# 实例化
wb = Workbook()
# 激活 worksheet
ws = wb.active
# 设置表头
ws.append(['时间','星级','评论'])
col = ws.column_dimensions['A'] # 将时间列拓宽
col.width = 20
col = ws.column_dimensions['C'] # 将评论列拓宽
col.width = 140
getdata()
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设置为index
df_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') # 横坐标标注出rating
plt.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_workbook
def getroles():
'''
首先获取演员列表,即使是获取演员也依然要使用程序
'''
header = {
"User-Agent": "",
"cookie": ""
}
url = 'https://movie.douban.com/subject/30228394/celebrities'
r = requests.get(url, headers=header)
data = r.text
roles = 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].value
for role_name in role_names:
if rating == '力荐' and bool(re.findall(role_name, data)):
roles[role_name] += 5
elif rating == '推荐' and bool(re.findall(role_name, data)):
roles[role_name] += 4
elif rating == '还行' and bool(re.findall(role_name, data)):
roles[role_name] += 3
elif rating == '较差' and bool(re.findall(role_name, data)):
roles[role_name] += 2
elif 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 wordcloud
from 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].value
print(data)
data_sum = data_sum + ' ' + data
font = 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 re
import requests
from lxml import etree
import xlwt
import csv
import pandas as pd
def get_info():
global actor_information_dict
url = '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.text
element = 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.text
element = 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年公益电影《我在你身边》特殊贡献'}
...