最近在微博热搜上看了很多关于《少年的你》的信息,上映7天票房达到了8.72亿,在猫眼上的评分9.5分。这部剧原计划在6月27日上映,由于广电总局的种种限制,推迟到了9月25日上映。该剧的导演是曾国祥,《七月与安生》也是他指导的,当时小马哥和冬雨也是凭这部电影获得了影后的称呼。该剧的主演是冬雨和易洋千玺,这两个都是我很喜欢的演员,冬雨的演技也是我们有所目睹的,毕竟是影后。对于千玺,我之前只是喜欢听他的歌和喜欢他的颜❤️,这次通过看影评,广大群众还是被他的演技折服了。
我利用最近一直子学习的爬虫从豆瓣上爬取了220条影评和评星数进行分析,下面我会贴上我的代码,希望可以和大家一起交流学习。
1.使用爬虫获取豆瓣上的影评、星级及点赞数
利用BeautifulSoup和正则表达式获取豆瓣上我需要的信息,并将这些信息保存到csv中,代码如下:
'''
1.获取少年的你的影评,存成在csv
2.获取评星数和点赞数
3。统计评星1-5,及或赞数,绘制图形
4。对影评进行分析,制作词云
'''
from bs4 import BeautifulSoup
import re
import requests
from requests.exceptions import RequestException
import csv
from matplotlib import pyplot as plt
#判断网络连接是否异常
def judge_html(url):
try:
reponse=requests.get(url)
if reponse.status_code==200: #判断网页连接状态是否正确
return reponse.text
else:
return None
except RequestException:
return None
def spidercomment(urltxt):
#使用BeautifulSoup解析网页
soup=BeautifulSoup(urltxt,'html.parser')
item={'cmt_star':'0'}
votes1={'vote':'0'}
for j in range(20):
commentlist=soup.find_all('span',{'class':'short'})#爬取影评
#保存到csv中
# print(commentlist[0].text)
a=commentlist[j].text
with open('comment.csv','a',encoding='utf-8') as cfile:
cfile.write(a)
cfile.write('\n')
votes=soup.find_all('span',class_="votes")#获取点赞数
#votes['vote']=votes[j].string
votes2=votes[j].text
#print(votes2)
commentsList2 = soup.find_all('span', class_=re.compile(r'allstar')) # 获取获赞数
#print(commentsList2[0]['title'])
if commentsList2[0]['title'] == '力荐':
item['cmt_star'] = '5'
elif commentsList2[0]['title'] == '较差':
item['cmt_star'] = '2'
elif commentsList2[0]['title'] == '还行':
item['cmt_star'] = '3'
elif commentsList2[0]['title'] == '推荐':
item['cmt_star'] = '4'
else:
item['cmt_star'] = '1'
with open('vote.csv','a',encoding='utf-8') as vfile:
vfile.write(item['cmt_star'])
vfile.write('\t')
vfile.write(votes2)
vfile.write('\n')
if __name__=='__main__':
id=30166972
for i in range(11):
start = i*20
url="https://movie.douban.com/subject/%s/comments?start=" \
"%s&limit=20&sort=new_score&status=P" %(id, start)
#print(url)
urltext=judge_html(url)
spidercomment(urltext)
print("爬虫结束")
2.数据清洗及绘制词云图
对获得的影评进行去除标点符号和空行,并将其保存成txt,利用jieba进行分词操作,获取出现频率最高的词语,绘制词云图。
import re # 正则表达式库
import collections # 词频统计库
import numpy as np # numpy数据处理库
import jieba # 结巴分词
import wordcloud # 词云展示库
from PIL import Image # 图像处理库
from PIL import ImageFont
import matplotlib.pyplot as plt # 图像展示库
# 1. 对于爬取的评论信息进行数据清洗(删除不必要的逗号, 句号, 表情, 只留下中文或者英文内容)
def clear():
with open('comment.csv') as f:
comments = f.read()
pattern = re.compile(r'([\u4e00-\u9fa5]+|[a-zA-Z]+)')
# 通过正则表达式实现
deal_comments = re.findall(pattern,comments)
newComments = ''
for item in deal_comments:
newComments += item
with open('commment1.txt','a',encoding='utf-8') as files:
files.write(newComments)
def couldword():
# 读取文件
fn = open('/Users/yuanli/PycharmProjects/TEST/commment1.txt') # 打开文件
string_data = fn.read() # 读出整个文件
fn.close() # 关闭文件
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']
# 文本预处理
pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|"') # 定义正则表达式匹配模式
string_data = re.sub(pattern, '', string_data) # 将符合模式的字符去除
# 文本分词
seg_list_exact = jieba.cut(string_data, cut_all=False) # 精确模式分词
object_list = []
remove_words = [u'一个', u'真的', u'就是', u'就是', u'随着', u'啊啊啊', u'其实', u'等', u'不得不', u'都', u'电影', u'也', u'人', u'中', u'在', u'了',
u'通常', u'如果', u'我们', u'需要',u'每个','电影院'] # 自定义去除词库
for word in seg_list_exact: # 循环读出每个分词
if word not in remove_words: # 如果不在去除词库中
if len(word)>2:
object_list.append(word) # 分词追加到列表
# 词频统计
word_counts = collections.Counter(object_list) # 对分词做词频统计
word_counts_top10 = word_counts.most_common(80) # 获取前10最高频的词
print(word_counts_top10) # 输出检查
# 词频展示
mask = np.array(Image.open('/Users/yuanli/PycharmProjects/TEST/a.jpg')) # 定义词频背景(背景)
mask1 = np.array(Image.open('/Users/yuanli/PycharmProjects/TEST/timg.jpg')) # 定义词频背景(字体颜色)
wc = wordcloud.WordCloud(
font_path='/Users/yuanli/PycharmProjects/TEST/arial unicode ms.ttf', # 设置字体格式
mask=mask, # 设置背景图
min_font_size=6,
max_words=80, # 最多显示词数
max_font_size=60 # 字体最大值
)
wc.generate_from_frequencies(word_counts) # 从字典生成词云
image_colors = wordcloud.ImageColorGenerator(mask1) # 从背景图建立颜色方案
wc.recolor(color_func=image_colors) # 将词云颜色设置为背景图方案
plt.imshow(wc) # 显示词云
plt.axis('off') # 关闭坐标轴
plt.show() # 显示图像
if __name__=='__main__':
clear()
couldword()
选择大于2个字的影评进行绘制词云图:
从词云图上可以看出这是一部青春片,讲述的应该是青少年之间的故事,很多人评价说这部剧是值得一看的,这部剧还是很有现实意义的,值得我们去影院去观看。
3.星级及点赞数
通过上面两个图表,我们可以看出绝大多数的观众都给了4分及以上的星级,对于四星级的点赞数也是最高的,由此我们可以推测这部剧还是值得一看的。
4.知识点